【问题标题】:My code is not extracting Images from all PDF files我的代码没有从所有 PDF 文件中提取图像
【发布时间】:2017-05-13 19:26:21
【问题描述】:

请帮助我,我从 PDF 文件中提取图像的代码不是从所有 PDF 文件中提取图像。虽然它适用于某些 PDF 文件。请帮我。 这是我的代码: ExtractImages.java

package pdttotextconvertor;

import java.io.IOException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;

/**
 * Extracts images from a PDF file.
 */
public class ExtractImages {

    /**
     * PDF to extract images from
     */
    public static final String SOURCE_PDF = "C:/Latest Maven Code/pdttotextconvertor/src/main/resources/LC DPF example 1.pdf";

    /**
     * Parses a PDF and extracts all the images.
     *
     * @param filename the source PDF
     * @param destination the directory to save images
     */
    public void extractImages(String filename, String destination)
            throws IOException, DocumentException {
        System.out.println("Processing PDF at " + filename);
        System.out.println("Saving images to " + destination);

        PdfReader reader = new PdfReader(filename);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        ImageRenderListener listener = new ImageRenderListener(destination + "/Img%s.%s");
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            parser.processContent(i, listener);
        }
        reader.close();
    }

    /**
     * Main method.
     *
     * @param args no arguments needed
     * @throws DocumentException
     * @throws IOException
     */
    public static void main(String[] args) throws IOException, DocumentException {
        String sourcePDF = SOURCE_PDF;
        String destination = "target/images";
        if (args.length > 0) {
            sourcePDF = args[0];
            if (args.length > 1) {
                destination = args[1];
            }
        }

        new ExtractImages().extractImages(sourcePDF, destination);
    }
}

ImageRenderListener.java

package scannedPdfConvertor;

import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfImageObject;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Saves images to a directory.
 *
 * @author mnguyen
 */
public class ImageRenderListener implements RenderListener {

    /**
     * The directory path to store images.
     */
    protected String path;

    /**
     * Creates a RenderListener that will look for images.
     */
    public ImageRenderListener(String path) {
        this.path = path;
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()
     */
    public void beginTextBlock() {
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()
     */
    public void endTextBlock() {
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(
     * com.itextpdf.text.pdf.parser.ImageRenderInfo)
     */
    public void renderImage(ImageRenderInfo renderInfo) {
        try {
            String filename;
            FileOutputStream os;
            PdfImageObject image = renderInfo.getImage();
            if (image == null) {
                return;
            }
            filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
            System.out.println("Writing image to file: " + filename);
            os = new FileOutputStream(filename);
            os.write(image.getImageAsBytes());
            os.flush();
            os.close();
        } catch (IOException e) {
            Logger.getLogger(ImageRenderListener.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /**
     * @see com.itextpdf.text.pdf.parser.RenderListener#renderText(
     * com.itextpdf.text.pdf.parser.TextRenderInfo)
     */
    public void renderText(TextRenderInfo renderInfo) {

    }
}

失效的PDF文件链接是http://www.filedropper.com/lcdpfexample23

请帮助提前谢谢。

【问题讨论】:

  • 分享您的 pdf 文件。如果您的问题是关于 iText,请不要使用 pdfbox 标记您的问题。
  • 只是说“我的代码有时不起作用”并发布未注释的代码是不好的,因为您是在寻求帮助。您对问题发生的地方有任何想法吗?您的日志是否包含任何信息?您的代码完成时没有错误吗?以此类推
  • 我的猜测是 OP 要么将矢量图像误认为光栅图像(他的代码只提取 Image XObjects),要么遇到 iText 不支持的图像(我是不确定,但我认为不支持提取 JBIG2;您可以使用 iText 将 JBIG2 转换为 PDF,但我认为没有退路)。
  • itext 图像提取不支持具有有趣色彩空间的特定图像。
  • 这里是 Pdf 文件filedropper.com/lcdpfexample23,我无法从这个 pdf 文件中提取图像和数据。请帮忙。

标签: java maven pdf itext


【解决方案1】:

OP 共享的示例文档“LC DPF example 2.3.pdf”既不包含位图图像也不包含文本。它只包含矢量图形。

例如我们在第一行的“我们的信的第 3 页……”中读到的字母“P”实际上是使用这些 (m)ove、(l)ine、(c)urve、close (h) 和(f) 不良指示:

71.16 804.07 m
71.16 806.83 l
72.12 806.83 l
72.72 806.83 73.2 806.83 73.56 806.83 c
73.8 806.95 74.04 807.07 74.28 807.19 c
74.52 807.43 74.76 807.67 74.88 807.91 c
75 808.27 75.12 808.63 75.12 809 c
75.12 809.59 75 810.07 74.76 810.43 c
74.4 810.79 74.04 811.03 73.68 811.15 c
73.44 811.15 72.84 811.27 72 811.27 c
69.72 811.27 l
69.72 804.07 l
71.16 804.07 l
h
71.88 810.07 m
72.36 810.07 72.72 809.95 72.84 809.95 c
73.08 809.95 73.32 809.83 73.44 809.71 c
73.56 809.47 73.68 809.23 73.68 809 c
73.68 808.75 73.56 808.63 73.56 808.51 c
73.44 808.27 73.2 808.15 73.08 808.15 c
72.84 808.03 72.48 808.03 71.88 808.03 c
71.16 808.03 l
71.16 810.07 l
71.88 810.07 l
h
f 

因此,OP 实现的RenderListener 接口将找不到任何东西(因为它只侦听位图图像和文本)。

他可以实现ExtRenderListener,它还可以监听路径创建和渲染指令。不幸的是,这只会给他与上面显示的指令等效的说明,而不是像“这条填充路径看起来像字母'P'”这样的解释。

因此,他要么必须自己实现这种字符路径识别,要么改用 OCR。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多