【问题标题】:How to extract images from a PDF with iText in the correct order?如何以正确的顺序使用 iText 从 PDF 中提取图像?
【发布时间】:2011-10-23 21:19:45
【问题描述】:

我正在尝试从 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 文件中获取所有图像的正确方法是什么。

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

    我在其他地方找到了答案,即 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 */);
                    }
                }
    }
    

    【讨论】:

    • PDXObjectImage 也是 iText 的一部分吗?好像没找到
    • @FilipeCorreia nratx 忘了提到他切换到 Apache PDFBox。
    • 对于某些 PDF 文件,PDResources resources = page.getResources(); 行需要替换为 PDResources resources = page.findResources();
    • 这段代码仍然以错误的顺序提取图像(用 PDFBox 1.6 和 1.8 测试)
    • 这个 answer 为我工作了 itext,保留了顺序并提取了 jpg 和 png 图像
    猜你喜欢
    • 2020-01-05
    • 2022-10-15
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多