1. 程式人生 > >pdfbox將多頁pdf轉成多張長圖片

pdfbox將多頁pdf轉成多張長圖片

首先需要說明的幾點事情

  1. 本文是基於pdfbox2.0以上版本實現的
  2. 主要實現功能是將多頁的pdf檔案轉成1張png或者jpg圖片,或者多張jpg圖片
  3. 本文是借鑑將多頁pdf轉成1張長圖片的方法修改

功能由來

最近專案要求能夠實現office(word, excel,ppt)等的線上預覽功能,思路是分2步走

  1. office元件轉pdf,即是先將office元件轉成pdf進行上傳
  2. pdf轉成長圖片,即是將pdf轉成長圖片的形式,便於操作

引入jar包

  1. 基於maven管理jar包的形式,如果沒有使用maven的話,也可以去pdfbox官網檢視
        <dependency>
            <
    groupId>
    org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <
    version>
    2.0.1</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.1</version> </dependency>

下面貼上程式碼

  1. 這是將多頁(至少超過50)pdf轉換為多張長圖片的程式碼
  2. 至於轉成1張長圖片(png
    )或者每一頁pdf轉一張圖片,相似的例子有很多,我就不重複造輪子了
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種報錯資訊的說明

  1. javax.imageio.IIOException: Maximum supported image dimension is 65500 piexls
    在這裡插入圖片描asddad述
    產生這種錯誤的原因是我想將多頁的pdf轉成1張長圖片(jpg格式會有,而png則不會)所致,經本人多次嘗試,這個上限大概在50-60張之間,超過的話,基本100%會報這個錯
  2. 陣列下標越界異常
    在這裡插入圖片描述
    產生這個錯誤的原因是因為上面的程式碼種,在寫完1張圖片後,未將shiftHeight置為0所致

寫在最後

  1. 抱歉是忘了參考哪位大神的了,如有雷同,請大神聯絡我;小弟一定加上你的連線
  2. 歡迎大家有問題在下面評論哈,相互交流,一起成長