2010-11-19 21 views
5

Je suis à la recherche d'une solution qui me permettra de créer un PDF outfile de C# qui fusionne également en un fichier PDF statique séparé comme filigrane d'arrière-plan .Besoin de créer un fichier PDF à partir de C# avec un autre fichier PDF comme filigrane d'arrière-plan

Je travaille sur un système qui permettra aux utilisateurs de créer une version PDF de leur facture. Plutôt que d'essayer de recréer toutes les fonctionnalités de la facture dans C#, la solution la plus simple serait d'utiliser la version PDF de la facture vierge (créée à partir d'Adobe Illustrator) comme filigrane d'arrière-plan et de superposer les détails dynamiques de la facture. J'ai regardé Active Reports de Data Dynamics, mais il ne semble pas qu'ils ont la possibilité de superposer, ou de fusionner, un rapport sur un fichier PDF existant.

Y a-t-il un autre produit de rapport .NET PDF qui a cette capacité?

Merci

Répondre

13

Merci bhavinp. iText semble faire l'affaire et travailler exactement comme je l'espérais.

Pour quiconque tente de fusionner des fichiers PDF et de les superposer, l'exemple de code suivant basé sur l'utilisation de la bibliothèque iTextPDF peut vous aider.

Le fichier résultat est une combinaison de l'original et historique

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 


namespace iTextTest 
{ 
    class Program 
    { 
         /** The original PDF file. */ 
     const String Original = @"C:\Jobs\InvoiceSource.pdf"; 
     const String Background = @"C:\Jobs\InvoiceTemplate.pdf"; 
     const String Result = @"C:\Jobs\InvoiceOutput.pdf"; 

     static void Main(string[] args) 
     { 
      ManipulatePdf(Original, Background, Result); 
     } 

     static void ManipulatePdf(String src, String stationery, String dest) 
     { 
      // Create readers 
      PdfReader reader = new PdfReader(src); 
      PdfReader sReader = new PdfReader(stationery); 
      // Create the stamper 
      PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create)); 
      // Add the stationery to each page 
      PdfImportedPage page = stamper.GetImportedPage(sReader, 1); 
      int n = reader.NumberOfPages; 
      PdfContentByte background; 
      for (int i = 1; i <= n; i++) 
      { 
       background = stamper.GetUnderContent(i); 
       background.AddTemplate(page, 0, 0); 
      } 
      // CLose the stamper 
      stamper.Close(); 
     } 


    } 
} 
+0

+1 pour le suivi de votre propre question. –

+0

merci, a bien fonctionné – Ello

0

je suis tombé sur cette question et ne pouvait pas utiliser la bibliothèque iTextSharp en raison de la licence sur la version gratuite

Le iText La licence AGPL est destinée aux développeurs qui souhaitent partager leur code source d'application complet avec la communauté open-source en tant que logiciel libre sous les termes «copyleft» d'AGPL.

Cependant, j'ai trouvé que PDFSharp fonctionnait avec le code ci-dessous.

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using PdfSharp.Drawing; 
using PdfSharp.Pdf; 
using PdfSharp.Pdf.IO; 

namespace PDFTest 
{ 
    class Program 
    { 
     static Stream Main(string[] args) 
     { 
      using (PdfDocument originalDocument= PdfReader.Open("C:\\MainDocument.pdf", PdfDocumentOpenMode.Import)) 
      using (PdfDocument outputPdf = new PdfDocument()) 
      { 
       foreach (PdfPage page in originalDocument.Pages) 
       { 
        outPutPdf.AddPage(page); 
       } 
       var background = XImage.FromFile("C:\\Watermark.pdf"); 
       foreach (PdfPage page in outputPdf.Pages) 
       { 
        XGraphics graphics = XGraphics.FromPdfPage(page); 
        graphics.DrawImage(background , Point.Empty); 

       } 
       MemoryStream stream = new MemoryStream(); 
       outputPdf.Save("C:\\OutputFile.pdf"); 
      } 
     } 
    } 
}