【问题标题】:Append created PDF page with existing PDF file with iTextSharp使用 iTextSharp 将创建的 PDF 页面附加到现有 PDF 文件
【发布时间】:2016-01-29 16:37:37
【问题描述】:

我目前正在创建(我认为应该是的)一个非常简单的方法来附加两个 PDF 文件。

首先,我的方法创建了一个页面,其中包含所有客户详细信息作为数字签名。我可以正常工作并保存到单页 PDF 文件中。

但是,我现在想将他们签署的条款和条件附加到 PDF 的底部。我正在编写的解决方案使用 VB.NET,但如果您愿意,可以在 C# 中提供答案,因为我对两者都很熟悉。我真的无法理解 iTextSharps 流程。

这是我目前的代码:

Public Sub CreateDocument() Handles btnCreate.ServerClick

    Dim path As [String] = Server.MapPath("PDFs")
    Dim document As New Document()
    Dim writer As PdfWriter = PdfWriter.GetInstance(document, New FileStream(path + "/" + _AccountNo + "-RegAgreement.pdf", FileMode.Create))

    'Removed chunk of code here, just defining content chunks and paragraphs
     for the dynamically created page, left in the construction
     part which you can see below'


    'Construct digitally signed agreement page'
    document.Open()
    document.NewPage()
    document.Add(pHeader)

    table.SpacingBefore = 30.0F
    table.SpacingAfter = 60.0F
    document.Add(table)

    pAgreement.SpacingAfter = 20.0F
    document.Add(pAgreement)

    document.Add(pSignedBy)
    document.Add(imgSig)
    document.Add(pFooter1)
    document.Add(pFooter2)
    document.Add(pFooter3)

    writer.Close()
    document.Close()

现在这是我添加到上述子文件末尾以附加 PDF 的位。据我所知,您需要使用 PdfCopy 将信息从 PDF 传输到新的 Document 对象(在本例中为 doc)。但是,我找不到将这些添加到动态创建的 PDF 的方法。

有没有办法在复印机中打开它,然后从第 2 页开始复印?

    Dim terms As New PdfReader(path + "/termsconditions.pdf")
    Dim doc As New Document()
    Dim copier As New PdfCopy(doc, New FileStream(path + "/" + _accountNo + "-RegAgreement2.pdf", FileMode.Create))

    'Append Ts & Cs'
    For i As Integer = 1 To terms.NumberOfPages
        Dim importedPage As PdfImportedPage = copier.GetImportedPage(terms, i)
        copier.AddPage(importedPage)
    Next

    terms.Close()
    terms.Close()

End Sub

到目前为止,我看到的每个解决方案都使用了不同的方法,例如页戳或内存流,但它们都没有奏效或给我所需的结果。

非常感谢任何帮助!

更新

好的,在@mkl 的建议之后,我现在将动态生成的文档带回给阅读器,但是它返回一个空值,表明 .PDF 是空白的,但事实并非如此。 (我的目录中有文件,所有内容都填满了)

        Dim copier As New PdfCopy(document, New FileStream(path + "/" + _distNo + "-RegAgreement2.pdf", FileMode.OpenOrCreate))
    Dim reader As New PdfReader(path + "/" + _distNo + "-RegAgreement.pdf")

    'retrieve dynamic document
    Dim dynamicPage As PdfImportedPage = copier.GetImportedPage(reader, 1)
    copier.AddPage(dynamicPage)

    'Append Ts & Cs
    For i As Integer = 1 To terms.NumberOfPages
        Dim importedPage As PdfImportedPage = copier.GetImportedPage(terms, i)
        copier.AddPage(importedPage)
    Next

这是因为它是在同一个子程序中完成的吗?

【问题讨论】:

  • 创建您的动态 PDF,就像您在第一个代码块中所做的那样。然后使用 PdfCopy 创建一个新的 PDF,在其中添加新创建的动态 PDF 和包含所有这些术语的 PDF。
  • @mkl 我试过了,但我不能对“文档”对象做任何事情,因为它被锁定在 PdfWriter 中,如果我关闭它,我会收到另一个错误,因为文档仍在被使用东西。
  • @SamBC 不,不是document 对象。 Document 实例只能用于一项任务。因此,在创建了初始动态 PDF 之后,您在磁盘上就有了一个 PDF 文件。现在从该文件创建一个PdfReader 实例,并在您的第二个代码块中从该阅读器导入所有页面,然后再从PdfReader terms 导入页面。
  • 我在您的代码中看不到任何数字签名的痕迹。我希望您谈论的是电子签名,因为一旦您对 PDF 进行了数字签名,如果您尝试附加额外的页面,数字签名中断。
  • 但是它返回一个空值 - null 是什么? reader? dynamicPage?据我记得 VB,除非您执行类似 On Error Resume Next 的操作,否则两者都不应该被使用。

标签: asp.net vb.net pdf itextsharp


【解决方案1】:

已解决,非常感谢 @mkl 在此问题上。

我面临的问题是因为我没有为复印机创建要写入的 Document 对象。

    Dim doc As New Document()
    Dim copier As New PdfCopy(doc, New FileStream(path + "/" + _distNo + "-RegAgreement.pdf", FileMode.Create))
    'Open PDF created earlier in subroutine'
    Dim reader As New PdfReader(path + "/" + _distNo + "-Signed.pdf")

    doc.Open()
    'Copy first (And only) page of dynamic PDF'
    Dim dynamicPage As PdfImportedPage = copier.GetImportedPage(reader, 1)
    copier.AddPage(dynamicPage)

    'Append Ts & Cs'
    For i As Integer = 1 To terms.NumberOfPages
        Dim importedPage As PdfImportedPage = copier.GetImportedPage(terms, i)
        copier.AddPage(importedPage)
    Next

    doc.Close()
    terms.Close()
    reader.Close()
    copier.Close()

    'For temporary purposes, delete local file'
    'This will be done in output stream in end release'
    File.Delete(path + "/" + _distNo + "-Signed.pdf")

感谢各位的帮助。我想我现在已经掌握了 iTextSharp 这个东西的基本程序!

【讨论】:

  • 这似乎无法解决您将 PDF 附加到现有 PDF 的原始问题。如果我没看错,它似乎会创建一个新的 PDF 输出文件。我正在寻找一种使用 iTextSharp 将 PDF 附加到现有 PDF 的解决方案。这段代码能做到吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2011-05-06
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多