Java PDF 转图片

分手后的思念是犯贱 2022-06-05 03:46 434阅读 0赞
  1. package com.hbzx.utils;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import org.apache.pdfbox.pdmodel.PDDocument;
  8. import org.apache.pdfbox.pdmodel.PDPage;
  9. import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
  10. import org.apache.pdfbox.rendering.ImageType;
  11. import org.apache.pdfbox.rendering.PDFRenderer;
  12. import org.apache.pdfbox.tools.imageio.ImageIOUtil;
  13. import org.junit.Test;
  14. public class PDFToJpg {
  15. @Test
  16. public void pdfToJpg() throws InvalidPasswordException, IOException {
  17. String pdfFilename = "C:\\Users\\aimil\\Desktop\\2.pdf";
  18. PDDocument document = PDDocument.load(new File(pdfFilename));
  19. PDFRenderer pdfRenderer = new PDFRenderer(document);
  20. List<BufferedImage> images = new ArrayList<>();
  21. int pageCounter = 0;
  22. for (PDPage page : document.getPages()) {
  23. // note that the page number parameter is zero based
  24. BufferedImage bim = pdfRenderer.renderImageWithDPI(pageCounter++, 300, ImageType.RGB);
  25. images.add(bim);
  26. }
  27. BufferedImage result = mergeImage(false,images.toArray(new BufferedImage[0]));
  28. ImageIOUtil.writeImage(result, pdfFilename + "-" + (pageCounter++) + ".png", 300);
  29. document.close();
  30. }
  31. /**
  32. * 合并任数量的图片成一张图片
  33. *
  34. * @param isHorizontal
  35. * true代表水平合并,fasle代表垂直合并
  36. * @param imgs
  37. * 欲合并的图片数组
  38. * @return
  39. * @throws IOException
  40. */
  41. public static BufferedImage mergeImage(boolean isHorizontal, BufferedImage... imgs) throws IOException {
  42. // 生成新图片
  43. BufferedImage destImage = null;
  44. // 计算新图片的长和高
  45. int allw = 0, allh = 0, allwMax = 0, allhMax = 0;
  46. for (BufferedImage img : imgs) {
  47. allw += img.getWidth();
  48. allh += img.getHeight();
  49. if (img.getWidth() > allwMax) {
  50. allwMax = img.getWidth();
  51. }
  52. if (img.getHeight() > allhMax) {
  53. allhMax = img.getHeight();
  54. }
  55. }
  56. // 创建新图片
  57. if (isHorizontal) {
  58. destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);
  59. } else {
  60. destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);
  61. }
  62. // 合并所有子图片到新图片
  63. int wx = 0, wy = 0;
  64. for (int i = 0; i < imgs.length; i++) {
  65. BufferedImage img = imgs[i];
  66. int w1 = img.getWidth();
  67. int h1 = img.getHeight();
  68. // 从图片中读取RGB
  69. int[] ImageArrayOne = new int[w1 * h1];
  70. ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
  71. if (isHorizontal) { // 水平方向合并
  72. destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
  73. } else { // 垂直方向合并
  74. destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
  75. }
  76. wx += w1;
  77. wy += h1;
  78. }
  79. return destImage;
  80. }
  81. }

发表评论

表情:
评论列表 (有 0 条评论,434人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现PDF图片

    注意事项:转图片后需仔细核对,因PDF内的字体可能不是宋体等最常见字体,转图片后可能出现中文乱码现象,需要查看原PDF文件中对应字体,下载后安装在本地或服务器上。 需引入ja