最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java合并PDF文檔的三種常用方式總結(jié)

 更新時(shí)間:2024年12月07日 10:32:15   作者:God_M  
這篇文章主要給大家介紹了關(guān)于Java合并PDF文檔的三種常用方式,文中介紹的方式分別是Apache?PDFBox、Spire.PDF(IceBlue)和iText?PDF,每種方式都有其對(duì)應(yīng)的pom.xml代碼示例,,要的朋友可以參考下

前言

Java常用的三種合并pdf的方式

合并PDF

1.pdfbox合并pdf

apache的pdfbox

pom.xml

 <dependency>
     <groupId>org.apache.pdfbox</groupId>
     <artifactId>pdfbox</artifactId>
     <version>2.0.26</version>
 </dependency>

代碼示例

// 添加待合并文件
for (ZipUtil.RelativeFile sourcePdf : fileRefers) {
   long time1 = System.currentTimeMillis();
   log.info("開始添加{}, 大?。簕}MB, 路徑:{}", (++index),
   FileUtils.newFile(sourcePdf.getFilePath()).length() / 1024 / 1024, sourcePdf.getFilePath());
   try (PDDocument document = PDDocument.load(FileUtils.newFile(sourcePdf.getFilePath()), MemoryUsageSetting.setupTempFileOnly());
        ) {
            // 頁(yè)面大綱(1級(jí))
            String newName = FileUtils.newFile(sourcePdf.getRelativePath()).getName();
            newName = StringUtils.trimToEmpty(newName).replace("." + FilenameUtils.getExtension(newName), "");
            PdfBoxBookmark boxData = new PdfBoxBookmark(newName, totalPage);

            PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
            if (outline != null) {
                buildBookMark(outline, boxData, totalPage);
            }
            /
            allBookList.add(boxData);

            mergePdf.addSource(sourcePdf.getFilePath());

            // 更新總頁(yè)碼
            totalPage += document.getNumberOfPages();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("合并pdf失敗:{}",e);
            throw new BaseException("文件不存在:" + sourcePdf.getFilePath());
        }
        log.info("結(jié)束添加,添加后,總{}頁(yè):{},耗費(fèi):{}秒",totalPage,
                sourcePdf.getFilePath(), (System.currentTimeMillis() - time1) / 1000);
    }

    // 設(shè)置合并后的pdf文件路徑
    mergePdf.setDestinationFileName(destFilePath);

    // 合并pdf
    try {
        mergePdf.setDocumentMergeMode(PDFMergerUtility.DocumentMergeMode.OPTIMIZE_RESOURCES_MODE);
        mergePdf.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
    } catch (IOException e) {
        e.printStackTrace();
        throw new BaseException("合并發(fā)生異常");
    }

2.spire.pdf

e-iceblue的spire.pdf

pom.xml

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf</artifactId>
    <version>9.5.6</version>
</dependency>

代碼示例:

String[] files = new String[] {
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\error-file.pdf",
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\111.pdf"};

//Merge documents and return an object of PdfDocumentBase
PdfDocumentBase pdf = PdfDocument.mergeFiles(files);

//Save the result to a PDF file
pdf.save("C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF222.pdf", FileFormat.PDF);

3.itextpdf

itextpdf

pom.xml

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.4</version>
</dependency>

代碼示例:

String[] pdfs = new String[] {
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0001.pdf",
                "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0002.pdf"};

String outputPdf = "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF333-.pdf"; // 合并后的PDF文件

try {
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPdf));
    document.open();

    for (String pdf : pdfs) {
        PdfReader reader = new PdfReader(pdf);
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            document.newPage();
            copy.addPage(copy.getImportedPage(reader, i));
        }
        reader.close();
    }

    document.close();
    System.out.println("PDFs merged successfully.");
} catch (Exception e) {
    e.printStackTrace();
}

總結(jié)

1.apache的pdfbox和itextpdf是免費(fèi)的,e-iceblue的spire.pdf是收費(fèi)的而且價(jià)格不菲,無(wú)授權(quán)會(huì)有水印,雖然e-iceblue有免費(fèi)的spire.pdf.free但有頁(yè)數(shù)限制。

2.apache的pdfbox和e-iceblue的spire.pdf對(duì)pdf文檔的容錯(cuò)不高,如果pdf文檔是通過(guò)三方軟件生成或編輯過(guò)的(可能會(huì)存在一定問(wèn)題,但是瀏覽器打開或wps打開會(huì)容錯(cuò)顯示),在合并時(shí)會(huì)拋文檔的異常。但是itextpdf會(huì)進(jìn)行容錯(cuò)修復(fù)并合并成功。

所以個(gè)人推薦使用itextpdf。

到此這篇關(guān)于Java合并PDF文檔的三種常用方式的文章就介紹到這了,更多相關(guān)Java合并PDF文檔方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java創(chuàng)建多線程服務(wù)器流程

    Java創(chuàng)建多線程服務(wù)器流程

    這篇文章主要介紹了Java創(chuàng)建多線程服務(wù)器流程,以下實(shí)例演示了如何使用Socket類的accept()方法和ServerSocket類的MultiThreadServer(socketname)方法來(lái)實(shí)現(xiàn)多線程服務(wù)器程序
    2023-05-05
  • Java的MyBatis框架中對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)SQL查詢的教程

    Java的MyBatis框架中對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)SQL查詢的教程

    這篇文章主要介紹了Java的MyBatis框架中對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)SQL查詢的教程,講解了MyBatis中一些控制查詢流程的常用語(yǔ)句,需要的朋友可以參考下
    2016-04-04
  • elasticsearch集群cluster示例詳解

    elasticsearch集群cluster示例詳解

    這篇文章主要為大家介紹了elasticsearch集群cluster示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • JAVA Vector源碼解析和示例代碼

    JAVA Vector源碼解析和示例代碼

    本文的學(xué)習(xí)方式是先對(duì)JAVA Vector有個(gè)整體認(rèn)識(shí),然后再學(xué)習(xí)它的源碼,最后再通過(guò)實(shí)例來(lái)學(xué)會(huì)使用。
    2013-11-11
  • JAVA內(nèi)存區(qū)域示例詳解

    JAVA內(nèi)存區(qū)域示例詳解

    Java內(nèi)存區(qū)域包括程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、堆、元空間和直接內(nèi)存,分別用于線程私有數(shù)據(jù)和線程共享數(shù)據(jù),理解這些區(qū)域有助于定位內(nèi)存問(wèn)題、優(yōu)化JVM性能和編寫高性能代碼,本文介紹java內(nèi)存區(qū)域的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-12-12
  • Java通過(guò)賣票理解多線程

    Java通過(guò)賣票理解多線程

    本文主要介紹了一個(gè)多線程賣票的例子,通過(guò)賣票這個(gè)實(shí)例來(lái)介紹多線程的方式,加深理解,需要的朋友可以參考下
    2017-09-09
  • Java枚舉類實(shí)現(xiàn)Key-Value映射的多種實(shí)現(xiàn)方式

    Java枚舉類實(shí)現(xiàn)Key-Value映射的多種實(shí)現(xiàn)方式

    在 Java 開發(fā)中,枚舉(Enum)是一種特殊的類,本文將詳細(xì)介紹 Java 枚舉類實(shí)現(xiàn) key-value 映射的多種方式,有需要的小伙伴可以根據(jù)需要進(jìn)行選擇
    2025-04-04
  • Java中的Collections類的使用示例詳解

    Java中的Collections類的使用示例詳解

    Collections類提供了一些靜態(tài)方法,這些方法能夠?qū)ist集合實(shí)現(xiàn)常用的算法操作,這些算法是排序,填充,移位和查找等。本文將通過(guò)示例為大家詳細(xì)講講Collections類的使用,需要的可以參考一下
    2022-12-12
  • java實(shí)現(xiàn)俄羅斯方塊小游戲

    java實(shí)現(xiàn)俄羅斯方塊小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)俄羅斯方塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)

    Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例)

    這篇文章主要介紹了Java圖像之自定義角度旋轉(zhuǎn)(實(shí)例),需要的朋友可以參考下
    2017-09-09

最新評(píng)論

顺平县| 铅山县| 错那县| 万宁市| 衡水市| 海丰县| 张家口市| 江阴市| 健康| 同德县| 外汇| 玉田县| 藁城市| 张家口市| 新兴县| 凌云县| 合山市| 二连浩特市| 甘孜县| 东平县| 额济纳旗| 绥芬河市| 昌都县| 循化| 漳平市| 孟村| 韶山市| 古丈县| 简阳市| 甘孜| 四川省| 濉溪县| 沾益县| 故城县| 甘孜县| 上蔡县| 清丰县| 新昌县| 蒙阴县| 府谷县| 新田县|