2016-01-16 2 views
-2

J'essaye de convertir .doc à .pdf, mais j'ai obtenu cette l'exception et je ne sais pas comment le réparer.Apache pdfbox .doc à la conversion .pdf

java.io.IOException: Missing root object specification in trailer 
at org.apache.pdfbox.pdfparser.COSParser.parseTrailerValuesDynamically(COSParser.java:2042) 

C'est là l'exception est levée:

PDDocument pdfDocument = PDDocument.load(convertDocToPdf(documentInputStream)); 

Voici ma méthode de conversion:

private byte[] convertDocToPdf(InputStream documentInputStream) throws Exception { 
    Document document = null; 
    WordExtractor we = null; 
    ByteArrayOutputStream out = null; 
    byte[] documentByteArray = null; 
    try { 
     document = new Document(); 
     POIFSFileSystem fs = new POIFSFileSystem(documentInputStream); 

     HWPFDocument doc = new HWPFDocument(fs); 
     we = new WordExtractor(doc); 
     out = new ByteArrayOutputStream(); 
     PdfWriter writer = PdfWriter.getInstance(document, out); 

     Range range = doc.getRange(); 
     document.open(); 
     writer.setPageEmpty(true); 
     document.newPage(); 
     writer.setPageEmpty(true); 

     String[] paragraphs = we.getParagraphText(); 
     for (int i = 0; i < paragraphs.length; i++) { 
      org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i); 
      paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", ""); 
      document.add(new Paragraph(paragraphs[i])); 
     } 
     documentByteArray = out.toByteArray(); 
    } catch (Exception ex) { 
     ex.printStackTrace(System.out); 
     throw new Exception(STATE.FAILED_CONVERSION.name()); 
    } finally { 
     document.close(); 
     try { 
      we.close(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return documentByteArray; 
} 
+0

PdfWriter - n'est-ce pas itext? Et quelle version de PDFBox utilisez-vous? Pourriez-vous télécharger votre PDF? Et pourquoi "writer.close()" n'est jamais appelé? –

+0

Votre question sur iText ou sur Pdfbox? Ce sont des produits concurrents. –

+0

@Amadee encore on peut utiliser les deux côte à côte. Cependant, il faut être conscient des différentes architectures. – mkl

Répondre

0

Vous utilisez des classes iText et faire

documentByteArray = out.toByteArray(); 

avant terminer le document

document.close(); 

Ainsi, le documentByteArray ne contient qu'un PDF incomplet dont se plaint PDFBox.