首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Acrobat无法读取用Excel编写的.FDF

Acrobat无法读取用Excel编写的.FDF
EN

Stack Overflow用户
提问于 2017-04-06 14:32:38
回答 3查看 512关注 0票数 1

我用FDF中的表单字段导出了一个PDF,并编写了一个子文件逐字输出另一个FDF,其中包含表单字段值的单元格值。如果我在文本编辑器中编辑FDF并更改值,Acrobat可以很好地读取文件,但是带有VBA的文件输出会抛出一个错误:

Adobe无法打开whatever.fdf,因为它不是受支持的文件类型,或者是文件已损坏。

我尝试过两种不同类型的换行符,我尝试了一个类似的带有xfdf格式的子程序,它与相同的结果略有不同。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-09 02:34:12

尽管我希望有人能弄清楚为什么VBA搞砸了unicode,但我的问题完全不用调用fso就可以解决,只需在原始FDF上使用FreeFile和字符串替换即可。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-04-06 18:25:37

简单地说,省略了一行:“% and”& vbCrLf & _“。/ID和/UF键并不是真正需要的。

像这样的事情应该有效:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-04-12 16:33:55

您可以在Acrobat文档中找到这一点。这里是一个快速的vba(Vba)示例。其中只需要两行: jso.getField和f.value =.祝好运。

代码语言:javascript
复制
  '//-> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43258208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档