2010-08-27 1118 views
49

que desea combinar varios archivos PDF en uno solo usando PDFBox y esto es lo que he hecho:¿Cómo combinar dos archivos PDF en uno en Java?

PDDocument document = new PDDocument(); 
for (String pdfFile: pdfFiles) { 
    PDDocument part = PDDocument.load(pdfFile); 
    List<PDPage> list = part.getDocumentCatalog().getAllPages(); 
    for (PDPage page: list) { 
     document.addPage(page); 
    } 
    part.close(); 
} 
document.save("merged.pdf"); 
document.close(); 

Dónde pdfFiles es un ArrayList<String> que contiene todos los archivos PDF.

Cuando estoy corriendo lo anterior, siempre estoy consiguiendo:

org.apache.pdfbox.exceptions.COSVisitorException: Bad file descriptor 

estoy haciendo algo mal? ¿Hay alguna otra forma de hacerlo?

+1

Alguien señaló iText [http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html] y luego borra la respuesta. Funcionó y gracias por eso. – Lipis

+0

El [enlace] (http://java-x.blogspot.de/2006/11/merge-pdf-files-with-itext.html) podría ayudar a alguien a buscar una respuesta. –

Respuesta

90

¿Por qué no utilizar el PDFMergerUtility de pdfbox?

PDFMergerUtility ut = new PDFMergerUtility(); 
ut.addSource(...); 
ut.addSource(...); 
ut.addSource(...); 
ut.setDestinationFileName(...); 
ut.mergeDocuments(); 
+0

También funciona, pero estaba usando el PDFBox para crear PDF también. – Lipis

+0

¿permitirá fusionar un PDF que tiene imágenes escaneadas y PDF que fue escrito? –

+2

@RageshKr: según tengo entendido, combinará cualquier PDF independientemente de su contenido. – cherouvim

24

Una búsqueda rápida en Google devolvió este error: "Bad file descriptor while saving a document w. imported PDFs".

Parece que debe mantener los archivos PDF fusionados abiertos hasta que haya guardado y cerrado el PDF combinado.

+5

Aunque la publicación tenía dos años, esto resolvió el problema. ¡Tienes que mantenerlos abiertos! – Lipis

3
package article14; 

import java.io.File; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.util.PDFMergerUtility; 

public class Pdf 
{ 
    public static void main(String args[]) 
    { 
     new Pdf().createNew(); 
     new Pdf().combine(); 
     } 

    public void combine() 
    { 
     try 
     { 
     PDFMergerUtility mergePdf = new PDFMergerUtility(); 
     String folder ="pdf"; 
     File _folder = new File(folder); 
     File[] filesInFolder; 
     filesInFolder = _folder.listFiles(); 
     for (File string : filesInFolder) 
     { 
      mergePdf.addSource(string);  
     } 
    mergePdf.setDestinationFileName("Combined.pdf"); 
    mergePdf.mergeDocuments(); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

public void createNew() 
{ 
    PDDocument document = null; 
    try 
    { 
     String filename="test.pdf"; 
     document=new PDDocument(); 
     PDPage blankPage = new PDPage(); 
     document.addPage(blankPage); 
     document.save(filename); 
    } 
    catch(Exception e) 
    { 

    } 
} 

} 
+0

Degluir excepciones es un mal patrón. catch (Excepción e) { } –

0

Si desea combinar dos archivos donde se superpone a la otra (ejemplo: el documento A es una plantilla y el documento B tiene el texto que desea poner en la plantilla), esto funciona:

después de crear "doc", que quiere escribir su plantilla (TemplateFile) por encima de eso -

PDDocument watermarkDoc = PDDocument.load(getServletContext() 
       .getRealPath(templateFile)); 
    Overlay overlay = new Overlay(); 

    overlay.overlay(watermarkDoc, doc); 
4

Ésta es una lista para usar código, la fusión de cuatro archivos PDF con itext.jar de http://central.maven.org/maven2/com/itextpdf/itextpdf/5.5.0/itextpdf-5.5.0.jar, más en http://tutorialspointexamples.com/

import com.itextpdf.text.Document; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfImportedPage; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfWriter; 

/** 
* This class is used to merge two or more 
* existing pdf file using iText jar. 
*/ 
public class PDFMerger { 

static void mergePdfFiles(List<InputStream> inputPdfList, 
     OutputStream outputStream) throws Exception{ 
    //Create document and pdfReader objects. 
    Document document = new Document(); 
    List<PdfReader> readers = 
      new ArrayList<PdfReader>(); 
    int totalPages = 0; 

    //Create pdf Iterator object using inputPdfList. 
    Iterator<InputStream> pdfIterator = 
      inputPdfList.iterator(); 

    // Create reader list for the input pdf files. 
    while (pdfIterator.hasNext()) { 
      InputStream pdf = pdfIterator.next(); 
      PdfReader pdfReader = new PdfReader(pdf); 
      readers.add(pdfReader); 
      totalPages = totalPages + pdfReader.getNumberOfPages(); 
    } 

    // Create writer for the outputStream 
    PdfWriter writer = PdfWriter.getInstance(document, outputStream); 

    //Open document. 
    document.open(); 

    //Contain the pdf data. 
    PdfContentByte pageContentByte = writer.getDirectContent(); 

    PdfImportedPage pdfImportedPage; 
    int currentPdfReaderPage = 1; 
    Iterator<PdfReader> iteratorPDFReader = readers.iterator(); 

    // Iterate and process the reader list. 
    while (iteratorPDFReader.hasNext()) { 
      PdfReader pdfReader = iteratorPDFReader.next(); 
      //Create page and add content. 
      while (currentPdfReaderPage <= pdfReader.getNumberOfPages()) { 
        document.newPage(); 
        pdfImportedPage = writer.getImportedPage(
          pdfReader,currentPdfReaderPage); 
        pageContentByte.addTemplate(pdfImportedPage, 0, 0); 
        currentPdfReaderPage++; 
      } 
      currentPdfReaderPage = 1; 
    } 

    //Close document and outputStream. 
    outputStream.flush(); 
    document.close(); 
    outputStream.close(); 

    System.out.println("Pdf files merged successfully."); 
} 

public static void main(String args[]){ 
    try { 
     //Prepare input pdf file list as list of input stream. 
     List<InputStream> inputPdfList = new ArrayList<InputStream>(); 
     inputPdfList.add(new FileInputStream("..\\pdf\\pdf_1.pdf")); 
     inputPdfList.add(new FileInputStream("..\\pdf\\pdf_2.pdf")); 
     inputPdfList.add(new FileInputStream("..\\pdf\\pdf_3.pdf")); 
     inputPdfList.add(new FileInputStream("..\\pdf\\pdf_4.pdf")); 


     //Prepare output stream for merged pdf file. 
     OutputStream outputStream = 
       new FileOutputStream("..\\pdf\\MergeFile_1234.pdf"); 

     //call method to merge pdf files. 
     mergePdfFiles(inputPdfList, outputStream);  
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

La pregunta claramente está etiquetada [tag: pdfbox]. Presenta una solución para [tag: itext]. Por lo tanto, su respuesta está fuera de tema. (Dicho esto, su solución iText también es mala, y los desarrolladores de iText generalmente la recomiendan porque deja de lado las funciones interactivas e ignora los tamaños de página y rotación). – mkl

+0

Luego, el título debería ser "Cómo fusionar dos archivos PDF en uno en Java con PdfBox " –

+0

Además iText viene con una licencia desagradable. –

Cuestiones relacionadas