为了账号安全,请及时绑定邮箱和手机立即绑定

如何更改 PDF 文件中图像的过滤器

如何更改 PDF 文件中图像的过滤器

互换的青春 2023-08-04 16:30:17
我正在构建一个压缩 PDF 文件的工具,并使用 pdfbox。我有一些带有DCTDecode+FlateDecode滤镜的图像,我想尝试一下该JPXDecode滤镜,看看它是否占用更少的空间。我见过一些使用 的代码iText,但是如何使用 来做到这一点pdfbox?我没有找到如何执行此操作的文档。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

此代码替换图像流,而无需更改 COSWriter(这听起来很可怕),但是我尝试的 PDF 的经验是编码图像不正确,即 JPEG 2000 编码器中存在错误,因此请检查结果 PDF 。


public class SO57972743

{

    public static void main(String[] args) throws IOException

    {

        System.out.println("supported formats: " + Arrays.toString(ImageIO.getReaderFormatNames()));


        try (PDDocument doc = PDDocument.load(new File("test.pdf")))

        {

            // get 1st level images only here (there may be more in form XObjects!)

            PDResources res = doc.getPage(0).getResources();

            for (COSName name : res.getXObjectNames())

            {

                PDXObject xObject = res.getXObject(name);

                if (xObject instanceof PDImageXObject)

                {

                    replaceImageWithJPX(xObject);

                }

            }

            doc.save("test-result.pdf");

        }

    }


    private static void replaceImageWithJPX(PDXObject xObject) throws IOException

    {

        PDImageXObject img = (PDImageXObject) xObject;

        BufferedImage bim = img.getOpaqueImage(); // the mask (if there) won't be touched

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        boolean written = ImageIO.write(bim, "JPEG2000", baos);

        if (!written)

        {

            System.err.println("write failed");

            return;

        }

        // replace image stream

        try (OutputStream os = img.getCOSObject().createRawOutputStream())

        {

            os.write(baos.toByteArray());

        }

        img.getCOSObject().setItem(COSName.FILTER, COSName.JPX_DECODE); // replace filter

        img.getCOSObject().removeItem(COSName.COLORSPACE); // use the colorspace in the image itself

    }

}


查看完整回答
反对 回复 2023-08-04
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

通过使用处理所有图像流的自定义并使用 JPXDecode 过滤器重新编码它们, pdfbox可以压缩所有图像。无法这样做,但带有插件的 JAI 库可以生成 JPEG2000 图像。压缩因子是可配置的,并且可以在不损失太多质量的情况下实现高压缩比。COSWriterpdfbox

通过另外使用FlateDecode滤波器,可以获得更多的压缩,而不会造成质量损失。


查看完整回答
反对 回复 2023-08-04
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信