2010-08-27 12 views
49

Chcę połączyć wiele plików PDF w jeden, stosując PDFBox i to, co robiłem:Jak połączyć dwa pliki PDF w jeden w Javie?

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(); 

Gdzie pdfFiles jest ArrayList<String> zawierający wszystkie pliki PDF.

Kiedy biegnę z powyższym mam zawsze się:

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

robię coś źle? Czy jest jakikolwiek inny sposób robienia tego?

+1

Ktoś wskazał iText [http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html], a następnie usunięte odpowiedź. To zadziałało i dzięki za to. – Lipis

+0

[link] (http://java-x.blogspot.de/2006/11/merge-pdf-files-with-itext.html) może pomóc komuś w szukaniu odpowiedzi. –

Odpowiedz

90

Dlaczego nie używać zestawu PDFMergerUtility w formacie PDF?

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

Działa również, ale używałem PDFBox do tworzenia plików PDF. – Lipis

+0

czy pozwoli scalić plik PDF, który zawiera zeskanowane obrazy i plik PDF, który został napisany? –

+2

@RageshKr: o ile rozumiem, połączy każdy plik PDF, niezależnie od ich zawartości. – cherouvim

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

Połknięcie wyjątków to zły wzór. catch (Exception e) { } –

0

Jeśli chcesz połączyć dwa pliki, w których jeden Nakładki drugi (przykład: dokument A jest szablon i dokument B zawiera tekst, który chcesz umieścić na szablonie), to działa:

po utworzeniu „dOC”, chcesz napisać swój szablon (templateFile) na górze, że -

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

    overlay.overlay(watermarkDoc, doc); 
4

jest to gotowy do użycia kodu, łącząc cztery pliki pDF z itext.jar z http://central.maven.org/maven2/com/itextpdf/itextpdf/5.5.0/itextpdf-5.5.0.jar, więcej na 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

Pytanie jest wyraźnie oznaczone [tag: pdfbox]. Przedstawiasz rozwiązanie dla [tag: itext]. Tak więc twoja odpowiedź jest nie na temat. (To powiedziawszy, twoje iTextowe rozwiązanie jest również złe, czego deweloperzy iText zwykle zalecają, ponieważ przerywa funkcje interaktywne i ignoruje rotację oraz rozmiary stron.) – mkl

+0

Następnie tytuł powinien brzmieć "Jak połączyć dwa pliki PDF w jeden w Javie z PdfBox " –

+0

Ponadto iText ma nieprzyjemną licencję. –