Хобрук: Ваш путь к мастерству в программировании

Экспорт отчета о доступе в заполняемую форму PDF

Я хотел бы заполнить форму Adobe Fillable, используя данные, извлеченные из отчета Access. Я был бы признателен за некоторые советы о том, как заставить этот код работать. Я относительно новичок в VBA, поэтому мой самый большой вопрос возникает из-за того, какая часть кода принадлежит Adobe, а какая — полям доступа.

Вот некоторые из моих имен полей для доступа: Payee Extended_Payee, Check Request Date, Invoice Number и т. д. Некоторые из моих имен полей в форме Adobe: 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
09.06.2017

Ответы:


1

Ваш код представляет собой функцию, которая создает и запускает экземпляр AcroExch.app, открывает PDF-документ, на который ссылается переменная FileNm, находит в нем форму, заполняет ее значениями и затем сохраняет. Весь код выполняется Access.

Это код, специфичный для Adobe, поскольку он зависит от API AcroExch.AVDoc:

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 — значение для заполнения этого поля.

09.06.2017
  • Большое спасибо за ответ Александр! Прошу прощения, но я просто хочу убедиться, что я ясно выразился. Нужно ли мне что-то менять в моем коде в начале? Я хочу иметь возможность нажать кнопку в отчете Access, который открывает шаблон формы PDF, заполняет все данные из отчета, а затем сохраняет в виде файла, относящегося к этому счету [Payee Payee_Extended] + [Invoice_Number] + [Check_Request_Date] 09.06.2017
  • Похоже, вы делаете это правильно для меня, за исключением того, что при каждом щелчке вы заполняете и сохраняете один и тот же файл PDF. Чтобы отредактировать новый файл, вы должны скопировать файл в новое место/имя, а затем открыть его оттуда. Вы можете просто добавить FileCopy FileNm, newFileNm перед Open, а затем открыть новый файл с помощью If avDoc.Open(newFileNm, "") Then 09.06.2017
  • Я продолжаю получать помощь на первом поле. Мне интересно, это потому, что отчет о доступе установлен tempvars? Будет ли это иметь какое-то отношение к этому? 09.06.2017
  • Для корректной работы jso.getField в документе PDF должна быть форма с заданным именем и в форме должно быть поле с заданным именем. В вашем случае для первого получения должна быть форма с именем CheckForm и поле с именем Payee_Extended_Payee в ней. 09.06.2017
  • Можете ли вы показать мне пример кода, который вы бы использовали для нового файла? Это дает мне ошибку: Set avDoc = CreateObject(AcroExch.AVDoc) FileCopy FileNm, newFileNm If avDoc.Open(newFileNm,) Then Set pdDoc = avDoc.GetPDDoc() Set jso = pdDoc.GetJSObject 09.06.2017
  • Это то, что я считаю, что у меня есть. Имя PDF-файла — CheckForm.pdf. Поле в форме PDF — Payee, а поле в Access, которое я хочу вставить в форму PDF, — Payee Extended_Payee. Я обновил свой исходный код, чтобы отразить то, что у меня есть сейчас. Все еще получаю сообщение об ошибке. 09.06.2017
  • Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..