Oppure

Loading
23/04/15 9:19
Bonny
Buongiorno a tutti, ho bisogno di un piccolo aiuto per risolvere un enigma che mi tormenta da giorni.
Sto lavorando ad uno script che manipola dei pdf mediante Apache PdfBox.
Obbiettivo:
- leggo un pdf
- split delle pagine e generazione di un pdf(n), dove n è il numero di pagine del pdf originale
- merge dei pdf(n) in un nuovo pdf
Problema:
il pdf merge finale aumenta di 500kb circa, ma solo in un caso, ecco il codice:
public class Main {
  
  public static void main(String[] args) throws Exception {

     String rootIn = "/home/lbonaldo/tmpdir/PdfExtension/in";
     String rootOut = "/home/lbonaldo/tmpdir/PdfExtension/out";
		
     FileUtils.cleanDirectory(new File(rootOut)); 	
     merge(rootIn + "/pdf_02.pdf", rootOut + "/MERGE", rootOut + "/RESULT.pdf");

   }

  public static void merge(String input, String prefix, String destination) throws Exception {

	log("Splitting document by pages using PDFBox...");
	PDDocument document = new PDDocument();
	document = PDDocument.load(input);
         // split delle pagine in singoli documenti pdf 
	Splitter splitter = new Splitter();
	List<PDDocument> listOfSplitPages = splitter.split(document);

         // li salvo nel fs per log
	Iterator<PDDocument> iterator = listOfSplitPages.listIterator();
	int i = 1;
	while (iterator.hasNext()) {
		PDDocument pd = iterator.next();
		try {
		   pd.save(prefix + "_" + i + ".pdf");
		   i++;
		} catch (COSVisitorException anException) {
			System.err.println("Something went wrong with page " + (i - 1) + "\n Here is the error essage" + anException);
		}
	}
                
         // ******************
         // svuoto la lista e la riempio con gli stessi pdf ma letti da fs
        listOfSplitPages.clear();
	for (int j = 1; j < i; j++) {
		InputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(prefix + "_" + j + ".pdf")));
		PDDocument pd = PDDocument.load(in);
		listOfSplitPages.add(pd);
	}
        // ******************                

	log("Merging pages using PDFBox...");
	PDDocument merged = new PDDocument();
	i = 1;
	for (PDDocument pdDoc : listOfSplitPages) {
			
		List<PDPage> pdPageList = pdDoc.getDocumentCatalog().getAllPages();
		for (PDPage pdPage : pdPageList) {
			merged.importPage(pdPage);
		}
	
		i++;
	}
	merged.save(destination);

 }

  public static void log(String str) {
	System.out.println(str);
  }

}


cioè se provate a commentare il codice:
  // ******************
 listOfSplitPages.clear();
 for (int j = 1; j < i; j++) {
 InputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(prefix + "_" + j + ".pdf")));
 PDDocument pd = PDDocument.load(in);
 listOfSplitPages.add(pd);
 }
 // ******************       

e quindi far generare il pdf dalla lista listOfSplitPages senza passare per il file system, il risultato varia solo di una decina di byte, accettabile.
ma nel caso di lettura da fs di tutte le parti la dimensione cambia notevolmente.

PS: sto usando la versione 1.8.9 di pdfbox, prima la 1.8.4 ma c'era un bug nel metodo addPage() di PDDocument, segue dicono di usare importPage e infatti funziona.
Ultima modifica effettuata da Bonny 23/04/15 9:22
aaa