2010-08-27 9 views
49

Ben PDFBox kullanarak içine birçok PDF dosyalarını birleştirmek istediğiniz ve bu benim yaptığım budur: pdfFiles tüm PDF dosyalarını içeren bir ArrayList<String>Java'da iki PDF dosyasını bir birine nasıl birleştirirsiniz?

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

olduğu yere. Yukarıda koşuyorum zaman

, hep alıyorum:

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

Am Yanlış bir şey yapıyor? Bunu yapmanın başka bir yolu var mı?

+1

Biri iText [http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html] işaret ve sonra cevap silindi. Çalıştı ve bunun için teşekkürler. – Lipis

+0

[Link] (http://java-x.blogspot.de/2006/11/merge-pdf-files-with-itext.html), bir cevabı arayan birine yardımcı olabilir. –

cevap

90

Neden pdfbox'ın PDFMergerUtility'unu kullanmıyorsunuz?

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

Ayrıca çalışır, ancak PDF oluşturmak için de PDFBox kullanıyordum. – Lipis

+0

taranmış görüntülere ve PDF'ye sahip PDF'leri birleştirmeye izin verecek mi? –

+2

@RageshKr: Anladığım kadarıyla, içeriği ne olursa olsun herhangi bir PDF'yi birleştirecek. – 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

Yutma istisnaları kötü bir modeldir. catch (Özel durum e) { } –

0

Bir diğer kaplayan iki dosyayı birleştirmek istiyorsanız (örnek: A dokümanı bir şablon ve belge B şablonu koymak istediğiniz metni vardır), bu çalışır:

"doc" oluşturulduktan sonra da bunun üzerine şablonunuzu (templateFile) yazmak istiyorum -

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

    overlay.overlay(watermarkDoc, doc); 
4

Bu daha üzerinde, http://central.maven.org/maven2/com/itextpdf/itextpdf/5.5.0/itextpdf-5.5.0.jar dan itext.jar dört pdf dosyalarını birleştirme, kod kullanmak için hazır 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

Sorun açıkça etiketlenmiş [tag: pdfbox]. [Tag: itext] için bir çözüm sunuyorsunuz. Böylece cevabınız konu dışı. (Bu, iText çözümünüzün, etkileşimli özellikleri düşürdüğü ve döndürme ve sayfa boyutlarını göz ardı ettiği için genellikle iText geliştiricilerinin önerdiği kötü bir durumdur.) – mkl

+0

Daha sonra başlık, "İki PDF dosyasını Java'da bir dosyaya nasıl birleştirilir?" PdfBox " –

+0

Ayrıca iText kötü bir lisans ile geliyor. –