Java使用?Spire.PDF實(shí)現(xiàn)合并PDF文檔并進(jìn)行加密與壓縮處理
無論是需要將零散的業(yè)務(wù)報(bào)告匯總,還是將多份合同掃描件整合成一個(gè)文件,掌握合并 PDF 的技巧都是提升辦公效率的必備技能。本文將介紹如何在 Java 中使用 Spire.PDF 庫高效合并 PDF 文件。我們從基礎(chǔ)的文件合并出發(fā),進(jìn)階到特定頁面的提取合并,并針對(duì)合并過程中涉及的加密處理、體積壓縮等問題提供有效的解決方案。
環(huán)境準(zhǔn)備
在開始代碼實(shí)現(xiàn)之前,我們需要先搭建好開發(fā)環(huán)境。由于我們要處理復(fù)雜的 PDF 結(jié)構(gòu),Spire.PDF 作為一個(gè)穩(wěn)定且功能齊全的第三方庫可以極大提高效率。
你可以通過 Maven 倉庫輕松引入 Spire.PDF。在你的 pom.xml 文件中添加以下配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>12.4.4</version>
</dependency>
</dependencies>也可以下載安裝包,手動(dòng)將 Spire.PDF 添加到項(xiàng)目中。此外該組件還提供免費(fèi)版,適合用于小型項(xiàng)目。
在 Java 中合并 PDF 的兩種常見情景
在處理 PDF 合并時(shí),我們通常面臨兩種場景:一種是直接將幾個(gè)文檔頭尾相接;另一種則是像拼圖一樣,只提取每個(gè)文檔中的特定頁面進(jìn)行組合。下面我們針對(duì)兩種不同的情況分別來講解如何借助 Spire.PDF 來完成 PDF 組合。
快速合并多個(gè)完整 PDF 文檔
如果你手頭有幾個(gè)完整的 PDF 文件需要按順序連在一起,Spire.PDF 提供了一個(gè)非常高效的方法,只需一行核心代碼即可完成。
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfDocumentBase;
public class MergePdfs {
public static void main(String[] args) {
// 獲取待合并的PDF文檔路徑
String[] files = new String[] {"/示例文檔1.pdf", "/示例文檔2.pdf", "/示例文檔3.pdf"};
// 合并這些PDF文檔
PdfDocumentBase pdf = PdfDocument.mergeFiles(files);
// 保存合并后的PDF文件
pdf.save("/output/合并PDF文檔.pdf", FileFormat.PDF);
}
}

代碼步驟解析:
- 準(zhǔn)備數(shù)據(jù)源: 定義一個(gè)字符串?dāng)?shù)組,按順序存放所有需要合并的源文件路徑。
- 合并 PDF: 調(diào)用
PdfDocument.mergeFiles(files)方法。該方法會(huì)自動(dòng)按數(shù)組索引順序讀取文件并合并。 - 持久化保存: 調(diào)用
save()方法保存合并結(jié)果,并指定輸出格式為 PDF。
精確合并不同 PDF 文檔的指定頁面
在實(shí)際工作中,我們可能不需要整份文檔。例如,只需要 A 文檔的封面、B 文檔的正文以及 C 文檔的蓋章頁。這時(shí)候,我們需要通過頁面插入的方式來控制合并結(jié)果。
import com.spire.pdf.PdfDocument;
public class MergeSelectedPages {
public static void main(String[] args) {
// 獲取待合并的PDF文檔路徑
String[] files = new String[] {"Sample1.pdf", "Sample2.pdf", "Sample3.pdf"};
// 創(chuàng)建PdfDocument類型的數(shù)組
PdfDocument[] pdfs = new PdfDocument[files.length];
// 遍歷并加載文檔
for (int i = 0; i < files.length; i++) {
pdfs[i] = new PdfDocument(files[i]);
}
// 創(chuàng)建一個(gè)新的PDF文檔容器
PdfDocument pdf = new PdfDocument();
// 將不同PDF中的指定頁面插入到新PDF中
pdf.insertPage(pdfs[0], 0); // 插入第一個(gè)文件的第1頁
pdf.insertPageRange(pdfs[1], 1, 3); // 插入第二個(gè)文件的第2到4頁
pdf.insertPage(pdfs[2], 0); // 插入第三個(gè)文件的第1頁
// 保存合并后的PDF文件
pdf.saveToFile("合并指定頁面.pdf");
}
}

代碼步驟解析:
- 加載源文件: 通過循環(huán)遍歷數(shù)組,為每一個(gè)源文件創(chuàng)建一個(gè)
PdfDocument實(shí)例。 - 初始化容器: 創(chuàng)建一個(gè)新的
PdfDocument對(duì)象pdf,用來存放合并結(jié)果。 - 按需提?。?/strong>
insertPage(sourceDoc, index):用于提取單頁(注意索引從 0 開始)。insertPageRange(sourceDoc, start, end):用于批量提取一個(gè)范圍內(nèi)的頁面,避免了寫循環(huán)的麻煩。
- 輸出結(jié)果: 最后調(diào)用
saveToFile()將合并后的結(jié)果保存為 PDF 文檔。
進(jìn)階實(shí)戰(zhàn)與避坑指南
學(xué)會(huì)了基礎(chǔ)合并邏輯后,你可能會(huì)在實(shí)際運(yùn)用時(shí)遇到一些棘手問題:比如文件加密了怎么辦?合并后的文件太大發(fā)不出去怎么辦?如何給合并后的文件統(tǒng)一標(biāo)識(shí)?本章將逐一攻克這些難點(diǎn)。
合并前的安全處理
如果源文檔受到密碼保護(hù),直接嘗試讀取會(huì)觸發(fā)異常。在合并這類文件前,必須先進(jìn)行解鎖操作。
// 使用密碼載入加密的PDF文檔
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("加密.pdf", "password");
// 解密文檔,確保后續(xù)合并操作不會(huì)因權(quán)限限制失敗
pdf.decrypt();
合并過程中的文件壓縮
多個(gè) PDF 合并后,體積往往會(huì)成倍增長。為了節(jié)省存儲(chǔ)空間和傳輸帶寬,我們可以利用 PdfCompressor 開啟內(nèi)容壓縮模式,這能顯著減小生成文件的體積。
import com.spire.pdf.conversion.compression.PdfCompressor;
// 針對(duì)合并后的成品進(jìn)行壓縮
PdfCompressor compressor = new PdfCompressor("示例.pdf");
// 啟用文檔內(nèi)容壓縮,移除不必要的元數(shù)據(jù)并優(yōu)化資源
compressor.getOptions().setCompressContents(true);
// 壓縮并保存
compressor.compressToFile("內(nèi)容壓縮.pdf");
為合并后的文檔添加統(tǒng)一水印
為了確保文檔的版權(quán)或合規(guī)性,合并后的文件通常需要覆蓋一層水印。我們可以遍歷最終文檔的所有頁面,統(tǒng)一繪制圖片水印。
// 循環(huán)遍歷所有頁面以插入水印
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
// 獲取頁面尺寸用于計(jì)算水印居中坐標(biāo)
float pageWidth = (float)page.getActualSize().getWidth();
float pageHeight = (float)page.getActualSize().getHeight();
// 設(shè)置水印圖片的透明度(0.0完全透明 - 1.0不透明)
page.getCanvas().setTransparency(0.3f);
// 在頁面中心位置繪制水印
page.getCanvas().drawImage(image, pageWidth/2 - imageWidth/2, pageHeight/2 - imageHeight/2, imageWidth, imageHeight);
}
結(jié)語
通過本文的介紹,我們可以看到,在 Java 中合并 PDF 不僅僅是簡單的頁面疊加,更涉及到權(quán)限管理、體積優(yōu)化和內(nèi)容二次加工等實(shí)際需求。借助 Spire.PDF 等成熟的工具庫,開發(fā)者可以用極少的代碼量實(shí)現(xiàn)復(fù)雜的文檔處理邏輯,顯著提升工作效率。
以上就是Java使用 Spire.PDF實(shí)現(xiàn)合并PDF文檔并進(jìn)行加密與壓縮處理的詳細(xì)內(nèi)容,更多關(guān)于Java合并PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java使用Spire.PDF for Java輕松實(shí)現(xiàn)合并PDF
- Java實(shí)現(xiàn)PDF批量處理之合并、拆分、加水印的技術(shù)方案與實(shí)踐
- Java基于Tabula實(shí)現(xiàn)PDF合并單元格內(nèi)容的提取
- Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF及合并PDF文件詳細(xì)教程
- Java使用itext5實(shí)現(xiàn)生成多個(gè)PDF并合并
- JAVA PDF操作之實(shí)現(xiàn)截取N頁和多個(gè)PDF合并
- Java合并PDF文檔的三種常用方式總結(jié)
- Java純代碼實(shí)現(xiàn)導(dǎo)出pdf合并單元格
相關(guān)文章
Java中StringBuilder與StringBuffer使用及源碼解讀
我們前面學(xué)習(xí)的String就屬于不可變字符串,因?yàn)槔碚撋弦粋€(gè)String字符串一旦定義好,其內(nèi)容就不可再被改變,但實(shí)際上,還有另一種可變字符串,包括StringBuilder和StringBuffer兩個(gè)類,那可變字符串有什么特點(diǎn),又怎么使用呢,接下來就請(qǐng)大家跟我一起來學(xué)習(xí)吧2023-05-05
Java中實(shí)現(xiàn)雙數(shù)組Trie樹實(shí)例
這篇文章主要介紹了Java中實(shí)現(xiàn)雙數(shù)組Trie樹實(shí)例,雙數(shù)組Trie就是一種優(yōu)化了空間的Trie樹,本文給出了實(shí)現(xiàn)代碼、測試代碼和測試結(jié)果,需要的朋友可以參考下2015-01-01
SpringBoot使用Validation校驗(yàn)參數(shù)的詳細(xì)過程
這篇文章主要介紹了SpringBoot使用Validation校驗(yàn)參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
SpringBoot事件機(jī)制相關(guān)知識(shí)點(diǎn)匯總
這篇文章主要介紹了SpringBoot事件機(jī)制相關(guān)知識(shí)點(diǎn)匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java將Object轉(zhuǎn)換為數(shù)組的代碼
這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個(gè)別人寫的工具類,這個(gè)工具類,主要是判空操作,包括集合、數(shù)組、Map等對(duì)象是否為空的操作,需要的朋友可以參考下2022-09-09
mybatis一對(duì)多兩種mapper寫法實(shí)例
這篇文章主要介紹了mybatis一對(duì)多兩種mapper寫法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
springboot本地調(diào)試沒問題,打包運(yùn)行報(bào)錯(cuò)原因及分析
這篇文章主要介紹了springboot本地調(diào)試沒問題,打包運(yùn)行報(bào)錯(cuò)原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

