Получить номер страницы изображения в pdf- IText
Я использую код из ссылки ниже, чтобы сделать изображения
Ниже приведен мой примерный блок кода. Что я на самом деле делаю, так это нахожу 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();
}
}
1 ответ
Это странный вопрос, потому что он неполный и нелогичный.
Почему ваш вопрос не завершен?
Ты используешь MyImageRenderListener
в контексте другого примера, ExtractImages
:
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
возвращает изображение.
Изображения хранятся в PDF как внешние объекты (также называемые XObject). MyImageRenderListener
возвращает то, что хранится в таком объекте потока (содержащем байты изображения). Все идет нормально.
Почему ваш вопрос нелогичен?
Потому что вся цель хранения изображений в XObject состоит в том, чтобы иметь возможность повторно использовать один и тот же поток изображений. Представьте себе изображение логотипа. Это изображение может присутствовать на каждой странице документа. В этом случае, MyImageRenderListener
даст вам одно и то же изображение (из одного и того же потока) столько раз, сколько страниц, но на самом деле изображение будет только одно, и оно будет внешним по отношению к содержимому страницы. Это изображение не имеет смысла "знать" страницу, на которой оно находится: оно есть на каждой странице. Та же логика применяется даже тогда, когда изображение используется только на одной странице. Это присуще дизайну PDF: поток изображений не знает, к какой странице он принадлежит. Связь между потоком изображений и страницей существует через /XObject
запись в /Resources
страницы словаря.
Что было бы элегантным способом решить эту проблему?
Создать переменную-член в MyImageRenderListener
Например:
protected int pagenumber;
public void setPagenumber(int pagenumber) {
this.pagenumber = pagenumber;
}
Используйте сеттер из вашего цикла:
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)
метод. Таким образом, вы всегда будете знать, какая страница проверяется при запуске этого метода.