Вопрос:

Acrobat не может читать .FDF, написанный с помощью Excel VBA

excel vba excel-vba acrobat fdf

250 просмотра

3 ответа

29 Репутация автора

Я экспортировал PDF с полями формы в FDF и написал подпрограмму для вывода другого дословного FDF со значениями ячеек для значений полей формы. Если я редактирую FDF в текстовом редакторе и изменяю значения, Acrobat может читать файл очень хорошо, но вывод файла с VBA выдает ошибку:

Adobe не может открыть какой- либо файл .fdf, поскольку он либо не поддерживается типом файла, либо потому что файл поврежден

Я пробовал два разных типа разрывов строк, я пробовал похожую подпрограмму с форматированием xfdf, которая немного отличается с теми же результатами.

Sub something()

Dim sht As Worksheet
Set sht = Sheets("owssvr")

Dim lastrow As Integer
lastrow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim Fileout As Object

Dim x As Integer
For x = 2 To lastrow
    Set Fileout = fso.CreateTextFile("C:\Users\blabla\" & x & ".fdf", True, True)
                Fileout.Write "%FDF-1.2" & vbCrLf & _
                "%âãÏÓ" & vbCrLf & _
                "1 0 obj" & vbCrLf & _
                "<</FDF<</F(MyDocument.pdf)/Fields[<</T(Adobe Form Field)/V(" & sht.Range("U" & x) & ")>>]/ID[<4ED54800AC4A3D41ABE4F4C7B12A3D23><609E705B7532334B8F914CFF4C09F2A0>]/UF(MyDocument.pdf)>>/Type/Catalog>>" & vbCrLf & _
                "endobj" & vbCrLf & _
                "trailer" & vbCrLf & _
                "<</Root 1 0 R>>" & vbCrLf & _
                "%%EOF" & vbCrLf
Fileout.Close

Next x

End Sub
Автор: Randall Lee Источник Размещён: 06.04.2017 02:32

Ответы (3)


1 плюс

712 Репутация автора

Просто пропустите строку: "% âãÏÓ" & vbCrLf & _ ". Ключи / ID и / UF на самом деле не нужны.

Примерно так должно работать:

Fileout.Write "%FDF-1.2" & vbCrLf & _
            "1 0 obj<</FDF<<" & vbCrLf & _
            "/F(MyDocument.pdf)" & vbCrLf & _
            "/Fields" & vbCrLf & _
            "[<</T(Adobe Form Field)/V(xyValue)>>]" & vbCrLf & _            
            ">>>>" & vbCrLf & _
            "endobj" & vbCrLf & _
            "trailer" & vbCrLf & _
            "<</Root 1 0 R>>" & vbCrLf & _
            "%%EOF" & vbCrLf
Автор: ReFran Размещён: 06.04.2017 06:25

0 плюса

29 Репутация автора

Решение

Как бы я ни хотел оставить это открытым в надежде, что кто-то выяснит, ПОЧЕМУ VBA испортил юникод, мою проблему можно решить, вообще не вызывая fso и просто используя FreeFile и замену строк в оригинальном FDF

Sub blabla()

Dim objAcroApp As Acrobat.AcroApp
Dim objAcroAVDoc As Acrobat.AcroAVDoc
Dim objAcroPDDoc As Acrobat.AcroPDDoc
Dim jsObj As Object
Dim boResult As Boolean
Dim oldPDF As String
Dim NewFilePath As String

    Dim sTemp As String
    Dim iFileNum As Integer
    Dim oldFDF As String
    Dim i As Integer
    Dim lastRow As Integer
    Dim sht As Worksheet
    Set sht = Sheets("owssvr")

    With sht
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    For i = 2 To lastRow

    oldPDF = "\mydoc.pdf"
    oldFDF = "\mydoc_data.fdf"
    newPDF = "\" & i & ".pdf"

    iFileNum = FreeFile
    Open oldFDF For Input As iFileNum

    Do Until EOF(iFileNum)
    Line Input #iFileNum, sBuf
    sTemp = sTemp & vbCrLf
    Loop
    Close iFileNum

    sTemp = Replace(sTemp, "<</T(some form field)/V( )>>", "<</T(some form field)/V(" & sht.Range("E" & i) & ")>>")

    iFileNum = FreeFile
    oldFDF = "\" & i & ".fdf"
    Open oldFDF For Output As iFileNum

    Print #iFileNum, sTemp

    Close iFileNum

            Set objAcroApp = CreateObject("AcroExch.App")
            Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
            boResult = objAcroAVDoc.Open(oldPDF, "")
            Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
            Set jsObj = objAcroPDDoc.GetJSObject
            jsObj.ImportAnFDF oldFDF
            jsObj.SaveAs newPDF
            boResult = objAcroAVDoc.Close(True)
            boResult = objAcroApp.Exit

Next i


End Sub
Автор: Randall Lee Размещён: 09.04.2017 02:34

1 плюс

712 Репутация автора

Вы найдете это в документации Acrobat IAC. Вот быстрый пример VBS (VBA). Там, где вам нужно только 2 строки: jso.getField и f.value = ... Удачи.

  '//-> Set a value for a form field via JSO
  '//-> Settings
FileNm = "d:\TestInput.pdf"
FieldNm= "Input1"
FieldValue= "50"
  '//-> let's start
Set App = CreateObject("Acroexch.app")
app.show
Set AVDoc = CreateObject("AcroExch.AVDoc")
    '//-> open the file and put the value in
If AVDoc.Open(FileNM,"") Then
    Set PDDoc = AVDoc.GetPDDoc()
    Set jso = PDDoc.GetJSObject
  '//-> Get the field and put a value in
    set f = jso.getField(FieldNm)
    f.value = FieldValue
end if
Автор: ReFran Размещён: 12.04.2017 04:33
32x32