当前位置: 首页 > 知识库问答 >
问题:

PDFBOX:从pdf中提取图像到inputstream

欧阳晗日
2023-03-14

我正在使用PDFBox从我的pdf(只包含JPG的)中提取图像。

因为我将把这些图像保存在我的数据库中,所以我想先把每个图像直接转换成一个inputstream对象,而不把文件临时放在我的文件系统上。然而,我在这方面遇到了困难。我认为这是因为使用了image.getPDFStream().createInputStream(),就像我在下面的示例中所做的那样:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    InputStream is = image.getPDStream().createInputStream(); //this gives me a corrupt file
    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        output.write(buffer);
    }
}

然而,这是可行的:

while (iter.hasNext()) {
    PDPage page = (PDPage) iter.next();
    PDResources resources = page.getResources();
    Map<String, PDXObject> images = resources.getXObjects();
        if (images != null) {
            Iterator<?> imageIter = images.keySet().iterator();
            while (imageIter.hasNext()) {
            String key = (String) imageIter.next();
            PDXObjectImage image = (PDXObjectImage) images.get(key);
            image.write2file(new File("C:\\Users\\Anton\\Documents\\lol\\test.jpg")); //this works however
        }
    }
}

知道我如何将每个PDXObjectImage(或我能得到的任何其他对象)转换为InputStream吗?

共有1个答案

巩俊远
2023-03-14

在PDFBox1.8中,最简单的方法是使用write2OutputStream(),因此您的第一个代码块现在将如下所示:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    image.write2OutputStream(output);
}

高级解决方案,只要您确实确定您只有正确显示的JPEG,即没有异常的颜色空间:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    InputStream is = image.getPDStream().getPartiallyFilteredStream(DCT_FILTERS);
    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        output.write(buffer);
    }
}

第二种解决方案除去DCT(=JPEG)滤波器以外的所有滤波器。一些较旧的PDF有几个过滤器,例如ascii85和DCT。

现在即使你用JPEG创建了图像,你也不知道你的PDF创建软件做了什么。找出它是什么类型的映像的一种方法是检查它是什么类(使用instanceof):

- PDPixelMap => PNG
- PDJpeg => JPEG
- PDCcitt => TIF

另一种方法是使用image.getSuffix()。

 类似资料:
  • 主要内容:从PDF文档生成图像在前一章中,我们已经看到了如何合并多个PDF文档。 在本章中,我们将了解如何从PDF文档的页面提取图像。 从PDF文档生成图像 PDFBox库提供了一个名称为的类,它将PDF文档呈现为AWT BufferedImage。 以下是从PDF文档生成图像的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以使用类名称调用

  • 假设我的用户去了他们办公室的扫描仪。扫描仪能够生成扫描文档的PDF。这基本上就是我拥有的文件类型。 我想做的是从这个PDF中提取文本。这不是“第一代”pdf,因为文本没有嵌入到pdf中。文本嵌入在PDF中的图像中。 PDFBox的iText中是否有允许检索此数据的功能?如果可能的话,我正在尝试避免对图像进行OCR。我希望IText或PDFBox中有一些内置的东西可以做到这一点。 请注意,我不是在谈

  • 我知道以前也有人问过类似的问题,但是这些问题已经过时了(有些问题可以追溯到2006年)。 我有一个. net 3.5应用程序(w/iTextSharp 5),我正在转换为. net核心(iText 7),它从联邦快递跟踪文档中提取签名,通过SOAP服务以字节[]数组发送。这段代码多年来一直运行良好,只是略有更新。从联邦快递返回的PDF文档中有几个图像,但签名块不是110x46图像(这是pdf文件中

  • 我想使用java netbeans从pdf中的按钮中获取图像图标,并将其放在某个面板中。然而,我在这里打了一块砖头。我正在使用PDFBox作为我的PDF导出器,我似乎无法理解。我已经成功地从表单字段读取,但是只要我尝试在PDFBox中找到它,就没有按钮提取器。我应该如何制作它?是否可以使用此方法,或者是否有其他方法。提前致谢。 编辑:我已经发现使用使用此代码的示例实用程序的提取时间: 但是我仍然无

  • 问题内容: 我需要从服务器上的PDF文件中提取所有图像。我不想要PDF页面,只想要原始尺寸和分辨率的图像。 如何使用Perl,PHP或任何其他基于UNIX的应用程序(我将使用PHP的exec函数调用它)来做到这一点? 问题答案: pdfimages就是这样做的。它是poppler- utils和xpdf-utils软件包的一部分。 从联机帮助页: Pdfimages将可移植文档格式(PDF)文件中

  • 有可能吗?如果是,那么它可以怎么做。