Java PdfBox 提取指定位置的PDF页面图片

  /**
       * 提取指定PDF页面的图片转换为Base64的List
     * 注意:图片提取的顺序是PDF创建时图片插入的顺序
     * @param file pdf文件
     * @param startIndex
     * @param endIndex
     * @throws Exception
     */
    public static List<String> getbase64Photos(File file, int startIndex, int endIndex) {
        List<String> photos = new ArrayList<>();
        try (PDDocument document = PDDocument.load(file)) {
            //TODO 下标从0开始,所以-1
            for (int i = startIndex - 1; i < endIndex; i++) {
                PDPage pdfpage = document.getPage(i);
                // get resource of pdf
                PDResources pdResources = pdfpage.getResources();
                Iterable<COSName> xObjectNames = pdResources.getXObjectNames();
                Iterator<COSName> iterator = xObjectNames.iterator();
                while (iterator.hasNext()) {
                    PDXObject o = pdResources.getXObject(iterator.next());
                    if (o instanceof PDImageXObject) {
                        //得到BufferedImage对象
                        BufferedImage image = ((PDImageXObject) o).getImage();
                        String base64img = Base64Util.convertimgtoBase64(image);
                        // 可以打印到本地,查看输出顺序
                        //String imglocation = "C:\\CER\\AE EMC lab_Report template\\pdf img by page\\";
                        //File imgfile = new File(imglocation + StringUtil.get32UUID() + ".png");
                        //ImageIO.write(image, "png", imgfile);

                        photos.add("data:image/jpg;base64," + base64img);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return photos;
    }

PdfBox提取图片的顺序是根据,插入图片的先后来提取的。 

public class Base64Util {
    public static String convertimgtoBase64(BufferedImage image) {
        String png_base64 = "";
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            ImageIO.write(image, "png", baos);//写入流中
            byte[] bytes = baos.toByteArray();//转换成字节
//            png_base64 = new BASE64Encoder().encode(bytes);//jdk1.8写法
            png_base64 = Base64.encodeBase64String(bytes);//JDK11写法
//        String png_base64 = Base64.encodeBase64String(bytes).trim();//转换成base64串
            png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
        } catch (IOException e) {
            e.printStackTrace();
        }
        return png_base64;
    }
}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用JavaPDFBox库可以轻松地提取指定区域的图片。下面是一个基本的步骤: 1. 首先,需要导入PDFBox库。可以从官方网站(https://pdfbox.apache.org/)下载并将其添加到Java项目中。 2. 创建一个PDF文档的PDDocument对象,并使用该文档的路径初始化它。例如: ```java PDDocument document = PDDocument.load(new File("path/to/pdf")); ``` 3. 获取第一页的PDPage对象。由于PDFBox库使用从零开始的索引,第一页的索引为0。例如: ```java PDPage page = document.getPage(0); ``` 4. 创建一个PDFRenderer对象,将PDPage对象传递给它。该对象可以渲染PDF页面为图像。例如: ```java PDFRenderer renderer = new PDFRenderer(document); ``` 5. 确定要提取图片的区域。可以使用PDRectangle对象来表示区域的坐标和大小。例如,提取左上角为(100, 100),宽度和高度都为200的区域: ```java PDRectangle region = new PDRectangle(100, 100, 200, 200); ``` 6. 使用PDFRenderer的renderImageWithDPI方法将区域渲染为图像。这个方法需要提供图像的DPI(每英寸点数)。例如,将DPI设置为96: ```java BufferedImage image = renderer.renderImageWithDPI(0, 96); ``` 7. 从图像中截取指定区域。使用getSubimage方法,传递区域的左上角坐标和大小。例如: ```java BufferedImage extractedImage = image.getSubimage((int) region.getLowerLeftX(), (int) region.getLowerLeftY(), (int) region.getWidth(), (int) region.getHeight()); ``` 8. 现在,可以对提取的图像进行任何所需的处理,例如保存到磁盘或显示在图形用户界面中。例如,保存图像到指定路径: ```java ImageIO.write(extractedImage, "png", new File("path/to/extracted/image.png")); ``` 9. 最后,不要忘记关闭PDDocument对象以释放资源: ```java document.close(); ``` 这是使用Java PDFBox提取指定区域图像的基本过程。根据实际需求,还可以进一步处理图像或适应更复杂的用例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再写一行代码就下班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值