You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:20