在日常辦公中介蛉,掌握對(duì)PDF文檔的操作能力尤為重要萌庆。在前文中我使用Java程序來(lái)演示過(guò)如何合并和拆分PDF文檔。本文將介紹如何復(fù)制和壓縮文檔币旧。通常復(fù)制文檔有兩種形式践险,一種是跨文檔復(fù)制,即將一個(gè)文檔復(fù)制到另一個(gè)文檔中;另一種則是在同一個(gè)文檔中進(jìn)行頁(yè)面復(fù)制。壓縮文檔也有兩個(gè)方式惧互,一種是直接壓縮文檔內(nèi)容;另一種則是通過(guò)壓縮文檔中的圖片來(lái)實(shí)現(xiàn)文檔大小的減少占遥。
使用工具:Free Spire.PDF for Java(免費(fèi)版)
Jar文件獲取及導(dǎo)入:
方法1:通過(guò)官網(wǎng)下載獲取jar包。解壓后將lib文件夾下的Spire.Pdf.jar文件導(dǎo)入Java程序输瓜。(如下圖)
方法2:通過(guò)maven倉(cāng)庫(kù)安裝導(dǎo)入瓦胎。具體安裝教程參見(jiàn)此網(wǎng)頁(yè)。
【示例1】復(fù)制文檔
Part 1 跨文檔復(fù)制
import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfMargins;
import com.spire.pdf.graphics.PdfTemplate;
import java.awt.*;
import java.awt.geom.Dimension2D;
public class Copy1 {
public static void main(String[] args) {
//加載兩個(gè)PDF文檔
PdfDocument pdf1 =new PdfDocument("C:\\Users\\Test1\\Desktop\\Pdf1.pdf");
PdfDocument pdf2 =new PdfDocument("C:\\Users\\Test1\\Desktop\\Pdf2.pdf");
//獲取Pdf1的第一頁(yè)尤揣,并根據(jù)頁(yè)面創(chuàng)建模板
PdfPageBase page = pdf1.getPages().get(0);
Dimension2D size = page.getSize();
PdfTemplate template = page.createTemplate();
//在Pdf2中第一頁(yè)位置插入從Pdf1中繪制的模板
pdf2.getPages().insert(0,size,new PdfMargins(0,0));
pdf2.getPages().get(0).getCanvas().drawTemplate(template,new Point(0,0));
//保存pdf2
pdf2.saveToFile("output/result1.pdf",FileFormat.PDF);
pdf2.dispose();
}
}
復(fù)制效果:
Part 2 在同一個(gè)文檔內(nèi)復(fù)制
import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfMargins;
import com.spire.pdf.graphics.PdfTemplate;
import java.awt.*;
import java.awt.geom.Dimension2D;
public class Copy2 {
public static void main(String[] args) {
//加載測(cè)試文檔
PdfDocument pdf =new PdfDocument("C:\\Users\\Test1\\Desktop\\File1.pdf");
//獲取第一頁(yè)搔啊,并將于頁(yè)面創(chuàng)建模板
PdfPageBase page = pdf.getPages().get(0);
Dimension2D size = page.getSize();
PdfTemplate template = page.createTemplate();
//在文檔末循環(huán)添加兩張繪制好的頁(yè)面模板
for(int i=0; i<2; i++){
page = pdf.getPages().add(size,new PdfMargins(0));
page.getCanvas().drawTemplate(template,new Point(0,0));
}
//在第一頁(yè)插入一張繪制好的頁(yè)面模板
pdf.getPages().insert(0,size,new PdfMargins(0,0));
pdf.getPages().get(0).getCanvas().drawTemplate(template,new Point(0,0));
//保存文檔
pdf.saveToFile("output/result2.pdf",FileFormat.PDF);
}
}
復(fù)制效果:
【示例2】壓縮文檔
Part 1 壓縮文檔內(nèi)容
import com.spire.pdf.*;
public class CompressPDFContent {
public static void main(String[] args) {
//加載PDF示例文檔
PdfDocument document =new PdfDocument("C:\\Users\\Test1\\Desktop\\Sample.pdf");
//禁用incremental update
document.getFileInfo().setIncrementalUpdate(false);
//設(shè)置PDF文檔的壓縮級(jí)別
document.setCompressionLevel(PdfCompressionLevel.Best);
//保存并關(guān)閉文檔
document.saveToFile("output/CompressPDFcontent.pdf");
document.close();
}
}
壓縮效果:
Part 2 壓縮文檔中的圖片
首先提取原PDF文檔中的圖片,通過(guò)降低圖片質(zhì)量北戏,使圖片變小负芋,然后用縮小后的圖片替換原文檔中的圖片來(lái)減小PDF文檔的大小。
import com.spire.pdf.*;
import com.spire.pdf.exporting.PdfImageInfo;
import com.spire.pdf.graphics.PdfBitmap;
public class CompressPDFImage {
public static void main(String[] args) {
//加載PDF文檔
PdfDocument document =new PdfDocument("C:\\Users\\Test1\\Desktop\\Sample2.pdf");
//禁用incremental update
document.getFileInfo().setIncrementalUpdate(false);
//遍歷文檔所有頁(yè)面
for (int i =0; i < document.getPages().getCount(); i++) {
//提取頁(yè)面中的圖片
PdfPageBase page = document.getPages().get(i);
PdfImageInfo[] images = page.getImagesInfo();
if (images !=null && images.length >0)
//遍歷所有圖片
for (int j =0; j < images.length; j++) {
PdfImageInfo image = images[j];
PdfBitmap bp =new PdfBitmap(image.getImage());
//降低圖片的質(zhì)量
bp.setQuality(20);
//用壓縮后的圖片替換原文檔中的圖片
page.replaceImage(j, bp);
}
}
//保存并關(guān)閉文檔
document.saveToFile("output/CompressPDFImage.pdf");
document.close();
}
}
壓縮效果:
(本文完)