我正在使用以下链接中的代码来渲染图像
以下是我的尝试代码块。我实际上在做的是找到图像的 DPI ,如果图像的dpi低于300,则将其写入文本文件。
现在,我还想写下这些图片在PDF中的页码。如何获取该图像的页码?
try {
String filename;
FileOutputStream os;
PdfImageObject image = renderInfo.getImage();
BufferedImage img = null;
String txtfile = "results/results.txt";
PdfDictionary imageDict = renderInfo.getImage().getDictionary();
float widthPx = imageDict.getAsNumber(PdfName.WIDTH).floatValue();
float heightPx = imageDict.getAsNumber(PdfName.HEIGHT).floatValue();
float widthUu = renderInfo.getImageCTM().get(Matrix.I11);
float heigthUu = renderInfo.getImageCTM().get(Matrix.I22);
float widthIn = widthUu/72;
float heightIn = heigthUu/72;
float imagepdi = widthPx/widthIn;
filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
System.out.println(filename+"-->"+imagepdi);
if(imagepdi < 300){
File file = new File("C:/Users/Abhinav/workspace/itext/results/result.txt");
if(filename != null){
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
file.setReadable(true, false);
file.setExecutable(true, false);
file.setWritable(true, false);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(filename);
bw.write("\r\n");
bw.close();
}
}
答案 0 :(得分:1)
这是一个奇怪的问题,因为它不完整且不合逻辑。
为什么你的问题不完整?
您在其他示例ExtractImages
:
MyImageRenderListener
PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
MyImageRenderListener listener = new MyImageRenderListener(RESULT);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
parser.processContent(i, listener);
}
reader.close();
在此示例中,遍历每个页码以检查每个单独的页面。因此,只要MyImageRenderListener
返回图片,就知道页码。
图像作为外部对象(也称为XObject)存储在PDF中。 MyImageRenderListener
返回存储在这样的流对象中的内容(包含图像的字节)。到目前为止,非常好。
为什么你的问题不合逻辑?
因为在XObject中存储图像的整个目的是能够重用相同的图像流。想象一下徽标的图像。该图像可以出现在文档的每个页面上。在这种情况下,MyImageRenderListener
将为您提供与页面相同的图像(来自相同的流),但实际上,只有一个图像,并且它位于页面内容的外部。这个图像“知道”它所在的页面是没有意义的:它在每个页面上。即使图像仅用于一页,也适用相同的逻辑。这是PDF设计所固有的:图像流不知道它属于哪个页面。图像流和页面之间的链接存在于页面词典的/XObject
中的/Resources
条目中。
解决这个问题的优雅方法是什么?
在MyImageRenderListener
中创建成员变量,例如:
protected int pagenumber;
public void setPagenumber(int pagenumber) {
this.pagenumber = pagenumber;
}
使用循环中的setter:
PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
MyImageRenderListener listener = new MyImageRenderListener(RESULT);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
listener.setPagenumber(i);
parser.processContent(i, listener);
}
reader.close();
现在,您可以在pagenumber
方法中使用renderImage(ImageRenderInfo renderInfo)
。这样,您将始终知道在触发此方法时正在检查哪个页面。