Java使用PDFBox實(shí)現(xiàn)調(diào)整PDF每頁格式
maven依賴,這里使用的是pdfbox的2.0.30版本
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.30</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.30</version> </dependency>
一、內(nèi)容沒有圖片
如果內(nèi)容沒有圖片,可以直接將紙張改為A4大小
import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; public class AdjustPdfPageWidthToA4 { public static void main(String[] args) { // 輸入的PDF文件路徑 String inputFilePath = "input.pdf"; // 輸出的PDF文件路徑 String outputFilePath = "output.pdf"; try { // 加載PDF文件 PDDocument document = PDDocument.load(new File(inputFilePath)); // 遍歷每一頁 for (PDPage page : document.getPages()) { // 將頁面寬度調(diào)整為A4尺寸 page.setMediaBox(PDRectangle.A4); } // 保存修改后的PDF文件 document.save(outputFilePath); document.close(); System.out.println("PDF頁面寬度已調(diào)整為A4尺寸,并保存為新的PDF文件。"); } catch (IOException e) { e.printStackTrace(); } } }
但是如果有圖片的話,會(huì)出現(xiàn)圖片被截?cái)啵@示不全的情況出現(xiàn),所以我們需要對(duì)圖片元素按比例縮放
二、內(nèi)容有圖片
首先要對(duì)頁面內(nèi)容進(jìn)行判斷,如果頁面是圖片的話,對(duì)圖片進(jìn)行比例縮放,比如A4,就縮放到可以放進(jìn)A4
import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.text.PDFTextStripper; import javax.imageio.ImageIO; /** * @author zjy * @describe 調(diào)整PDF每頁為A4格式 */ public class AdjustPdfPageWidthToA4Util { static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf"; // 輸出的PDF文件路徑 static String outputFilePath = "D:\\result.pdf"; public static void main(String[] args) { try { // 加載PDF文件 PDDocument document = PDDocument.load(new File(inputFilePath)); // 遍歷每一頁 int totalPages = document.getNumberOfPages(); for (int i = 0; i < totalPages; i++) { // 獲取當(dāng)前Page頁面 PDPage page = document.getPage(i); // 獲取對(duì)應(yīng)頁面的資源對(duì)象 PDResources resources = page.getResources(); // 遍歷當(dāng)前頁面所有內(nèi)容,找出圖片對(duì)象 for (COSName cosName : resources.getXObjectNames()) { PDXObject pdxObject = resources.getXObject(cosName); // 判斷是不是圖片對(duì)象 if (pdxObject instanceof PDImageXObject) { // 獲取圖片對(duì)象 PDImageXObject pdxObject1 = (PDImageXObject) pdxObject; BufferedImage image = pdxObject1.getImage(); // 4、創(chuàng)建頁面內(nèi)容流,指定操作哪個(gè)文檔中的哪個(gè)頁面 PDPageContentStream stream = new PDPageContentStream(document, page); float[] imageWH = getImageWH(image, PDRectangle.A4); stream.drawImage(pdxObject1, imageWH[0], imageWH[1], imageWH[2], imageWH[3]); // 繪制圖片到PDF頁面里面 stream.close(); // 關(guān)閉頁面內(nèi)容流 page.setMediaBox(PDRectangle.A4); } else { page.setMediaBox(PDRectangle.A4); } } } // 保存修改后的PDF文件 document.save(outputFilePath); document.close(); System.out.println("PDF頁面寬度已調(diào)整為A4尺寸,并保存為新的PDF文件。"); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取圖片的寬度、高度,單位是【pt】 * * @param box PDF文檔頁面矩形區(qū)域?qū)ο螅梢垣@取到矩形區(qū)域的寬高 * @return 返回縮放之后的圖片寬高 */ public static float[] getImageWH(BufferedImage img, PDRectangle box) { try { // px 轉(zhuǎn)換成 pt 單位 float xAxis; float yAxis; int w = img.getWidth(); int h = img.getHeight(); float width = (float) (w * 3.0 / 4); // 這里是因?yàn)?1pt = 3/4 px,pt和px單位轉(zhuǎn)換 float height = (float) (h * 3.0 / 4); float pw = box.getWidth() - 60; // 設(shè)置圖片與文檔邊緣的空白間距 float ph = box.getHeight() - 60; // 設(shè)置圖片與文檔邊緣的空白間距 if (width > pw) { float scale = pw / width; // 縮放比列 width = pw; // 寬度等于頁面寬度 height = height * scale; // 高度自動(dòng)縮放 } else { float scale = ph / height; // 縮放比列 height = ph; // 高度等于頁面高度 width = width * scale; // 寬度自動(dòng)縮放 } // 計(jì)算圖片在X、Y軸上的顯示位置 xAxis = (box.getWidth() - width) / 2; // X軸居中對(duì)齊 // yAxis = box.getHeight() - height - 10; // 距離頁面頂部10個(gè)pt yAxis = (box.getHeight() - height) / 2; // Y軸垂直居中對(duì)齊 return new float[]{xAxis, yAxis, width, height}; } catch (Exception e) { e.printStackTrace(); } return new float[]{0, 0, 0, 0}; } }
運(yùn)行完如下圖所示,圖片縮小至能放入A4,放在正中間
三、改進(jìn)
上面的代碼是將圖片等比例縮小到A4能夠放得下,也就是上下或者左右可能有很大的空白,圖片比較小,難以看清,因此改進(jìn)
import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.text.PDFTextStripper; import javax.imageio.ImageIO; /** * @author zjy * @describe 調(diào)整PDF每頁為A4格式 */ public class AdjustPdfPageWidthToA4Util { static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf"; // 輸出的PDF文件路徑 static String outputFilePath = "D:\\result.pdf"; public static void main(String[] args) { try { // 加載PDF文件 PDDocument document = PDDocument.load(new File(inputFilePath)); // 遍歷每一頁 int totalPages = document.getNumberOfPages(); for (int i = 0; i < totalPages; i++) { // 獲取當(dāng)前Page頁面 PDPage page = document.getPage(i); // 獲取對(duì)應(yīng)頁面的資源對(duì)象 PDResources resources = page.getResources(); // 遍歷當(dāng)前頁面所有內(nèi)容,找出圖片對(duì)象 for (COSName cosName : resources.getXObjectNames()) { PDXObject pdxObject = resources.getXObject(cosName); // 判斷是不是圖片對(duì)象 if (pdxObject instanceof PDImageXObject) { // 獲取圖片對(duì)象 PDImageXObject pdxObject1 = (PDImageXObject) pdxObject; BufferedImage image = pdxObject1.getImage(); // 4、創(chuàng)建頁面內(nèi)容流,指定操作哪個(gè)文檔中的哪個(gè)頁面 PDPageContentStream stream = new PDPageContentStream(document, page); float[] imageWH = getImageWH(image, PDRectangle.A4); stream.drawImage(pdxObject1, 0, 0, imageWH[0], imageWH[1]); // 繪制圖片到PDF頁面里面 stream.close(); // 關(guān)閉頁面內(nèi)容流 // page.setMediaBox(PDRectangle.A4); page.setMediaBox(new PDRectangle(imageWH[0], imageWH[1])); } else { page.setMediaBox(PDRectangle.A4); } } } // 保存修改后的PDF文件 document.save(outputFilePath); document.close(); System.out.println("PDF頁面寬度已調(diào)整為A4尺寸,并保存為新的PDF文件。"); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取圖片的寬度、高度,單位是【pt】 * * @param box PDF文檔頁面矩形區(qū)域?qū)ο?,可以獲取到矩形區(qū)域的寬高 * @return 返回縮放之后的圖片寬高 */ public static float[] getImageWH(BufferedImage img, PDRectangle box) { try { // px 轉(zhuǎn)換成 pt 單位 float xAxis; float yAxis; int w = img.getWidth(); int h = img.getHeight(); float width = (float) (w * 3.0 / 4); // 這里是因?yàn)?1pt = 3/4 px,pt和px單位轉(zhuǎn)換 float height = (float) (h * 3.0 / 4); float pw = box.getWidth() ; float ph = box.getHeight() ; if (width > pw) { float scale = pw / width; // 縮放比列 width = pw; // 寬度等于頁面寬度 height = height * scale; // 高度自動(dòng)縮放 } else { float scale = ph / height; // 縮放比列 height = ph; // 高度等于頁面高度 width = width * scale; // 寬度自動(dòng)縮放 } // 計(jì)算圖片在X、Y軸上的顯示位置 return new float[]{width, height}; } catch (Exception e) { e.printStackTrace(); } return new float[]{0, 0}; } }
這樣子圖片的寬度是A4的,長度就是原圖片的長度了
以上內(nèi)容參考:Java使用PDFBox實(shí)現(xiàn)操作PDF文檔
到此這篇關(guān)于Java使用PDFBox實(shí)現(xiàn)調(diào)整PDF每頁格式的文章就介紹到這了,更多相關(guān)Java PDFBox調(diào)整PDF格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)
這篇文章主要介紹了Kotlin基礎(chǔ)教程之伴生對(duì)象,getter,setter,內(nèi)部,局部,匿名類,可變參數(shù)的相關(guān)資料,需要的朋友可以參考下2017-05-05Java中常用解析工具jackson及fastjson的使用
今天給大家?guī)淼氖顷P(guān)于Java解析工具的相關(guān)知識(shí),文章圍繞著jackson及fastjson的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06java設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)
下面小編就為大家?guī)硪黄猨ava設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05java中計(jì)算字符串長度的方法及u4E00與u9FBB的認(rèn)識(shí)
字符串采用unicode編碼的方式時(shí),計(jì)算字符串長度的方法找出UNICODE編碼中的漢字的代表的范圍“\u4E00” 到“\u9FBB”之間感興趣的朋友可以參考本文,或許對(duì)你有所幫助2013-01-01java token生成和校驗(yàn)的實(shí)例代碼
這篇文章主要介紹了java token生成和校驗(yàn)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別
這篇文章主要介紹了java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09