Szukasz sposobu na kompresowanie obrazów w pliku pdf i wydrukowanie pliku PDF do archiwizacji. Nie mogę skompresować obrazów przed stworzeniem, ponieważ mogłoby to pogorszyć jakość wydruku.skompresować pdf z dużymi obrazami za pośrednictwem java
Wielkość każdego pliku PDF wynosi około 8 MB, a większość składa się z 2 obrazów. Obrazy są w formacie PNG i są wprowadzane do formatu PDF podczas generowania (używany generator 3rd party)
Czy istnieje sposób kompresowania tych plików w Javie bez użycia narzędzia innej firmy. Próbowałem z pdfboxem, itextem i 3rd party exe (neevia), jedynym narzędziem, które dało mi dotychczas jakieś wyniki (do około pół MB), ale nie chcę zrezygnować z kontroli dla exe . Przykładowy kod znajduje się poniżej.
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!!");
}
}
}
Co zapisywania obrazów jak? Czy rozważałeś format bezstratny, jak png? – Taylor
Obrazy są przechowywane w formacie png i przenoszone do dokumentu za pomocą generatora o nazwie doc1 (strona trzecia). Dziękuję za szybką odpowiedź :) –
Jeśli większość rozmiaru pdf to te obrazy i są już skompresowane, możesz być w impasie. Zrobiłem trochę badań w międzyczasie, a pdf będzie przechowywać obrazy z kompresją: https://en.wikipedia.org/wiki/Pdf#Raster_images, więc możesz chcieć dostroić sposób, w jaki plik PDF jest montowany. Nie wiem, ile można zrobić, gdy już plik pdf zostanie już złożony, chyba że usuniesz i ponownie dodasz obrazy. – Taylor