image - 使用 iText 从 PDF 坐标中提取图像

标签 image pdf itext

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

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

最佳答案

按照 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 用户空间单位正方形上进行精确操作以实际绘制图像的信息。如您所知,图像可以旋转、拉伸(stretch)、倾斜和移动(前一种方法实际上是从“移动”信息的矩阵中提取其结果)。

关于image - 使用 iText 从 PDF 坐标中提取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238137/

相关文章:

iphone - MFMailComposeViewController 图像方向

c# - 如何使用 iTextSharp 阅读 PDF 包

javascript - 将 bootstrap 模态打印为 PDF

java - 如何填充现有 PDF 的表单,然后使用 itext 将其添加到新 PDF

java - 在java中使用itext对齐PDF中的内容

java - 如何在 iText 生成的 PDF 中向我的页眉添加图像?

android - android中的图像数组

image - 在 README.md 中插入内嵌图片

javascript - CSS Slanding Div 边缘在图像上

pdf - 如何使用 Ghostscript 裁剪 pdf(无需手动输入边界框)