2010-11-19 26 views
5

Estoy buscando una solución que me permita crear un archivo PDF desde C# que también se combina en un archivo PDF estático separado como marca de fondo .Necesito crear un archivo PDF desde C# con otro archivo PDF como la marca de agua de fondo

Estoy trabajando en un sistema que permitirá a los usuarios crear una versión en PDF de su factura. En lugar de intentar recrear todas las características de la factura dentro de C#, creo que la solución más fácil sería usar la versión PDF de la factura en blanco (creada desde Adobe Illustrator) como marca de fondo y simplemente superponer los detalles de la factura dinámica en la parte superior.

Estaba viendo informes activos de Data Dynamics, pero parece que no tienen la capacidad de superponer o combinar un informe en un archivo PDF existente.

¿Hay algún otro producto de informe .NET PDF que tenga esta capibilty?

Gracias

Respuesta

13

Gracias bhavinp. iText parece hacer el truco y funciona exactamente como estaba esperando.

Para cualquier otra persona que intente combinar archivos PDF y superponerlos, el siguiente código de ejemplo basado en el uso de la biblioteca iTextPDF podría ayudar.

el archivo de resultados es una combinación de original y antecedentes

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 para el seguimiento de su propia pregunta. –

+0

gracias, funcionó muy bien – Ello

0

me encontré con esta pregunta y no podía usar la biblioteca iTextSharp debido a la licencia de la versión libre de

El iText La licencia de AGPL es para desarrolladores que desean compartir el código fuente completo de su aplicación con la comunidad de código abierto como software libre bajo los términos de "copyleft" de AGPL.

Sin embargo, encontré que PDFSharp funciona con el siguiente código.

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