尋找一種方式來壓縮PDF格式的圖像和輸出PDF格式的歸檔。我無法在創建之前壓縮圖像,因爲這會影響打印質量。通過java壓縮pdf與大圖像
每個pdf的大小約爲8MB,其中大部分由2個圖像組成。圖像是在PNG格式,並在生成期間帶入pdf(使用第三方發生器)
有沒有辦法在java中壓縮這些沒有使用第三方工具。我已經嘗試過使用pdfbox,itext和第三方exe(neevia),第三方工具是目前爲止唯一給我任何結果的第三方工具(低至約半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這樣的無損格式? – Taylor
圖像以png格式存儲,並使用名爲doc1(第三方)的生成器引入到文檔中。感謝您的快速回復:) –
如果pdf大小的大部分是這些圖像,並且它們已經被壓縮,那麼您可能處於僵局。我在臨時中進行了一些研究,PDF將壓縮存儲圖像:https://en.wikipedia.org/wiki/Pdf#Raster_images,因此您可能需要調整pdf的組裝方式。除非您刪除並重新添加圖像,否則一旦PDF已經組裝完畢,就不能確定可以做多少事情。 – Taylor