【问题标题】:Add background to every page in PDF using iText 7使用 iText 7 为 PDF 中的每一页添加背景
【发布时间】:2020-08-31 09:33:23
【问题描述】:

我有一页的 PDF 文件,我想将它用作第二个 PDF 文件中所有页面的背景,并提供一些信息。我尝试使用 CopyPagesTo 来做到这一点,但它只是每隔一页复制一次 PDF。

private void ApplyBackground(string sourceFilename, string backgroundPdf, int pageNumber) {
    
    PdfDocument srcDocument = new PdfDocument(new PdfReader(sourceFilename));
    PdfDocument bgDocument = new PdfDocument(new PdfReader(backgroundPdf));
    PdfDocument destDocument = new PdfDocument(new PdfWriter(@"C:\Desktop\result.pdf").SetSmartMode(true));

    int pagesCount = srcDocument.GetNumberOfPages();
    for (int i = 1; i <= pagesCount; i++) {
    
        srcDocument.CopyPagesTo(i, i, destDocument);
        bgDocument.CopyPagesTo(1, 1, destDocument);
    }
            
    srcDocument.Close();
    bgDocument.Close();
    destDocument.Close();
}

是否可以像背景一样使用一个 PDF 文件,然后在文本后面的每一页将其放入另一个 PDF 文件中。

【问题讨论】:

    标签: c# pdf itext itext7


    【解决方案1】:

    这是 iText 7 代码。请注意,它假定具有背景的页面和正在处理的文档页面的页面大小相同。

    PdfDocument backgroundDocument = new PdfDocument(new PdfReader(@"path/to/background_doc.pdf"));
    PdfDocument pdfDocument = new PdfDocument(new PdfReader(@"path/to/source.pdf"),
        new PdfWriter(@"path/to/target.pdf"));
    PdfFormXObject backgroundXObject = backgroundDocument.GetPage(1).CopyAsFormXObject(pdfDocument);
    for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++) {
        PdfPage page = pdfDocument.GetPage(i);
        PdfStream stream = page.NewContentStreamBefore();
        new PdfCanvas(stream, page.GetResources(), pdfDocument).AddXObject(backgroundXObject, 0, 0);
    }
    pdfDocument.Close();
    backgroundDocument.Close();
    

    【讨论】:

      【解决方案2】:

      根据我的理解,您正在寻找以下解决方案。如果我错过了什么,请告诉我。

      1. 为要为其创建背景的原始 PDF 创建阅读器。
      2. 为背景 PDF 创建 PDF 阅读器
      3. 在要生成最终 PDF 的位置创建 PDF 压模。
      4. 为 Stamper 使用 GetImportedPage 方法获取背景。
      5. 循环播放原始 PDF 页面的所有页面并添加背景。

      下面是代码:

      static void CreatePdfwithBackGround(string originalPdf, string backgroundPdf, string destPdf)
          {
              PdfReader originalPdfReader = new PdfReader(originalPdf);
              PdfReader backgroundPdfReader = new PdfReader(backgroundPdf);
              // Create the stamper for Destination pdf
              PdfStamper stamper = new PdfStamper(originalPdfReader, new FileStream(destPdf, FileMode.Create));
              // Add the backgroundPdf to each page of original PDF
              PdfImportedPage page = stamper.GetImportedPage(backgroundPdfReader, 1);
              int pageCount = originalPdfReader.NumberOfPages;
              PdfContentByte background;
              for (int i = 1; i <= pageCount; i++)
              {
                  background = stamper.GetUnderContent(i);
                  background.AddTemplate(page, 0, 0);
              }
              // Close the Destination stamper
              stamper.Close();
          }
      

      示例调用是:

      CreatePdfwithBackGround(@"C:\TEST\MainPDF.pdf", @"C:\TEST\BackGroundTemplate.pdf", @"C:\TEST\FinalPDFOutput.pdf");
      

      【讨论】:

      • 您的解决方案运行良好,但仅限于 iText5。
      猜你喜欢
      • 2019-01-04
      • 2017-04-13
      • 2020-03-21
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多