有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检测PDF页面中是否有图像

我正在处理PDF/A样式的PDF文档,这些文档混合了扫描入的全页大小的图像,然后在图像页面之后的一两页中包含ColumnText对象中的文本

使用Java,如何检测哪些页面具有图像

检测哪些页面包含图像或文本的目的是确定第一个包含文本的页面出现的位置。我需要编辑文本或用更新的文本替换页面。带有图像的页面将保持不变

我正在使用iText5,目前没有升级到iText7的选项

以下是我用@mkl提供的解决方案实现的解决方案:

图像检测器。爪哇

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。爪哇

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) 个答案

  1. # 1 楼答案

    使用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参数,您可以检索有关图像在页面上显示的大小和实际大小的信息

  2. # 2 楼答案

    尝试下面的代码示例(需要Spire.PDF for Java库),希望它对您有用

        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");
            }
    

    免责声明:我为Spire工作