2017-04-06 7 views
1

작성 읽을 수 없습니다 나는 FDF에서 양식 필드와 PDF 수출 및 양식 필드 값에 대한 셀 값과 다른 FDF 그대로 출력 서브를 썼다. 내가 텍스트 편집기에서 FDF을 편집하고 값을 변경하는 경우, Acrobat에서 잘 파일을 읽을 수 있지만 VBA로 파일 출력 오류 발생 : I 줄 바꿈의 두 가지 유형을 시도했습니다애크로뱃이 .FDF 엑셀 VBA

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

을, 동일한 결과를 약간 다른 xfdf 서식을 사용하여 비슷한 하위 시도했다. ""% âãÏÓ "& vbCrLf & _/ID 및/UF 키가 정말 필요하지

이 같은

뭔가 작동합니다 :

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

나는 인코딩 문제를 생각한다. 적절한 인코딩을 보장하기 위해'StrConv' 기능을 사용하는 것을 고려 –

+0

좋은 선하지만 vbunicode –

+0

' "% âãÏÓ"와 아무 소용이'리터럴 문자열을 ANSI 인코딩입니다 ('vbUnicode'을?) - 그은 유니 코드,'vbUnicode'- 될 운명 않다면 encoding ""% â € ¢ "는 마술처럼 유니 코드로 변환하지 않을 것입니다; * 실제 * 유니 코드 문자를 출력하려면 ChrW와 함께 사용해야 할 수도 있습니다. –

답변

0

, 내 문제에 교체 전혀 FSO를 호출하고 단지 FreeFile 및 문자열을 사용하지 않고 해결 될 수있는 또는 iginal 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 
+0

이제 FDF를 사용하여 양식을 채우는 것이 정말 이상합니다. Acrobat을 사용하면 JSObject를 사용하여 직접 채울 수 있습니다. – ReFran

+0

* facepalm * 와우 나는 그것을 몰랐다. API 설명서를 다시 살펴보고 내가해야 할 일을 알아 봅니다. –

1

단순히 줄을 둡니다..

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 
내가 VBA는 유니 코드를 망쳐 왜 누군가가 파악 희망이 열린 상태로 두려면 원하는만큼
+0

같은 오류가 발생했습니다. 나는 단지 그것을 얻지 않는다. NP ++에서 파일을 나란히 보면, 그들은 똑같이 보입니다. 원본 내보내기를 편집 할 수 있으며 여전히 작동합니다. 지옥 복사하고 원본에서 새 파일에 붙여 넣으면 작동합니다. VBA가 쓰고있는 것은 쓸데없는 것입니다. 나는 원판에 긴 문자열 교체 루프를 시도 할 수 있다고 생각하지만, 실제로 그렇게하지 않았기 때문에 약간의 시간이 걸릴 수 있습니다. –

+0

독일에서 조금 늦었습니다.당신이 그것을 얻지 못한다면, 나는 내일 당신에게 vbs를 보냅니다. – ReFran

1

Acrobat IAC 설명서에서 확인할 수 있습니다. 다음은 빠른 vbs (vba) 예제입니다. 거기에서 2 줄만 있으면됩니다 : jso.getField and 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