2010-11-19 29 views
5

Szukam rozwiązania, które pozwoli mi utworzyć plik wyjściowy PDF z C#, który również łączy się w osobnym, statycznym pliku PDF jako znak wodny tła .Potrzebuję utworzyć plik PDF z C# z innym plikiem PDF jako znak wodny

Pracuję nad systemem, który pozwoli użytkownikom na utworzenie wersji PDF faktury. Zamiast próbować odtworzyć wszystkie funkcje faktur w C#, myślę, że najłatwiejszym rozwiązaniem byłoby użycie wersji PDF dla pustej faktury (utworzonej z Adobe Illustrator) jako znaku wodnego tła i po prostu nałożyć na nią szczegóły faktury dynamicznej.

Szukałem Active Reports z Data Dynamics, ale okazuje się, że nie mają one możliwości nałożenia lub scalenia raportu na istniejący plik PDF.

Czy istnieje inny produkt raportowania .NET PDF, który ma taką właściwość?

Dzięki

Odpowiedz

13

Dziękuję bhavinp. iText wydaje się działać i działa dokładnie tak, jak oczekiwałem.

Dla każdego, kto próbuje połączyć się z plikami PDF i nałożyć na nie nakładki, pomocny może być poniższy kod przykładowy oparty na korzystaniu z biblioteki iTextPDF.

pliku wynikowym jest połączeniem oryginalnego i tła

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 za uzupełnienie na własne pytanie. –

+0

dziękuję, świetnie się spisałeś – Ello

0

natknąłem to pytanie i nie mógł korzystać z biblioteki iTextSharp dzięki licencji na bezpłatnej wersji

iText Licencja AGPL jest przeznaczona dla programistów, którzy chcą udostępnić swój cały kod źródłowy aplikacji społeczności open source jako wolne oprogramowanie zgodnie z warunkami licencji "copyleft" AGPL.

Jednak znalazłem PDFSharp do pracy przy użyciu poniższego kodu.

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