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

时间:2014-06-16 06:59:48

标签: image pdf itext

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

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

1 个答案:

答案 0 :(得分:2)

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