Как определить, есть ли на странице PDF изображение - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю с документами PDF в стиле PDF / A, в которых есть отсканированные изображения в полный размер страницы, а затем одна или две страницы после страниц изображений с текстом в объекте ColumnText.

ИспользованиеJava, как мне определить, на каких страницах есть изображение?

Намерение определить, на каких страницах есть изображения или текст, - определить, где появляется первая страница с текстом.Мне нужно либо отредактировать текст, либо заменить страницы с текстом на обновленный.Страницы с изображениями останутся нетронутыми.

Я использую iText5 и в настоящее время у меня нет возможности перейти на iText7.

Вот решение, которое я реализовал с помощью решения, предоставленного @mkl:

ImageDetector.java

package org.test.pdf;

import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;

public class ImageDetector implements RenderListener {
    public void beginTextBlock() { }
    public void endTextBlock() { }
    public void renderText(TextRenderInfo renderInfo) {
        textFound = true;
    }

    public void renderImage(ImageRenderInfo renderInfo) {
        imageFound = true;
    }

    boolean textFound = false;
    boolean imageFound = false;
}

PdfDocumentServiceTest.java

package org.test.pdf;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.test.PdfService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

@ActiveProfiles({"local", "testing"})
@DirtiesContext
@Transactional
@RunWith(SpringRunner.class)
@SpringBootTest
public class PdfDocumentServiceTest {

    @Autowired
    private PdfService pdfService;

    @Test
    public void testFindImagesInPdf(Long pdfId)) {
        final byte[] resource = PdfService.getPdf(pdfId);
        int imagePageCount = 0;
        int textPageCount = 0;
        if (resource != null && resource.length > 0) {
            PdfReader reader = new PdfReader(resource);
            PdfReaderContentParser parser = new PdfReaderContentParser(reader);

            for (int pageNumber = 1; pageNumber <= reader.getNumberOfPages(); pageNumber++) {

                ImageDetector imageDetector = new ImageDetector();
                parser.processContent(pageNumber, imageDetector);

                if (imageDetector.imageFound) {
                    imagePageCount++;
                }
                if (imageDetector.textFound) {
                    textPageCount++;
                }
            }
            Assert.assertTrue(imagePageCount > 0);
            Assert.assertTrue(textPageCount > 0);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Используя iText 5, вы можете узнать, действительно ли изображения отображаются на странице, проанализировав содержимое страницы в пользовательской реализации RenderListener.Например,

class ImageDetector implements RenderListener {
    public void beginTextBlock() { }
    public void endTextBlock() { }
    public void renderText(TextRenderInfo renderInfo) { }

    public void renderImage(ImageRenderInfo renderInfo) {
        imageFound = true;
    }

    boolean imageFound = false;
}

используется следующим образом:

PdfReader reader = new PdfReader(resource);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
for (int pageNumber = 1; pageNumber <= reader.getNumberOfPages(); pageNumber++)
{
    ImageDetector imageDetector = new ImageDetector();
    parser.processContent(pageNumber, imageDetector);
    if (imageDetector.imageFound) {
        // There is at least one image rendered on page i
        // Thus, handle it as an image page
    } else {
        // There is no image rendered on page i
        // Thus, handle it as a no-image page
    }
}

Как возможное улучшение: В комментарии вы упоминаете полноразмерные изображения .Таким образом, в методе ImageDetector renderImage вы можете проверить размер изображения перед установкой imageFound в true.С помощью параметра ImageRenderInfo вы можете получить как информацию о том, насколько большое изображение отображается на странице, так и о том, насколько оно велико.

0 голосов
/ 19 ноября 2018

Попробуйте приведенный ниже пример кода ( Spire.PDF для Java * необходима библиотека 1002 *), надеюсь, она вам подойдет.

    PdfDocument doc = new PdfDocument();
    doc.loadFromFile("sample.pdf");

    for(int i = 0; i < doc.getPages().getCount(); i ++) {
        PdfPageBase page = doc.getPages().get(i);
        PdfImageInfo[] imageInfo = page.getImagesInfo();

        if (imageInfo != null && imageInfo.length > 0) {
            System.out.println("Page" + i + "contains image");
        } 
        else {
            System.out.print("Page" + i + "doesn't contain image");
        }

Отказ от ответственности: Я работаюдля Шпиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...