Java使用PDFBox實現(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();
}
}
}但是如果有圖片的話,會出現(xiàn)圖片被截斷,顯示不全的情況出現(xiàn),所以我們需要對圖片元素按比例縮放
二、內(nèi)容有圖片
首先要對頁面內(nèi)容進行判斷,如果頁面是圖片的話,對圖片進行比例縮放,比如A4,就縮放到可以放進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++) {
// 獲取當前Page頁面
PDPage page = document.getPage(i);
// 獲取對應頁面的資源對象
PDResources resources = page.getResources();
// 遍歷當前頁面所有內(nèi)容,找出圖片對象
for (COSName cosName : resources.getXObjectNames()) {
PDXObject pdxObject = resources.getXObject(cosName);
// 判斷是不是圖片對象
if (pdxObject instanceof PDImageXObject) {
// 獲取圖片對象
PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;
BufferedImage image = pdxObject1.getImage();
// 4、創(chuàng)建頁面內(nèi)容流,指定操作哪個文檔中的哪個頁面
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); // 這里是因為 1pt = 3/4 px,pt和px單位轉(zhuǎn)換
float height = (float) (h * 3.0 / 4);
float pw = box.getWidth() - 60; // 設置圖片與文檔邊緣的空白間距
float ph = box.getHeight() - 60; // 設置圖片與文檔邊緣的空白間距
if (width > pw) {
float scale = pw / width; // 縮放比列
width = pw; // 寬度等于頁面寬度
height = height * scale; // 高度自動縮放
} else {
float scale = ph / height; // 縮放比列
height = ph; // 高度等于頁面高度
width = width * scale; // 寬度自動縮放
}
// 計算圖片在X、Y軸上的顯示位置
xAxis = (box.getWidth() - width) / 2; // X軸居中對齊
// yAxis = box.getHeight() - height - 10; // 距離頁面頂部10個pt
yAxis = (box.getHeight() - height) / 2; // Y軸垂直居中對齊
return new float[]{xAxis, yAxis, width, height};
} catch (Exception e) {
e.printStackTrace();
}
return new float[]{0, 0, 0, 0};
}
}運行完如下圖所示,圖片縮小至能放入A4,放在正中間

三、改進
上面的代碼是將圖片等比例縮小到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++) {
// 獲取當前Page頁面
PDPage page = document.getPage(i);
// 獲取對應頁面的資源對象
PDResources resources = page.getResources();
// 遍歷當前頁面所有內(nèi)容,找出圖片對象
for (COSName cosName : resources.getXObjectNames()) {
PDXObject pdxObject = resources.getXObject(cosName);
// 判斷是不是圖片對象
if (pdxObject instanceof PDImageXObject) {
// 獲取圖片對象
PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;
BufferedImage image = pdxObject1.getImage();
// 4、創(chuàng)建頁面內(nèi)容流,指定操作哪個文檔中的哪個頁面
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); // 這里是因為 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; // 高度自動縮放
} else {
float scale = ph / height; // 縮放比列
height = ph; // 高度等于頁面高度
width = width * scale; // 寬度自動縮放
}
// 計算圖片在X、Y軸上的顯示位置
return new float[]{width, height};
} catch (Exception e) {
e.printStackTrace();
}
return new float[]{0, 0};
}
}這樣子圖片的寬度是A4的,長度就是原圖片的長度了

以上內(nèi)容參考:Java使用PDFBox實現(xiàn)操作PDF文檔
到此這篇關(guān)于Java使用PDFBox實現(xiàn)調(diào)整PDF每頁格式的文章就介紹到這了,更多相關(guān)Java PDFBox調(diào)整PDF格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security 自動踢掉前一個登錄用戶的實現(xiàn)代碼
這篇文章主要介紹了Spring Security 自動踢掉前一個登錄用戶的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
SpringBoot詳解實現(xiàn)自定義異常處理頁面方法
SpringBoot是Spring全家桶的成員之一,是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架2022-06-06
SpringBoot實現(xiàn)動態(tài)插拔的AOP的完整案例
在現(xiàn)代軟件開發(fā)中,面向切面編程(AOP) 是一種非常重要的技術(shù),能夠有效實現(xiàn)日志記錄、安全控制、性能監(jiān)控等橫切關(guān)注點的分離,在傳統(tǒng)的 AOP 實現(xiàn)中,切面邏輯往往是固定的,難以動態(tài)調(diào)整,本文將詳細探討如何利用 Spring Boot 實現(xiàn)動態(tài)插拔的 AOP,需要的朋友可以參考下2025-01-01
SpringBoot3.x集成nacos并實現(xiàn)多環(huán)境配置的操作步驟
本文詳細介紹了如何在Springboot3.x中集成Nacos2.x版本,包括nacos的安裝、配置更改,以及在集成過程中遇到的問題,如端口設置、依賴版本調(diào)整等,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-10-10

