检索 pdf-IText 中图像的页码

Retrieve the page number of an image in pdf- IText

我正在使用下面的代码 link 来渲染图像

MyImageRenderListener - IText

下面是我的 try 代码块。我实际上在做的是找到图像的 DPI,如果图像的 dpi 低于 300,则将其写入文本文件。

现在,我也想把这些图片所在的页码写在PDF中。如何获取该图片的页码?

    try {
            String filename;
            FileOutputStream os;
            PdfImageObject image = renderInfo.getImage();
            BufferedImage img = null;
            String txtfile = "results/results.txt";
            PdfDictionary imageDict = renderInfo.getImage().getDictionary();
            float widthPx = imageDict.getAsNumber(PdfName.WIDTH).floatValue(); 
            float heightPx = imageDict.getAsNumber(PdfName.HEIGHT).floatValue();
            float widthUu = renderInfo.getImageCTM().get(Matrix.I11);
            float heigthUu = renderInfo.getImageCTM().get(Matrix.I22);
            float widthIn = widthUu/72;
            float heightIn = heigthUu/72;
            float imagepdi = widthPx/widthIn;
            filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
            System.out.println(filename+"-->"+imagepdi);
            if(imagepdi < 300){
                File file = new File("C:/Users/Abhinav/workspace/itext/results/result.txt");



                if(filename != null){
                    if (!file.exists()) {
                        file.createNewFile();
                    }

                    FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
                    file.setReadable(true, false);
                    file.setExecutable(true, false);
                    file.setWritable(true, false);
                    BufferedWriter bw = new BufferedWriter(fw);
                    bw.write(filename);
                    bw.write("\r\n");
                    bw.close();
                }
            }

这是一个奇怪的问题,因为它不完整且不合逻辑。

为什么你的问题不完整?

您在另一个示例的上下文中使用 MyImageRenderListenerExtractImages:

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();

在此示例中,您遍历每个页码以检查每个单独的页面。因此,每当 MyImageRenderListener returns 图像时,你就知道页码

图像作为外部对象(也称为 XObject)存储在 PDF 中。 MyImageRenderListener returns 这样的流对象中存储了什么(包含图像的字节)。到目前为止,还不错。

为什么你的问题不合逻辑?

因为在 XObject 中存储图像的全部目的是为了能够重用相同的图像流。想象一下徽标的图像。该图像可以出现在文档的每一页上。在这种情况下,MyImageRenderListener 会为您提供与页面相同的图像(来自同一流)的次数,但实际上,只有一张图像,并且它在页面内容之外。该图像 "know" 它所在的页面没有意义:它在每个页面上。即使图像仅在一页上使用,同样的逻辑也适用。这是 PDF 设计所固有的:图像流不知道它属于哪个页面。图像流和页面之间的 link 通过页面字典 /Resources 中的 /XObject 条目存在。

解决这个问题的优雅方法是什么?

MyImageRenderListener中创建一个成员变量,例如:

protected int pagenumber;

public void setPagenumber(int pagenumber) {
    this.pagenumber = pagenumber;
}

使用循环中的 setter:

PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
MyImageRenderListener listener = new MyImageRenderListener(RESULT);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    listener.setPagenumber(i);
    parser.processContent(i, listener);
}
reader.close();

现在您可以在 renderImage(ImageRenderInfo renderInfo) 方法中使用 pagenumber。这样,当此方法被触发时,您将始终知道正在检查哪个页面。