【问题标题】:Extract Images from PDF coordinates using iText使用 iText 从 PDF 坐标中提取图像
【发布时间】:2014-06-16 06:59:47
【问题描述】:

我找到了一些examples,了解如何使用 iText 从 PDF 中提取图像。但我正在寻找的是通过坐标从 PDF 中获取图像。

有可能吗?如果是,那么如何做到这一点。

【问题讨论】:

  • 您引用的示例提取了 PDF 中存在的图像资源。这些图像不一定是显示的图像,因为 a) 资源可能比实际使用的资源多,并且 b) 这种方法忽略了内联图像。因此,您应该使用 iText parser 包中的类。查看 iText 示例 ExtractImagesImageRenderInfo 对象包含坐标信息。
  • 感谢@mkl 指出我正确的例子。你能告诉我们如何使用坐标从这个例子中获取图像。

标签: image pdf itext


【解决方案1】:

按照 iText 示例 ExtractImages 的行,您可以提取如下代码:

PdfReader reader = new PdfReader(resourceStream);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
ImageRenderListener listener = new ImageRenderListener("testpdf");

for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    parser.processContent(i, listener);
}

ImageRenderListener 是这样定义的:

class ImageRenderListener implements RenderListener
{
    final String name;
    int counter = 100000;

    public ImageRenderListener(String name)
    {
        this.name = name;
    }

    public void beginTextBlock() { }
    public void renderText(TextRenderInfo renderInfo) { }
    public void endTextBlock() { }

    public void renderImage(ImageRenderInfo renderInfo)
    {
        try
        {
            PdfImageObject image = renderInfo.getImage();
            if (image == null) return;
            int number = renderInfo.getRef() != null ? renderInfo.getRef().getNumber() : counter++;
            String filename = String.format("%s-%s.%s", name, number, image.getFileType());
            FileOutputStream os = new FileOutputStream(filename);
            os.write(image.getImageAsBytes());
            os.flush();
            os.close();

            PdfDictionary imageDictionary = image.getDictionary();
            PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK);
            if (maskStream != null)
            {
                PdfImageObject maskImage = new PdfImageObject(maskStream);
                filename = String.format("%s-%s-mask.%s", name, number, maskImage.getFileType());
                os = new FileOutputStream(filename);
                os.write(maskImage.getImageAsBytes());
                os.flush();
                os.close();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

如您所见,ImageRenderListener 方法 renderImage 检索参数 ImageRenderInfo。这个参数有方法

  • getStartPoint 为您提供用户空间中的一个向量,表示 xobject 的起点
  • getImageCTM 在渲染此图像时为您提供激活的坐标变换矩阵。坐标在用户空间中。

后者为您提供了用于实际绘制图像的 1x1 用户空间单位正方形上的精确操作的信息。如您所知,图像可能会被旋转、拉伸、倾斜和移动(前一种方法实际上是从“移动”信息中的矩阵中提取其结果)。

【讨论】:

  • 图片提取成功。谢谢。但图像不正确。它上面有一些随机的颜色。请帮助获得 pdf 显示的清晰图像。
  • @Riddhi 请自行提出问题并提供出现问题的示例 pdf。请注意,图像提取是关于提取原始源图像,而不是关于图像最终如何在 pdf 查看器中显示,因为 pdf 可能会对绘制原始图像的页面应用附加效果。
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多