【问题标题】:Export Access report to PDF Fillable Form将访问报告导出为 PDF 可填写表格
【发布时间】:2017-06-09 12:25:37
【问题描述】:

我想使用从 Access 报告中提取的数据填充 Adob​​e Fillable 表单。我将不胜感激有关如何使此代码正常工作的一些建议。我对 VBA 比较陌生,所以我最大的问题来自代码的哪一部分是 Adob​​e,哪一部分来自 Access 字段。

我的一些访问字段名称是:Payee Extended_Payee、Check Request Date、Invoice Number 等。 我在 Adob​​e 表单中的一些字段名称是:Payee、Today's Date、Invoice Number 等。

这是我到目前为止的编码 - 我想澄清一下代码的哪一部分应该反映 adobe 字段,哪一部分应该来自 Access :

   Private Sub Export_Click()

Dim FileNm, gApp, avDoc, pdDoc, jso

FileNm = "M:\Check_Requests\2017\PDF_Exports\CheckForm.pdf" 'File location
Set gApp = CreateObject("AcroExch.app")

Set avDoc = CreateObject("AcroExch.AVDoc")
FileCopy FileNm, newFileNm
If avDoc.Open(newFileNm, "") Then
    Set pdDoc = avDoc.GetPDDoc()
    Set jso = pdDoc.GetJSObject

    jso.getField("CheckForm[0].Page1[0].Payee[0]").Value = "Payees_Extended_Payee"
    jso.getField("CheckForm[0].Page1[0].Address[0]").Value = "Address"
    jso.getField("CheckForm[0].Page1[0].City[0]").Value = "City"
    jso.getField("CheckForm[0].Page1[0].State[0]").Value = "State"
    jso.getField("CheckForm[0].Page1[0].Zip_Code[0]").Value = "Zip_Code"
    jso.getField("CheckForm[0].Page1[0].Comments_to_Include_on_Remittance[0]").Value = "Description_of_Expense"
    jso.getField("CheckForm[0].Page1[0].Todays_Date[0]").Value = "Check_Request_Date"
    jso.getField("CheckForm[0].Page1[0].Invoice_Number[0]").Value = "Invoice_Number"
    jso.getField("CheckForm[0].Page1[0].Invoice_Date[0]").Value = "Invoice_Date"
    jso.getField("CheckForm[0].Page1[0].Total_Amount[0]").Value = "Total_Amount"
    jso.getField("CheckForm[0].Page1[0].Description_of_Expense[0]").Value = "Description_of_Expense"
    jso.getField("CheckForm[0].Page1[0].Other[0]").Value = "Other"
    jso.getField("CheckForm[0].Page1[0].GL1[0]").Value = "GL_Company"
    jso.getField("CheckForm[0].Page1[0].AU1[0]").Value = "Accounting Unit"
    jso.getField("CheckForm[0].Page1[0].A1[0]").Value = "Account"
    jso.getField("CheckForm[0].Page1[0].CODE1[0]").Value = "Project_Code"
    jso.getField("CheckForm[0].Page1[0].AMOUNT1[0]").Value = "Amount_Split_1"
    jso.getField("CheckForm[0].Page1[0].GL2[0]").Value = "GL_Company_2"
    jso.getField("CheckForm[0].Page1[0].AU2[0]").Value = "Accounting_Unit_2"
    jso.getField("CheckForm[0].Page1[0].A2[0]").Value = "Account_2"
    jso.getField("CheckForm[0].Page1[0].CODE2[0]").Value = "Project_Code_2"
    jso.getField("CheckForm[0].Page1[0].AMOUNT2[0]").Value = "Amount_Split_2"
    jso.getField("CheckForm[0].Page1[0].GL3[0]").Value = "GL_Company_3"
    jso.getField("CheckForm[0].Page1[0].AU3[0]").Value = "Accounting_Unit_3"
    jso.getField("CheckForm[0].Page1[0].A3[0]").Value = "Account_3"
    jso.getField("CheckForm[0].Page1[0].CODE3[0]").Value = "Project_Code_3"
    jso.getField("CheckForm[0].Page1[0].AMOUNT3[0]").Value = "Amount_Split_3"
    jso.getField("CheckForm[0].Page1[0].Total[0]").Value = "Amount_Total"
    jso.getField("CheckForm[0].Page1[0].Requestor[0]").Value = "Requestor"
    jso.getField("CheckForm[0].Page1[0].Approving Manager[0]").Value = "Approving_Manager"
    jso.getField("CheckForm[0].Page1[0].Extension[0]").Value = "Extension"
    jso.getField("CheckForm[0].Page1[0].Email_Address[0]").Value = "Email_Address"
    pdDoc.Save PDSaveIncremental, FileNm 'Save changes to the PDF document
    pdDoc.Close
    End If
'Close the PDF; the True parameter prevents the Save As dialog from showing
avDoc.Close (True)

'Some cleaning
Set gApp = Nothing
Set avDoc = Nothing
Set pdDoc = Nothing
Set jso = Nothing

End Sub

【问题讨论】:

    标签: vba ms-access pdf export


    【解决方案1】:

    您的代码是一个创建和运行 AcroExch.app 实例的函数,打开变量 FileNm 引用的 PDF 文档,在其中找到表单,用值填充它,然后保存它。所有代码都由 Access 执行。

    这是“Adobe 特定”代码,因为它依赖于 AcroExch.AVDoc 的 API:

    If avDoc.Open(FileNm, "") Then
        Set pdDoc = avDoc.GetPDDoc()
        Set jso = pdDoc.GetJSObject
    
        jso.getField("CheckForm[0].Page1[0].Payee_Extended_Payee[0]").Value = "Payee Extended_Payee"
        jso.getField("CheckForm[0].Page1[0].Address[0]").Value = "Mailing Address"
        jso.getField("CheckForm[0].Page1[0].City[0]").Value = "Mailing Address"
        jso.getField("CheckForm[0].Page1[0].State[0]").Value = "Mailing Address"
        jso.getField("CheckForm[0].Page1[0].Zip_Code[0]").Value = "Mailing Address"
        jso.getField("CheckForm[0].Page1[0].Description_of_Expense[0]").Value = "Comments to Include on Remin"
        jso.getField("CheckForm[0].Page1[0].Check_Request_Date[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Invoice_Number[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Invoice_Date[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Total_Amount[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Other[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].GL1[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AU1[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].A1[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AMOUNT1[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].GL2[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AU2[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].A2[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AMOUNT2[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].GL3[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AU3[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].A3[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].AMOUNT3[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Amount_Total[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Requestor[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Approving Manager[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Extension[0]").Value = "Installer_or_Owner"
        jso.getField("CheckForm[0].Page1[0].Email_Address[0]").Value = "Installer_or_Owner"
        pdDoc.Save PDSaveIncremental, FileNm 'Save changes to the PDF document
        pdDoc.Close
        End If
    'Close the PDF; the True parameter prevents the Save As dialog from showing
    avDoc.Close (True)
    

    字段中的值由表达式设置:

    jso.getField("FormName[0].Page1[0].FieldName[0]").Value = NewValue
    

    其中FormName 是 PDF 文档中的表单名称,FieldName - 表单中的字段名称,NewValue - 填写此字段的值。

    【讨论】:

    • 非常感谢您回复亚历山大!我道歉,但我只是想确保我清楚。我需要在开始时用我的代码更改任何内容吗?我确实希望能够单击 Access 报告上的按钮,打开 PDF 表单模板,填写报告中的所有数据,然后保存为特定于该发票的文件 [Payee Payee_Extended] + [Invoice_Number] + [Check_Request_Date]
    • 看起来您这样做对我来说是正确的,只是每次单击时您都会填写并保存相同的 pdf 文件。要编辑新文件,您必须将文件复制到新位置/名称,然后从那里打开它。您可以在打开之前添加FileCopy FileNm, newFileNm,然后使用If avDoc.Open(newFileNm, "") Then打开新文件
    • 我一直在第一次获取帮助。我想知道是否是因为访问报告是由临时变量设置的?这和它有什么关系吗?
    • 对于jso.getField 的正确工作,PDF 文档中必须有给定名称的表格,并且在表格中必须有给定名称的字段。在您的情况下,首先必须有名称为 CheckForm 的表单和名称为 Payee_Extended_Payee 的字段。
    • 您能给我看一个您将用于新文件的代码示例吗?这给了我一个错误: Set avDoc = CreateObject("AcroExch.AVDoc") FileCopy FileNm, newFileNm If avDoc.Open(newFileNm, "") Then Set pdDoc = avDoc.GetPDDoc() Set jso = pdDoc.GetJSObject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多