2010-11-03 6 views
5

Je vais poser cette question en termes simples.ITextSharp - fusionner deux pdfs en une seule page

Je PDF:

_____ 
|abcd | 
|  | 
|  | 
|_____| 

Et celui-ci:

_____ 
|1234 | 
|4567 | 
|  | 
|_____| 

Je veux les fusionner pour obtenir:

_____ 
|abcd | 
|1234 | 
|4567 | 
|_____| 

Il est possible en utilisant iTextSharp ou tout autre outil gratuit?

Merci à l'avance

Répondre

0

Oui ... il est juste très dur, même pour un expert en PDF. Et en posant la question, vous avez montré que vous n'êtes pas un ... du moins pas encore. Tirez ceci et vous serez sur votre chemin ... Mais:

Il n'y a pas de moyen facile de déterminer une boîte englobante qui entoure tout le contenu d'une page donnée. com.itextpdf.text.pdf.parser (ou son équivalent #) a plusieurs classes qui pourraient vous aider le long du chemin, mais l'essentiel est que PDF n'est pas conçu pour être analysable comme ça.

I fortement vous recommandons d'essayer une autre approche. Tout ce qui implique l'expression "et ensuite nous obtenons l'information sur le PDF" a besoin d'une refonte. Oh, c'est possible, mais il y a presque toujours une meilleure façon de le faire.

0

Nous avons utilisé un produit appelé PDFMerger qui ferait exactement cela. Ce n'était pas bon marché cependant. Nous n'avons pas vraiment trouvé autre chose qui pourrait facilement accomplir cela.

3

c'est une vieille question ... mais si quelqu'un rentre ici ma solution était cette ... je l'ai fait dur codé pour deux pages en une seule page c'est donc les bases d'abord j'ai fait pivoter les deux fichiers PDF après que je les fusionner ensemble

pour faire pivoter les deux pages utilisent ceci:

public static void RotatePDF(string inputFile, string outputFile) 
    { 
     using (FileStream outStream = new FileStream(outputFile, FileMode.Create)) 
     { 
      iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inputFile); 
      iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, outStream); 

      iTextSharp.text.pdf.PdfDictionary pageDict = reader.GetPageN(1); 
      int desiredRot = 90; // 90 degrees clockwise from what it is now 
      iTextSharp.text.pdf.PdfNumber rotation = pageDict.GetAsNumber(iTextSharp.text.pdf.PdfName.ROTATE); 

      if (rotation != null) 
      { 
       desiredRot += rotation.IntValue; 
       desiredRot %= 360; // must be 0, 90, 180, or 270 
      } 
      pageDict.Put(iTextSharp.text.pdf.PdfName.ROTATE, new iTextSharp.text.pdf.PdfNumber(desiredRot)); 

      stamper.Close(); 
     } 
    } 

maintenant vous pouvez les fusionner:

 public static void MergeTwoPdfsToSingle(string inputFile1, string inputFile2, string outputFile) 
    { 
     //Step 1: Create a Docuement-Object 
     Document document = new Document(); 
     try 
     { 
      //Step 2: we create a writer that listens to the document 
      PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFile, FileMode.Create)); 

      //Step 3: Open the document 
      document.Open(); 

      PdfContentByte cb = writer.DirectContent; 
      PdfImportedPage page1; 
      PdfImportedPage page2;     

      // we create a reader for the document 
      PdfReader reader1 = new PdfReader(inputFile1); 
      PdfReader reader2 = new PdfReader(inputFile2); 

      document.SetPageSize(reader1.GetPageSizeWithRotation(1)); 
      document.NewPage(); 

      page1 = writer.GetImportedPage(reader1, 1);         

      page2 = writer.GetImportedPage(reader2, 1);     

      cb.AddTemplate(page1, 0, 0); 
      //play around to find the exact location for the next pdf 
      cb.AddTemplate(page2, 0, 300); 
     } 
     catch (Exception e) { throw e; } 
     finally { document.Close(); } 
    } 
+0

hasard vous kno Quelque chose à éviter pour éviter de perdre des données comme des formulaires/contrôles Adobe Acrobat DC? J'ai testé votre code et cela fonctionne très bien pour les graphiques et les textes des fichiers PDF, mais je perds les contrôles comme les zones de texte, les listes déroulantes et d'autres contrôles Adobe Acrobat DC modifiables. –

+1

@PaulWeiland - D'après ce que j'ai lu sur d'autres threads si vous souhaitez conserver les contrôles lors de la copie dans un nouveau PDF, vous devez utiliser la classe PDFCopy. – jaredbaszler

+0

@ jaredbaszler thx, va vérifier cela –

Questions connexes