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);
}
}
}
# 1 楼答案
使用iText 5,您可以通过将页面内容解析为一个定制的
RenderListener
实现来确定图像是否实际显示在页面上。例如用法如下:
作为一种可能的改进:在一条评论中,你提到了整页大小的图像。因此,在
ImageDetector
方法renderImage
中,您可能希望在将imageFound
设置为true
之前检查图像大小。通过ImageRenderInfo
参数,您可以检索有关图像在页面上显示的大小和实际大小的信息# 2 楼答案
尝试下面的代码示例(需要Spire.PDF for Java库),希望它对您有用
免责声明:我为Spire工作