Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Apache PdfBox
Forum - Java - Apache PdfBox

Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 11:19
Giovedì, 23/04/2015
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:
Codice sorgente - presumibilmente Java

  1. public class Main {
  2.  
  3.   public static void main(String[] args) throws Exception {
  4.  
  5.      String rootIn = "/home/lbonaldo/tmpdir/PdfExtension/in";
  6.      String rootOut = "/home/lbonaldo/tmpdir/PdfExtension/out";
  7.                
  8.      FileUtils.cleanDirectory(new File(rootOut));      
  9.      merge(rootIn + "/pdf_02.pdf", rootOut + "/MERGE", rootOut + "/RESULT.pdf");
  10.  
  11.    }
  12.  
  13.   public static void merge(String input, String prefix, String destination) throws Exception {
  14.  
  15.         log("Splitting document by pages using PDFBox...");
  16.         PDDocument document = new PDDocument();
  17.         document = PDDocument.load(input);
  18.          // split delle pagine in singoli documenti pdf
  19.         Splitter splitter = new Splitter();
  20.         List<PDDocument> listOfSplitPages = splitter.split(document);
  21.  
  22.          // li salvo nel fs per log
  23.         Iterator<PDDocument> iterator = listOfSplitPages.listIterator();
  24.         int i = 1;
  25.         while (iterator.hasNext()) {
  26.                 PDDocument pd = iterator.next();
  27.                 try {
  28.                    pd.save(prefix + "_" + i + ".pdf");
  29.                    i++;
  30.                 } catch (COSVisitorException anException) {
  31.                         System.err.println("Something went wrong with page " + (i - 1) + "\n Here is the error essage" + anException);
  32.                 }
  33.         }
  34.                
  35.          // ******************
  36.          // svuoto la lista e la riempio con gli stessi pdf ma letti da fs
  37.         listOfSplitPages.clear();
  38.         for (int j = 1; j < i; j++) {
  39.                 InputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(prefix + "_" + j + ".pdf")));
  40.                 PDDocument pd = PDDocument.load(in);
  41.                 listOfSplitPages.add(pd);
  42.         }
  43.         // ******************                
  44.  
  45.         log("Merging pages using PDFBox...");
  46.         PDDocument merged = new PDDocument();
  47.         i = 1;
  48.         for (PDDocument pdDoc : listOfSplitPages) {
  49.                        
  50.                 List<PDPage> pdPageList = pdDoc.getDocumentCatalog().getAllPages();
  51.                 for (PDPage pdPage : pdPageList) {
  52.                         merged.importPage(pdPage);
  53.                 }
  54.        
  55.                 i++;
  56.         }
  57.         merged.save(destination);
  58.  
  59.  }
  60.  
  61.   public static void log(String str) {
  62.         System.out.println(str);
  63.   }
  64.  
  65. }



cioè se provate a commentare il codice:
Codice sorgente - presumibilmente Java

  1. // ******************
  2.  listOfSplitPages.clear();
  3.  for (int j = 1; j < i; j++) {
  4.  InputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(prefix + "_" + j + ".pdf")));
  5.  PDDocument pd = PDDocument.load(in);
  6.  listOfSplitPages.add(pd);
  7.  }
  8.  // ******************


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 il 23/04/2015 alle 11:22
PM Quote