pdfで画像を圧縮し、アーカイブのためにpdfを出力する方法を探しています。作成前に画像を圧縮することができないため、印刷品質が損なわれる可能性があります。大きな画像を持つ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