84 votes

Comment fusionner deux fichiers PDF en un seul en Java ?

Je souhaite fusionner plusieurs fichiers PDF en un seul à l'aide de la fonction PDFBox et c'est ce que j'ai fait :

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

pdfFiles est un ArrayList<String> contenant tous les fichiers PDF.

Quand j'exécute le programme ci-dessus, j'obtiens toujours :

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

Est-ce que je fais quelque chose de mal ? Y a-t-il une autre façon de procéder ?

1 votes

Quelqu'un a signalé que iText [ [java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html]](http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html]) puis a supprimé la réponse. Cela a fonctionné et merci pour cela.

0 votes

Le site lien pourrait aider quelqu'un qui cherche une réponse.

151voto

cherouvim Points 18550

Pourquoi ne pas utiliser le PDFMergerUtility de pdfbox ?

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

1 votes

Cela fonctionne aussi, mais j'utilisais aussi PDFBox pour créer des PDF.

0 votes

Permet-il de fusionner un PDF contenant des images scannées et un PDF écrit ?

4 votes

@RageshKr : d'après ce que j'ai compris, il fusionne tous les PDF, quel que soit leur contenu.

30voto

mlk Points 7270

Une recherche rapide sur Google a permis de trouver ce bug : "Mauvais descripteur de fichier lors de l'enregistrement d'un document avec des PDF importés" .

Il semble que vous deviez garder les PDF à fusionner ouverts, jusqu'à ce que vous ayez enregistré et fermé le PDF combiné.

5 votes

Même si le post date de deux ans, cela a permis de résoudre le problème. Il faut les garder ouverts !

4voto

UnderDog Points 335
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 votes

Avaler les exceptions est un mauvais modèle. catch(Exception e){ }

3voto

java_learner Points 119

Le site lien pourrait aider quelqu'un qui cherche une réponse.

1voto

Dave W Points 11

Si vous voulez combiner deux fichiers dont l'un se superpose à l'autre (exemple : le document A est un modèle et le document B contient le texte que vous voulez mettre sur le modèle), cela fonctionne :

après avoir créé "doc", vous voulez écrire votre modèle (templateFile) au-dessus de cela.

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

   overlay.overlay(watermarkDoc, doc);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X