2010-11-19 20 views
5

Sto cercando una soluzione che mi consenta di creare un file PDF da C# che si fonda anche in un file PDF statico separato come filigrana di sfondo .È necessario creare un file PDF da C# con un altro file PDF come filigrana dello sfondo

Sto lavorando a un sistema che consentirà agli utenti di creare una versione PDF della loro fattura. Invece di provare a ricreare tutte le funzionalità della fattura all'interno di C#, ritengo che la soluzione più semplice sarebbe utilizzare la versione PDF della fattura vuota (creata da Adobe Illustrator) come filigrana di sfondo e sovrapporre semplicemente i dettagli della fattura dinamica in alto.

Stavo guardando Active Reports da Data Dynamics, ma non sembra che abbiano la possibilità di sovrapporre o unire un report su un file PDF esistente.

Esiste un altro prodotto di report .NET in formato PDF con questa capacità?

Grazie

risposta

13

Grazie bhavinp. iText sembra fare il trucco e funziona esattamente come speravo.

Per chiunque altro provi a unire in file PDF e li sovrapponga, il seguente codice di esempio basato sull'utilizzo della libreria iTextPDF potrebbe essere di aiuto.

Il file risultato è una combinazione di originale e sfondo

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 per il follow-up sulla tua stessa domanda. –

+0

grazie, ha funzionato alla grande – Ello

0

mi sono imbattuto in questa domanda e non sono riuscito a utilizzare la libreria iTextSharp a causa della licenza della versione gratuita

L'iText La licenza AGPL è destinata agli sviluppatori che desiderano condividere l'intero codice sorgente dell'applicazione con la comunità open source come software libero secondo i termini "copyleft" AGPL.

Tuttavia ho trovato PDFsharp a lavorare usando il codice seguente.

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"); 
      } 
     } 
    } 
}