我找到了一些examples,了解如何使用iText从PDF中提取图像。但我正在寻找的是通过坐标从PDF获取图像。
有可能吗?如果是,那么如何做到。
答案 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用户空间单位正方形上的精确操作用于实际绘制图像的信息。如您所知,图像可以旋转,拉伸,倾斜和移动(前一种方法实际上从“移动”信息中提取矩阵的结果)。