我找到了一些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/