【问题标题】:Retrieve the page number of an image in pdf- IText检索 pdf-IText 中图像的页码
【发布时间】:2015-09-03 12:43:40
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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 设计所固有的:图像流不知道它属于哪个页面。图片流和页面之间的链接是通过页面字典/Resources中的/XObject条目存在的。

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

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

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

    【讨论】:

    • 是的,我确实考虑过,但上面的代码来自 ExtractImages.java,但我在 MyImageRenderListener .java 中编写文本文件,所以我怎样才能从 ExtractImages 中获取 'i' 值.java 并将其传递给 MyImageRenderListener .java?抱歉,如果这听起来很愚蠢,我更像是一名 PHP 开发人员,所以我不知道如何做到这一点
    • 非常感谢布鲁诺,我明白了 :)
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多