gpt4 book ai didi

java - 检索 pdf 中图像的页码 - IText

转载 作者:行者123 更新时间:2023-12-02 04:24:25 25 4
gpt4 key购买 nike

我正在使用以下链接中的代码来渲染图像

MyImageRenderListener - IText

下面是我的代码try block 。我实际上所做的是查找图像的 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();
}
}

最佳答案

这是一个奇怪的问题,因为它不完整且不合逻辑。

为什么您的问题不完整?

您正在另一个示例 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 中存储图像的全部目的是能够重用相同的图像流。想象一个 Logo 的图像。该图像可以出现在文档的每一页上。在这种情况下,MyImageRenderListener 将为您提供与页面数量相同的图像(来自同一流),但实际上,只有一个图像,并且它位于页面内容的外部。该图像“知道”它所在的页面是没有意义的:它在每个页面上。即使图像仅在一页上使用,相同的逻辑也适用。这是 PDF 设计所固有的:图像流不知道它属于哪个页面。图像流和页面之间的链接通过页面字典的 /Resources 中的 /XObject 条目存在。

解决这个问题的优雅方法是什么?

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();

现在您可以在 renderImage(ImageRenderInfo renderInfo) 方法中使用 pagenumber 。这样,当触发此方法时,您将始终知道正在检查哪个页面。

关于java - 检索 pdf 中图像的页码 - IText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com