Java pdf 轉 圖片

maven 依賴:apache

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.8</version>
</dependency>
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox-tools</artifactId>
  <version>2.0.8</version>
</dependency>

代碼示例:數組

private static final int HOME_PAGE_INDEX = 0;

/**
 * Pdf -> Image (首頁)
 *
 * [@param](https://my.oschina.net/u/2303379) pdf    pdf流
 * [@param](https://my.oschina.net/u/2303379) format 圖片格式
 * [@return](https://my.oschina.net/u/556800) pdf 圖片流
 */
public static byte[] getImageFromPdf(byte[] pdf, String format) {
    return pdfHomePageToImage(getFromByteArray(pdf), format);
}

/**
 * Pdf -> Image (首頁)
 *
 * [@param](https://my.oschina.net/u/2303379) pdf    pdf文件
 * [@param](https://my.oschina.net/u/2303379) format 圖片格式
 * @return pdf 圖片流
 */
public static byte[] getImageFromPdf(File pdf, String format) {
    return pdfHomePageToImage(getFromFile(pdf), format);
}

/**
 * Pdf -> Image (指定頁)
 *
 * @param pdf       pdf文件
 * @param pageIndex 頁號(頁號從0開始)
 * @param format    圖片格式
 * @return pdf 圖片流
 */
public static byte[] getImageFromPdf(File pdf, int pageIndex, String format) {
    return pdfToImageWithIndex(getFromFile(pdf), pageIndex, pageIndex, format).get(0);
}

/**
 * Pdf -> Image (指定頁)
 *
 * @param pdf       pdf流
 * @param pageIndex 起始頁號(頁號從0開始)
 * @param format    圖片格式
 * @return pdf 圖片流
 */
public static byte[] getImageFromPdf(byte[] pdf, int pageIndex, String format) {
    return pdfToImageWithIndex(getFromByteArray(pdf), pageIndex, pageIndex, format).get(0);
}

/**
 * Pdf -> Image (指定頁)
 *
 * @param pdf        pdf文件
 * @param startIndex 起始頁號(頁號從0開始)
 * @param endIndex   終止頁號
 * @param format     圖片格式
 * @return pdf 圖片流
 */
public static List<byte[]> getImageFromPdf(File pdf, int startIndex, int endIndex, String format) {
    return pdfToImageWithIndex(getFromFile(pdf), startIndex, endIndex, format);
}

/**
 * Pdf -> Image (指定頁)
 *
 * @param pdf        pdf流
 * @param startIndex 起始頁號(頁號從0開始)
 * @param endIndex   終止頁號
 * @param format     圖片格式
 * @return pdf 圖片流
 */
public static List<byte[]> getImageFromPdf(byte[] pdf, int startIndex, int endIndex, String format) {
    return pdfToImageWithIndex(getFromByteArray(pdf), startIndex, endIndex, format);
}

private static List<byte[]> pdfToImageWithIndex(PDDocument document, int startIndex, int endIndex, String format) {
    List<byte[]> pdfImages = new ArrayList<>();
    if (startIndex > endIndex) {
        throw new IllegalArgumentException("The param startIndex cannot be greater than endIndex");
    }
    if (endIndex > pdfTotalPages(document)) {
        throw new IllegalArgumentException(String.format("The pdf max page index is [%s], But the endIndex you input is [%s]", pdfTotalPages(document), endIndex));
    }
    for (int i = startIndex; i < endIndex; i++) {
        pdfImages.add(pdfToImage(document, i, endIndex, format));
    }
    return pdfImages;
}

/**
 * Pdf -> Image (全部頁)
 *
 * @param pdf    pdf byte[]
 * @param format 圖片格式
 * @return 圖片 byte[]
 */
public static List<byte[]> getImageFromPdfAllPages(byte[] pdf, String format) {
    return pdfToImageForAllPages(getFromByteArray(pdf), format);
}

/**
 * Pdf -> Image (全部頁)
 *
 * @param pdf    pdf文件
 * @param format 圖片格式
 * @return 圖片 byte[]
 */
public static List<byte[]> getImageFromPdfAllPages(File pdf, String format) {
    return pdfToImageForAllPages(getFromFile(pdf), format);
}

private static List<byte[]> pdfToImageForAllPages(PDDocument document, String format) {
    List<byte[]> pdfImages = new ArrayList<>();
    int totalPages = pdfTotalPages(document);
    for (int i = 0; i < totalPages; i++) {
        pdfImages.add(pdfToImage(document, i, totalPages, format));
    }
    return pdfImages;
}

/**
 * pdf首頁 -> image
 *
 * @param document PDDocument
 * @param format   圖片格式
 * @return 圖片 byte[]
 */
private static byte[] pdfHomePageToImage(PDDocument document, String format) {
    return pdfToImage(document, HOME_PAGE_INDEX, HOME_PAGE_INDEX, format);
}


/**
 * pdf -> image
 *
 * @param document   PDDocument
 * @param startIndex 頁號
 * @param endIndex   頁數
 * @param format     圖片格式
 * @return 圖片 byte[]
 */
private static byte[] pdfToImage(PDDocument document, int startIndex, int endIndex, String format) {
    try {
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(startIndex, 100);
        return imageToBytes(bufferedImage, format);
    } catch (Exception e) {
        log.warn("Pdf Read Error:", e);
    } finally {
        // 開發者須要的頁數讀取完再關閉
        if (startIndex == endIndex) {
            try {
                document.close();
            } catch (IOException e) {
                log.warn("IO Exception", e);
            }
        }

    }
    return null;
}

/**
 * 獲取pdf總頁數
 *
 * @param document pdf
 * @return pdf總頁數
 */
private static int pdfTotalPages(PDDocument document) {
    return document.getNumberOfPages();
}

/**
 * PDDocument
 *
 * @param pdf pdf文件
 * @return 圖片 byte[]
 */
private static PDDocument getFromFile(File pdf) {
    try {
        return PDDocument.load(pdf);
    } catch (IOException e) {
        throw new RuntimeException(String.format("Load pdf %s, The File must be a pdf.", e.getMessage()));
    }
}

/**
 * PDDocument
 *
 * @param pdf pdf文件 byte[]
 * @return 圖片 byte[]
 */
private static PDDocument getFromByteArray(byte[] pdf) {
    try {
        return PDDocument.load(pdf);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("Load pdf error: The File must be a pdf.");
    }

}

/**
 * 轉換BufferedImage 數據爲byte數組
 *
 * @param bImage Image對象
 * @param format image格式字符串.如"gif","png"
 * @return byte數組
 */
private static byte[] imageToBytes(BufferedImage bImage, String format) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        ImageIO.write(bImage, format, out);
    } catch (IOException e) {
        log.warn("IO Exception", e);
    }
    return out.toByteArray();
}
相關文章
相關標籤/搜索