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

我用FDF中的表单字段导出了一个PDF,并写了一个子expression式来输出另一个FDF,字段值为表单字段值。 如果我在文本编辑器中编辑FDF并更改值,Acrobat可以很好地读取文件,但是使用VBA输出的文件会引发错误:

Adobe无法打开任何 .fdf文件,因为它不是支持的文件types,或者是因为文件已损坏

我已经尝试了两种不同types的换行符,我尝试了一个与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 

简单地省略一行:“%ÏÓ”&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 

您将在Acrobat IAC文档中find。 这里有一个快速的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 

尽可能多的我想离开这个开放,希望有人弄清楚为什么VBA搞砸了unicode,我的问题可以解决,而不用调用fso,只是使用FreeFile和stringreplace原始的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