0

我正在使用以下链接中的代码来渲染图像

MyImageRenderListener - IText

下面是我的代码尝试 块。我实际上在做的是查找图像的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();
                }
            }
4

1 回答 1

3

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

为什么你的问题不完整?

MyImageRenderListener在另一个示例的上下文中使用ExtractImages

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

图像作为外部对象(又名 XObject)存储在 PDF 中。MyImageRenderListener返回存储在此类流对象中的内容(包含图像的字节)。到目前为止,一切都很好。

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

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

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

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

protected int pagenumber;

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

使用循环中的设置器:

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

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

于 2015-09-03T12:57:43.547 回答