以pdf-IText检索图像的页码

时间:2015-09-03 12:43:40

标签: java pdf itext pdf-rendering pdf-manipulation

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

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

1 个答案:

答案 0 :(得分:1)

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

为什么你的问题不完整?

您在其他示例ExtractImages

的上下文中使用MyImageRenderListener
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;
}

使用循环中的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();

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