使用 iText 7 为 PDF 中的每一页添加背景

Add background to every page in PDF using iText 7

我有一页 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 文件中的每一页都放在文本后面。

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

  1. 为要为其创建背景的原始 PDF 创建 reader。
  2. 为背景 PDF 创建 PDF reader
  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");

这是 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();