【问题标题】:Merging two PDF pages on top of each other将两个 PDF 页面合并在一起
【发布时间】:2013-07-11 08:57:37
【问题描述】:

我正在寻找一种方法来合并两个 pdf 页面的内容。 它可以是水印、图像或其他任何东西。

场景如下: 我有一个 Word 插件,它允许用户根据几个模板表单为不同的客户创建不同的模板。对于每个新客户,用户可以提供包含页眉图像/徽标和页脚的新信纸。这无论如何都应在运行时应用。可能是直接加载到模板标题中的图像(然后我需要将 pdf 渲染为图像,因为信纸将主要作为 pdf 文件提供)或导出文档时(将信纸合并为背景) .

但是模板不能被用户访问,所以这必须以编程方式完成。

到目前为止,我尝试了 Pdfsharp 库,它既不支持我提供的背景文件的版本,也不支持我在 Word 2007 中创建的文档的版本。 iTextSharp 看起来很有前途,但到目前为止我无法合并内容。 我也试过 pdftk.exe,但即使我从命令行手动运行它,我也收到错误:“完成。输入错误,所以没有创建输出。”

如何处理并不重要,重要的是输出。

我忘了说,Word 模板中创建了一条白线用于存档目的,因此这部分可能不会作为图像添加,或者必须在输出文档中添加后缀。

提前致谢!

【问题讨论】:

    标签: c# pdf itextsharp


    【解决方案1】:

    StampStationery.csWebified iTextSharp Examples 中的一个示例,本质上是iText in Action — 2nd Edition 书中 Java/iText 示例的 C#/iTextSharp 版本,它确实展示了如何将一个 PDF 文档中的页面内容添加为另一个 PDF 的每一页内容背后的信纸。

    中心方法是这样的:

    public byte[] ManipulatePdf(byte[] src, byte[] stationery)
    {
      // Create readers
      PdfReader reader = new PdfReader(src);
      PdfReader s_reader = new PdfReader(stationery);
      using (MemoryStream ms = new MemoryStream())
      {
        // Create the stamper
        using (PdfStamper stamper = new PdfStamper(reader, ms))
        {
          // Add the stationery to each page
          PdfImportedPage page = stamper.GetImportedPage(s_reader, 1);
          int n = reader.NumberOfPages;
          PdfContentByte background;
          for (int i = 1; i <= n; i++)
          {
            background = stamper.GetUnderContent(i);
            background.AddTemplate(page, 0, 0);
          }
        } 
        return ms.ToArray();   
      }
    }  
    

    此方法将处理后的 PDF 作为 byte[]. 返回

    【讨论】:

    • 谢谢,这看起来很有希望,我会检查一下!
    • 只是为了澄清:完全按照我的意愿工作!将文件读取为 byte[],调用此函数,保存字节 - 完成! :)
    • 太棒了!但是请注意:如果您的文档很大,您可能需要使用不同的 PdfReader 构造函数(它不需要内存中的整个 PDF)并使用一些文件流而不是 MemoryStream 作为输出。否则您的资源可能会不足,尤其是当您同时从多个线程调用该方法时。
    猜你喜欢
    • 2013-06-13
    • 2011-05-04
    • 2019-10-30
    • 2017-10-23
    • 2018-07-22
    • 2018-06-27
    • 2010-10-06
    • 2016-03-25
    • 2014-11-16
    相关资源
    最近更新 更多