【问题标题】:generating pdf files from excel sheet using xml and windows forms使用 xml 和 windows 表单从 excel 表生成 pdf 文件
【发布时间】:2016-10-05 19:24:53
【问题描述】:

我需要开发一个从 excel 工作表数据生成 pdf 文件的 Windows 窗体应用程序。应使用 xml 文件将数据从 excel 工作表映射到 pdf 中的控件。必须为每个文件生成一个 pdf 文件单击一个按钮,Excel 表的行。这是如何完成的?

【问题讨论】:

  • 搜索 iTextSharp。您可以开发一个带有网格的 PDF 模板并填写单元格或动态创建 PDF(我猜可能需要做很多工作。)
  • @rheitzman 我已经有一个 pdf 模板。您如何使用 excel 表行中的值填写 pdf 中的特定字段?并且必须为每一行完成..
  • 我下面的“答案”应该会有所帮助。您必须创建代码来读取 Excel 行,将 Excel 列与 PDF 字段名称匹配,并调用提供例程。祝你好运!

标签: c# xml excel winforms pdf-generation


【解决方案1】:

这是一个库例程,它使用字段名称和值的字典来填充 PDF 模板。对于您的情况,您需要从 Excel 行数据创建字典,将数据正确映射到模板中的字段名称(区分大小写)。除非您想插入默认值,否则无需填写“缺失”字段。

该项目将需要对 itextsharp 的引用。需要将 itextsharp.dll 复制到输出目录。

Imports iTextSharp.text.pdf
Import System.IO
Public Function FillPDFForm(PDF_MasterPath As String, Flds As Dictionary(Of String, String), Optional PDF_FinalPath As String = "", Optional FlattenForm As Boolean = True) As Boolean
    ' case matters: Dictionary Keys == PDF Form Field Names
    Dim pdfFormFields As AcroFields
    Dim pdfReader As PdfReader
    Dim pdfStamper As PdfStamper

    Try
        If PDF_FinalPath = "" Then PDF_FinalPath = PDF_MasterPath.Replace(".pdf", "_Out.pdf")
        Dim newFile As String = PDF_FinalPath

        pdfReader = New PdfReader(PDF_MasterPath)
        pdfStamper = New PdfStamper(pdfReader, New FileStream(newFile, FileMode.Create))
        pdfReader.Close()
        pdfFormFields = pdfStamper.AcroFields

        For Each sKVP As KeyValuePair(Of String, String) In Flds
            pdfFormFields.SetField(sKVP.Key, sKVP.Value)
        Next

        ' flatten the form to remove editing options?
        ' set it to false to leave the form open to subsequent manual edits
        If My.Computer.Keyboard.CtrlKeyDown Then
            ' leave in editable state
            pdfStamper.FormFlattening = False
        Else
            pdfStamper.FormFlattening = FlattenForm
        End If

        pdfStamper.Close()

        Process.Start(newFile)
        Return True
    Catch ex As Exception
        MsgBox(ex.Message)
        Return False
    Finally
        pdfStamper = Nothing
        pdfReader = Nothing
    End Try
End Function

下面是一些从 PDF 表单中获取表单字段名称的代码:

Private Function PDFFieldNames(pdfPath As String) As String
    Try
        Dim s As String = ""

        ' create a new PDF reader based on the PDF template document
        Dim pdfReader As PdfReader = New PdfReader(pdfPath)

        Dim fields As IDictionary(Of String, iTextSharp.text.pdf.AcroFields.Item) = pdfReader.AcroFields.Fields
        For Each key As String In fields.Keys
            's = "pdfFormFields.SetField(""{fname}"", Row!{fname})".Replace("{fname}", key)
            s &= key & "|"
        Next
        pdfReader.Close()
        Return s
    Catch ex As Exception
        MsgBox(ex.Message)
        Return ""
    End Try
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2014-03-29
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多