2017-04-06 6 views
1

J'ai exporté un PDF avec des champs de formulaire dans FDF et a écrit un sous pour produire un autre FDF verbatim, avec des valeurs de cellule pour les valeurs de champ de formulaire. Si je modifier le FDF dans un éditeur de texte et de modifier les valeurs, Acrobat peut lire le fichier très bien, mais la sortie de fichier avec VBA renvoie une erreur:Acrobat ne peut pas lire .FDF écrit avec Excel VBA

Adobe could not open whatever.fdf because it is either not a supported file type or because the file has been damaged

J'ai essayé deux différents types de sauts de ligne, J'ai essayé un sous-type similaire avec le formatage xfdf qui est légèrement différent avec les mêmes résultats.

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 
+0

Je suspecte un problème de codage. Pensez à utiliser la fonction 'StrConv' pour assurer un encodage correct (' vbUnicode'?) –

+0

bonne légende mais pas de vbunicode –

+0

'"% âãÏ "' est un littéral de chaîne codé ANSI - si cela doit être unicode, 'vbUnicode'- l'encodage '"% âãÏ "ne le transformera probablement pas en unicode équivalent; vous devrez peut-être l'utiliser en combinaison avec 'ChrW' pour émettre des caractères unicode * réels *. –

Répondre

0

Autant que je veux laisser cela ouvert dans l'espoir que quelqu'un découvre pourquoi VBA est en train de bousiller l'Unicode, mon problème peut être résolu sans invoquer fso du tout et juste en utilisant FreeFile et string remplacer sur un ou FDF d'origine

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

Maintenant, je me demande vraiment que vous utilisez FDF pour remplir les formulaires du tout. Avec Acrobat vous pouvez le remplir directement en utilisant JSObject. – ReFran

+0

* facepalm * wow Je ne m'en suis pas rendu compte. Je vais revoir le manuel de l'API et voir ce que je devrais faire –

1

simplement laisser sur la ligne: "% âãÏÓ" & vbCrLf & _ »

Quelque chose comme cela devrait fonctionner/ID et/clés UF pas vraiment besoin:..

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 
+0

même erreur malheureusement. Je ne comprends pas. Si je regarde les fichiers côte à côte dans NP ++, ils ont l'air identiques. Je peux éditer l'exportation originale et cela fonctionnera toujours. Enfer si je copie et colle de l'original à un nouveau fichier, cela fonctionne. Quelque chose que VBA écrit est de le rendre inutile. Je suppose que je pourrais essayer une longue boucle de remplacement de cordes sur l'original mais je ne l'ai pas vraiment fait avant donc ça pourrait me prendre du temps. –

+0

Il est un peu tard en Allemagne.Si vous ne l'obtenez pas, je vous passerai demain vbs. – ReFran

1

Vous le trouverez dans la documentation d'Acrobat IAC. Voici un exemple rapide vbs (vba). Où vous n'avez besoin que de 2 lignes: jso.getField et f.value = ... Bonne chance.

'//-> 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