【发布时间】:2014-01-04 01:06:33
【问题描述】:
正在寻找一种方法来压缩 pdf 中的图像并输出 pdf 以供存档。我不能在创建之前压缩图像,因为它会影响打印质量。
每个 pdf 的大小约为 8MB,其中大部分由 2 张图片组成。图像为 png 格式,并在生成过程中被带入 pdf(使用第三方生成器)
有没有办法在不使用 3rd 方工具的情况下在 java 中压缩这些文件。我已经尝试过使用 pdfbox、itext 和第 3 方 exe(neevia),第 3 方工具是迄今为止唯一给我任何结果的工具(低至大约半 MB),但我不想放弃对 exe 的控制. 示例代码如下。
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.common.PDStream;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
public class compressPDF {
public static void main (String[] args) throws IOException, DocumentException, COSVisitorException {
/*
* Using PDF Box
*/
PDDocument doc; // = new PDDocument();
doc = PDDocument.load("C:/_dev_env_/TEMP/compressPDF/TRPT_135002_1470_20131212_121423.PDF");
PDStream stream= new PDStream(doc);
stream.addCompression();
doc.save("C:/_dev_env_/TEMP/compressPDF/compressed_pdfBox.pdf");
doc.close();
/*
* Using itext
*/
PdfReader reader = new PdfReader("C:/_dev_env_/TEMP/compressPDF/TRPT_135002_1470_20131212_121423.PDF");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("C:/_dev_env_/TEMP/compressPDF/compressed_Itext.pdf"), PdfWriter.VERSION_1_5);
stamper.setFullCompression();
stamper.getWriter().setCompressionLevel(50);
int total = reader.getNumberOfPages() + 1;
for (int i = 1; i < total; i++) {
reader.setPageContent(i, reader.getPageContent(i));
}
stamper.close();
reader.close();
/*
* Using 3rd party - Neevia
*/
try {
Process process = new ProcessBuilder("C:/Program Files (x86)/neeviaPDF.com/PDFcompress/cmdLine/CLcompr.exe","C:/_dev_env_/TEMP/compressPDF/TRPT_135002_1470_20131212_121423.PDF", "C:/_dev_env_/TEMP/compressPDF/compressed_Neevia.pdf").start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
System.out.println(e);
} finally {
System.out.println("Created!!");
}
}
}
【问题讨论】:
-
您将图像保存为什么?您是否考虑过像 png 这样的无损格式?
-
图像以 png 格式存储,并使用名为 doc1(第 3 方)的生成器带入文档。感谢您的快速回复:)
-
如果 pdf 大小的大部分是这些图像并且它们已经被压缩,那么您可能会陷入僵局。我在此期间做了一些研究,pdf 将存储压缩图像:en.wikipedia.org/wiki/Pdf#Raster_images,因此您可能需要调整 pdf 的组装方式。除非您删除并重新添加图像,否则不确定一旦 pdf 已经组装好,可以做很多事情。
-
感谢 Taylor,我使用 tinyPNG 压缩了 pdf。我认为这将减少 50% 左右。这可能还不够,所以我可能需要使用 3rd 方工具。如果有人知道如何提取和重新添加图像,我也会有兴趣尝试一下......
-
谢谢布鲁诺。这让我走上了正确的道路。通过对该代码进行一些小的修改,我得到了我所需要的。我能够将 7546KB 降低到 408KB。结果!我现在将发布修改后的代码:)
标签: java image pdf itext pdfbox