0

PDF我有一个要从中检索图像的现有对象

笔记:

在文档中,这是RESULT变量

public static final String RESULT = "results/part4/chapter15/Img%s.%s";

我不明白为什么需要这张图片?我只想从我的PDF文件中提取图片

所以现在当我使用 MyImageRenderListener listener = new MyImageRenderListener(RESULT);

我收到错误消息:

results\part4\chapter15\Img16.jpg(系统找不到指定的路径)

这是我拥有的代码。

    package part4.chapter15;

    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 {

    /** The new document to which we've added a border rectangle. */
    public static final String RESOURCE = "resources/pdfs/samplefile.pdf";
    public static final String RESULT = "results/part4/chapter15/Img%s.%s";
    /**
     * Parses a PDF and extracts all the images.
     * @param src the source PDF
     * @param dest the resulting PDF
     */
    public void extractImages(String filename)
        throws IOException, DocumentException {
        PdfReader reader = new PdfReader(filename);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        MyImageRenderListener listener = new MyImageRenderListener(RESULT);
        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 {
        new ExtractImages().extractImages(RESOURCE);
    }
}
4

1 回答 1

2

你有两个问题,第一个问题的答案是第二个问题答案的关键。

问题一:

你参考:

public static final String RESULT = "results/part4/chapter15/Img%s.%s";

你问:为什么需要这个图像?

这个问题是错误的,因为Img%s.%s不是图像的文件名,而是图像文件名的模式。解析时,iText 将检测 PDF 中的图像。这些图像存储在编号的对象(例如对象 16)中,并且这些图像可以以不同的格式(例如 jpg、png、...)导出。

假设图像存储在对象 16 中,并且该图像是 jpg,则该模式将解析为Img16.jpg.

问题2:

为什么我会收到错误消息:

results\part4\chapter15\Img16.jpg(系统找不到指定的路径)

在您的 PDF 中,对象 16 中存储了一个 jpg。您要求 iText 使用此路径存储该图像:(results\part4\chapter15\Img16.jpg如我对问题 1的回答中所述)。但是:您的工作目录没有 subdirectories results\part4\chapter15\,因此会抛出一个IOException(或一个FileNotFoundException?)。

一般问题是什么?

您已经复制/粘贴了我为我的书“iText in Action - Second Edition”编写的ExtractImages示例,但是:

  1. 你没有读过那本书,所以你不知道这段代码应该做什么。
  2. 您没有告诉 StackOverflow 上的读者这个示例依赖于MyImageRenderer类,而这正是所有魔法发生的地方。

你怎么能解决你的问题?

选项1:

像这样改变RESULT

public static final String RESULT = "Img%s.%s";

现在图像将存储在您的工作目录中。

选项 2:

适配MyImageRenderer类,更具体地说是这个方法:

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());
        os = new FileOutputStream(filename);
        os.write(image.getImageAsBytes());
        os.flush();
        os.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

每当遇到图像时,iText 都会调用此类。它向这个方法传递了一个ImageRenderInfo包含大量关于该图像的信息的方法。

在这个实现中,我们将图像字节存储为一个文件。这就是我们创建该文件路径的方式:

String.format(path,
     renderInfo.getRef().getNumber(), image.getFileType())

如您所见,存储在其中的模式RESULT以这样一种方式使用,即第一次出现的%s被替换为数字,第二次出现的被替换为文件扩展名。

您可以轻松调整此方法,以便将图像存储为byte[]List想要的格式。

于 2015-08-12T13:04:53.733 回答