Получить номер страницы изображения в pdf- IText

Я использую код из ссылки ниже, чтобы сделать изображения

MyImageRenderListener - 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) метод. Таким образом, вы всегда будете знать, какая страница проверяется при запуске этого метода.

Другие вопросы по тегам