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
}
}

TA貢獻1871條經驗 獲得超13個贊
通過使用處理所有圖像流的自定義并使用 JPXDecode 過濾器重新編碼它們, pdfbox
可以壓縮所有圖像。無法這樣做,但帶有插件的 JAI 庫可以生成 JPEG2000 圖像。壓縮因子是可配置的,并且可以在不損失太多質量的情況下實現高壓縮比。COSWriter
pdfbox
通過另外使用FlateDecode
濾波器,可以獲得更多的壓縮,而不會造成質量損失。
添加回答
舉報