pdfbox將多頁pdf轉成多張長圖片
阿新 • • 發佈:2018-12-19
首先需要說明的幾點事情
- 本文是基於pdfbox2.0以上版本實現的
- 主要實現功能是將多頁的pdf檔案轉成1張png或者jpg圖片,或者多張jpg圖片
- 本文是借鑑將多頁pdf轉成1張長圖片的方法修改
功能由來
最近專案要求能夠實現office(word, excel,ppt)等的線上預覽功能,思路是分2步走
- office元件轉pdf,即是先將office元件轉成pdf進行上傳
- pdf轉成長圖片,即是將pdf轉成長圖片的形式,便於操作
引入jar包
- 基於maven管理jar包的形式,如果沒有使用maven的話,也可以去pdfbox官網檢視
<dependency> <
下面貼上程式碼
- 這是將多頁(至少超過50)pdf轉換為多張長圖片的程式碼
- 至於轉成1張長圖片(png
public static void pdfToImage(String pdfPath) throws IOException {
try {
/*影象合併使用引數*/
// 定義寬度
int width = 0;
// 儲存一張圖片中的RGB資料
int[] singleImgRGB;
// 定義高度,後面用於疊加
int shiftHeight = 0;
//儲存每張圖片的畫素值
BufferedImage imageResult = null;
// 利用PdfBox生成影象
PDDocument pdDocument = PDDocument.load(new File(pdfPath));
PDFRenderer renderer = new PDFRenderer(pdDocument);
/*根據總頁數, 按照50頁生成一張長圖片的邏輯, 進行拆分*/
// 每50頁轉成1張圖片
int pageLength = 50;
// 總計迴圈的次數
int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
for (int m = 0; m < totalCount; m++) {
for (int i = 0; i < pageLength; i++) {
int pageIndex = i + (m * pageLength);
if (pageIndex == pdDocument.getNumberOfPages()) {
System.out.println("m = " + m);
break;
}
// 96為圖片的dpi,dpi越大,則圖片越清晰,圖片越大,轉換耗費的時間也越多
BufferedImage image = renderer.renderImageWithDPI(pageIndex, 96, RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
if (i == 0) {
//計算高度和偏移量
//使用第一張圖片寬度;
width = imageWidth;
// 儲存每頁圖片的畫素值
// 加個判斷:如果m次迴圈後所剩的圖片總數小於pageLength,則圖片高度按剩餘的張數繪製,否則會出現長圖片下面全是黑色的情況
if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
} else {
imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
}
} else {
// 將高度不斷累加
shiftHeight += imageHeight;
}
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
}
System.out.println("m = " + m);
File outFile = new File(pdfPath.replace(".pdf", "_" + m + ".jpg"));
System.out.println(outFile.getName());
// 寫圖片
ImageIO.write(imageResult, "jpg", outFile);
// 這個很重要,下面會有說明
shiftHeight = 0;
}
pdDocument.close();
} catch (Exception e) {
e.printStackTrace();
}
}
關於產生2種報錯資訊的說明
- javax.imageio.IIOException: Maximum supported image dimension is 65500 piexls
產生這種錯誤的原因是我想將多頁的pdf轉成1張長圖片(jpg格式會有,而png則不會)所致,經本人多次嘗試,這個上限大概在50-60張之間,超過的話,基本100%會報這個錯 - 陣列下標越界異常
產生這個錯誤的原因是因為上面的程式碼種,在寫完1張圖片後,未將shiftHeight置為0所致
寫在最後
- 抱歉是忘了參考哪位大神的了,如有雷同,請大神聯絡我;小弟一定加上你的連線
- 歡迎大家有問題在下面評論哈,相互交流,一起成長