最新国产好看的视频,伊人天堂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,每種方式都有其對應(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());
        ) {
            // 頁面大綱(1級)
            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());

            // 更新總頁碼
            totalPage += document.getNumberOfPages();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("合并pdf失敗:{}",e);
            throw new BaseException("文件不存在:" + sourcePdf.getFilePath());
        }
        log.info("結(jié)束添加,添加后,總{}頁:{},耗費(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à)格不菲,無授權(quán)會有水印,雖然e-iceblue有免費(fèi)的spire.pdf.free但有頁數(shù)限制。

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

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

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

相關(guān)文章

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

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

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

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

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

    elasticsearch集群cluster示例詳解

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

    JAVA Vector源碼解析和示例代碼

    本文的學(xué)習(xí)方式是先對JAVA Vector有個(gè)整體認(rèn)識,然后再學(xué)習(xí)它的源碼,最后再通過實(shí)例來學(xué)會使用。
    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)存問題、優(yōu)化JVM性能和編寫高性能代碼,本文介紹java內(nèi)存區(qū)域的相關(guān)知識,感興趣的朋友一起看看吧
    2025-12-12
  • Java通過賣票理解多線程

    Java通過賣票理解多線程

    本文主要介紹了一個(gè)多線程賣票的例子,通過賣票這個(gè)實(shí)例來介紹多線程的方式,加深理解,需要的朋友可以參考下
    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)常用的算法操作,這些算法是排序,填充,移位和查找等。本文將通過示例為大家詳細(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

最新評論

什邡市| 通道| 赞皇县| 信丰县| 马尔康县| 新干县| 温泉县| 新龙县| 社会| 措美县| 上饶市| 临邑县| 杭锦后旗| 湖南省| 蕲春县| 任丘市| 南开区| 横山县| 孟村| 盐城市| 濉溪县| 武定县| 五河县| 昌宁县| 鄂伦春自治旗| 寿宁县| 习水县| 伊春市| 建始县| 博白县| 眉山市| 沈阳市| 昌黎县| 云林县| 土默特左旗| 邛崃市| 大宁县| 黎平县| 徐州市| 黄冈市| 保定市|