Java pdf 转 图片

maven 依赖:

<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();
}

转载于:https://my.oschina.net/u/3757402/blog/3026251

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值