亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何更改 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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號