使用C#从另一个PDF文件作为背景水印创建PDF文件

7

我正在寻找一种解决方案,可以让我从C#创建一个PDF输出文件,同时将另一个静态PDF文件合并为背景水印。

我正在开发一个系统,允许用户创建发票的PDF版本。与尝试在C#中重新创建所有发票功能相比,我认为最简单的解决方案是使用空白发票的PDF版本(从Adobe Illustrator创建)作为背景水印,并简单地在其上覆盖动态发票详细信息。

我正在查看Data Dynamics的Active Reports,但似乎他们没有能力覆盖或合并报告到现有的PDF文件中。

还有其他具备此功能的.NET PDF报告产品吗?

3个回答

14

感谢bhavinp。iText似乎可以胜任并且完全符合我的期望。

对于其他试图合并PDF文件和覆盖它们的人,以下基于使用iTextPDF库的示例代码可能会有所帮助。

结果文件是原始文件和背景的组合。

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


    }
}

6

我看到了这个问题,由于免费版本的许可证限制,我无法使用iTextSharp库。

iText AGPL许可证适用于希望在AGPL“版权左翼”条款下将其整个应用程序源代码与开源社区共享为自由软件的开发人员。

然而,我发现PDFSharp可以使用以下代码。

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, 1, 1);

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

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接