iText 7 pdfSweep处理JPX编码MRC压缩PDF时抛出ImageReadException求助
解决iText 7 pdfSweep处理JPX编码MRC压缩PDF时的ImageReadException问题
这个问题的核心原因很明确:pdfSweep依赖的Apache Commons Imaging库默认不支持JPX(JPEG 2000)图像格式,当它尝试解析MRC压缩PDF里的JPX编码图像时,找不到对应的解析器,就会抛出ImageReadException。
下面是两种可行的解决方案:
方案1:预转换PDF中的JPX图像为支持的格式
在执行pdfSweep红标操作前,先遍历PDF中的所有图像,把JPX编码的图像转换为JPEG/PNG这类通用格式,再进行清理处理。这样可以避开Commons Imaging对JPX的支持缺失问题。
代码示例
// 第一步:预处理PDF,替换JPX图像 PdfDocument preprocessedDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("preprocessed.pdf")); for (int pageNum = 1; pageNum <= preprocessedDoc.getNumberOfPages(); pageNum++) { PdfPage page = preprocessedDoc.getPage(pageNum); PdfResources resources = page.getResources(); Map<PdfName, PdfXObject> xObjects = resources.getPdfObject().getAsDictionary(PdfName.XObject); if (xObjects != null) { for (Map.Entry<PdfName, PdfXObject> entry : xObjects.entrySet()) { PdfXObject xObject = entry.getValue(); if (xObject instanceof PdfImageXObject) { PdfImageXObject imgXObj = (PdfImageXObject) xObject; PdfName filter = imgXObj.getPdfObject().getAsName(PdfName.Filter); // 判断是否为JPX编码 if (PdfName.JPXDecode.equals(filter)) { // 读取JPX图像(需要依赖JAI ImageIO的JPX插件) BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgXObj.getImageBytes())); // 转换为JPEG格式 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(img, "JPEG", baos); // 创建新的图像XObject并替换原图像 PdfImageXObject newImg = new PdfImageXObject(ImageDataFactory.create(baos.toByteArray())); resources.put(entry.getKey(), newImg.getPdfObject()); } } } } } preprocessedDoc.close(); // 第二步:用预处理后的PDF执行红标清理 PdfDocument cleanDoc = new PdfDocument(new PdfReader("preprocessed.pdf"), new PdfWriter("cleaned_output.pdf")); PdfCleanUpTool cleaner = new PdfCleanUpTool(cleanDoc); // 添加你的红标规则示例 cleaner.addCleanUpLocation(new PdfCleanUpLocation(1, new Rectangle(100, 100, 200, 200), Color.RED)); cleaner.cleanUp(); cleanDoc.close();
依赖说明
默认Java ImageIO不支持JPX读取,所以需要添加JAI ImageIO的JPX插件依赖。如果用Maven,可以在pom.xml中加入:
<dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-jpeg2000</artifactId> <version>1.3.0</version> </dependency>
方案2:扩展Apache Commons Imaging的解析器
如果你不想修改PDF内容,可以自定义JPX图像解析器并注册到Commons Imaging中。不过这种方式相对复杂,需要实现ImageParser接口,处理JPX格式的解析逻辑,然后通过Imaging.addImageParser()方法注册。
不过考虑到开发成本,方案1通常是更快捷的选择。
内容的提问来源于stack exchange,提问作者tomazz
相关产品推荐
相关产品推荐

