Java pdfbox-pdf在转换为灰度后增加大小

Java pdfbox-pdf在转换为灰度后增加大小,java,pdf,pdfbox,Java,Pdf,Pdfbox,我需要将扫描的PDF转换为灰度PDF。我找到了两种解决方案 第一种方法是只使用renderImage private void convertToGray()引发IOException{ 文件pdfFile=新文件(路径); try(PDDocument originalPdf=PDDocument.load(pdfFile); PDDocument doc=新的PDDocument(){ info(“加载文件后的当前堆:{}”,Runtime.getRuntime().totalMemory(

我需要将扫描的PDF转换为灰度PDF。我找到了两种解决方案

第一种方法是只使用
renderImage

private void convertToGray()引发IOException{
文件pdfFile=新文件(路径);
try(PDDocument originalPdf=PDDocument.load(pdfFile);
PDDocument doc=新的PDDocument(){
info(“加载文件后的当前堆:{}”,Runtime.getRuntime().totalMemory());
PDFRenderer PDFRenderer=新PDFRenderer(原PDFRenderer);
对于(int pageNum=0;pageNum
但这会增加文件的大小(因为有些PDF的DPI小于300)

第二种方法是用灰色模拟图像替换现有图像

private void convertByImageToGray()引发IOException{
文件pdfFile=新文件(路径);
try(PDDocument=PDDocument.load(pdfFile)){
列表对象=document.getDocument().getObjectsByType(COSName.IMAGE);
用于(COSObject对象:对象){
info(“类:{};{}”,object.getClass(),object.toString());
}
对于(int pageNum=0;pageNum
但仍然有一些文件的大小增加了3倍(即使它们已经是灰度的;有趣的是,int这个例子生成的文件比int大)。所有灰度PDF中的图像都与原始图像大小相同。我不明白为什么

也许有更好的方法来制作具有可预测大小的灰度PDF(除了ghostscript)

更新:我刚刚意识到问题在于如何从图像创建PDF。它不会进行压缩

例如,我有一个小于1 Mb的虚拟单页扫描文件。但如果我从中获取图像(通过Acrobat Reader直接复制到绘图,或通过上面的代码),根据方法,它的大小约为8-10 Mb。如果我从该图像创建新的PDF,它几乎没有压缩。以下是示例代码:

File pdfFile=新文件(完整文件);
try(PDDocument=PDDocument.load(pdfFile)){
PDPage page=新PDPage();
文件。添加页(第页);
PDImageXObject pdImage=PDImageXObject.createFromFile(“example.png”,document);
try(PDPageContentStream内容=新的PDPageContentStream(文档,页面)){
目录.drawImage(pdImage,0F,0F);
}
文件保存(完整文件保存新文件);
}

是的,与JPEGFactory相比,无损工厂生成的文件更小

在下面的链接中,有不同的方法尝试并实现相同的目标。总体而言,最佳质量的灰度图像是选项6中的一个,但这绝对不是最快的(我自己使用了选项4)。还提供了比较供您选择

链接包含将彩色图像转换为黑色的可能方法。它对我帮助很大。
让我知道它是否适用于您,如果有帮助,请批准我的答案。

是的,与JPEGFactory相比,无损工厂生成的文件更小

在下面的链接中,有不同的方法尝试并实现相同的目标。总体而言,最佳质量的灰度图像是选项6中的一个,但这绝对不是最快的(我自己使用了选项4)。还提供了比较供您选择

链接包含将彩色图像转换为黑色的可能方法。它对我帮助很大。
让我知道它是否适用于您,如果有帮助,请批准我的答案。

谢谢您的回复。我已经看过这篇文章。这篇文章帮助很大。但问题不在于我如何制作图像灰度。而是在创建/更新PDF本身时。我想我需要查看压缩。虽然此链接可以回答问题,但最好包含essentia在此处输入部分答案,并提供链接供参考。如果