当前位置: 首页 > 面试题库 >

如何以正确的顺序从带有iText的PDF中提取图像?

柴声
2023-03-14
问题内容

我正在尝试从PDF文件提取图像。我在网上找到了一个很好的例子:

    PdfReader reader;

    File file = new File("example.pdf");
    reader = new PdfReader(file.getAbsolutePath());
    for (int i = 0; i < reader.getXrefSize(); i++) {
        PdfObject pdfobj = reader.getPdfObject(i);
        if (pdfobj == null || !pdfobj.isStream()) {
            continue;
        }
        PdfStream stream = (PdfStream) pdfobj;
        PdfObject pdfsubtype = stream.get(PdfName.SUBTYPE);
        if (pdfsubtype != null && pdfsubtype.toString().equals(PdfName.IMAGE.toString())) {
            byte[] img = PdfReader.getStreamBytesRaw((PRStream) stream);
            FileOutputStream out = new FileOutputStream(new File(file.getParentFile(), String.format("%1$05d", i) + ".jpg"));
            out.write(img);
            out.flush();
            out.close();
        }
    }

那给了我所有的图像,但是图像顺序错误。我的下一个尝试如下所示:

for (int i = 0; i <= reader.getNumberOfPages(); i++) {
  PdfDictionary d = reader.getPageN(i);
  PdfIndirectReference ir = d.getAsIndirectObject(PdfName.CONTENTS);
  PdfObject o = reader.getPdfObject(ir.getNumber());
  PdfStream stream = (PdfStream) o;
  // rest from example above
}

尽管o.isStream()== true,但是我只得到/ Length和/ Filter,流只有大约100个字节长。完全找不到图像。

我的问题是,正确的方式是从PDF文件中获取所有图像的正确方法。


问题答案:

我在其他地方找到了答案,即iText邮件列表。

以下代码对我 有用 -请注意,我切换到 PdfBox

PDDocument document = null; 
document = PDDocument.load(inFile); 
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator(); 
while (iter.hasNext()) {
            PDPage page = (PDPage) iter.next();
            PDResources resources = page.getResources();
            Map pageImages = resources.getImages();
            if (pageImages != null) { 
                Iterator imageIter = pageImages.keySet().iterator();
                while (imageIter.hasNext()) {
                    String key = (String) imageIter.next();
                    PDXObjectImage image = (PDXObjectImage) pageImages.get(key);
                    image.write2OutputStream(/* some output stream */);
                }
            }
}


 类似资料:
  • 当我使用pdfbox提取图像时,我得到了一些PDF图像的不正确dpi。当我使用Photoshop或Acrobat Reader Pro提取图像时,我可以看到图像的dpi是200使用windows照片查看器,但当我使用pdfbox提取图像时,dpi是72。 为了提取图像,我使用以下代码:无法从PDFA1-a格式文档中提取图像 当我检查日志时,我看到一个不寻常的条目:2015-01-23-main——

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

  • 我正试图用iText提取PDF中矩形的颜色。以下是PDF页面的所有内容: 这是用iText提取的页面内容: 但是,我不能从代码中提取一些东西,我说的是红色,如果我生成相同的PDF,但使用另一种颜色而不是红色,页面内容没有任何变化(代码显示在上面)。 我使用的是iText 5.5.9,下面是我用来生成PDF示例的代码示例: 感谢您提供的任何帮助! 这是我用来生成PDF的代码: 我已经检查了所有的re

  • 问题内容: 我有一个使用Closure Table方法保存分层数据的MySQL数据库。这个问题后面有一个简单的示例数据库创建脚本。目前,我的问题是如何以正确的顺序将数据从数据库中拉出?我当前正在使用以下select语句。 它会提取正确的信息,但顺序不正确。 示例数据库创建带有示例数据的脚本。 问题答案:

  • 问题内容: 我正在尝试使用iText提取PDF中矩形的颜色。在下面的是所有的PDF页面有什么: 这是使用iText提取的页面内容: 但是,有些东西我无法从该代码中提取,我说的 是红色,如果我生成相同的PDF,但是用另一种 颜色而不是红色,则页面内容没有任何变化(上面的代码显示了) )。 因此,我的问题是,如何使用 iText库Java的某些方法或属性来提取该颜色。 我正在使用iText 5.5.9

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