Java 復(fù)制、壓縮PDF文檔

在日常辦公中介蛉,掌握對(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();

}

}

壓縮效果:

(本文完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗜愈,一起剝皮案震驚了整個(gè)濱河市旧蛾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蠕嫁,老刑警劉巖锨天,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拌阴,居然都是意外死亡绍绘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)迟赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陪拘,“玉大人,你說(shuō)我怎么就攤上這事纤壁∽蠊簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酌媒,是天一觀的道長(zhǎng)欠痴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秒咨,這世上最難降的妖魔是什么喇辽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雨席,結(jié)果婚禮上菩咨,老公的妹妹穿的比我還像新娘。我一直安慰自己陡厘,他們只是感情好抽米,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著糙置,像睡著了一般云茸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谤饭,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天标捺,我揣著相機(jī)與錄音,去河邊找鬼揉抵。 笑死宜岛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的功舀。 我是一名探鬼主播萍倡,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辟汰!你這毒婦竟也來(lái)了列敲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帖汞,失蹤者是張志新(化名)和其女友劉穎戴而,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翩蘸,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡所意,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扶踊。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泄鹏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秧耗,到底是詐尸還是另有隱情备籽,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布分井,位于F島的核電站车猬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尺锚。R本人自食惡果不足惜珠闰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘫辩。 院中可真熱鬧伏嗜,春花似錦、人聲如沸杭朱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧械。三九已至八酒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刃唐,已是汗流浹背羞迷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留画饥,地道東北人衔瓮。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抖甘,于是被迫代替她去往敵國(guó)和親热鞍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354