2017-01-06 12 views
3

おはようございます。私は誰かがこのトピックについて私を助けることを望んでいます。昨年、私はiTextSharpを使ってVB.NETプログラムをセットアップしました。ここでユーザーはI9を記入するための情報を入力することができ、その情報はPDFを記入して印刷します。新しいI9では、私は未確認の困難を抱えています。自動塗りつぶしI-9 PDF XFAフォーム

まず、コードにエラーがないか、何もありません。埋め込まれたフォームの代わりに、「読み込もうとしているドキュメントにAdobe Reader 8以上が必要です.Adobe Readerがインストールされていない可能性があります」などのPDFが表示されるため、私は私が最新のReaderバージョンを持っていることを確認し、再度同じ結果を試しました。

おそらくフィールド名の構造に変更があったと考えて、私は最初に書いたように/フィールドの書式を読み込もうとしました。 (以下のコード)。しかし、今はそれは私に、読むべきフィールドがないことを伝えている(AcroFields.Fields.Count = 0)。

Private Sub ListFieldNames(pdfTemplate As String) 
    Dim pdfTemplate As String = "c:\Temp\PDF\fw4.pdf" 
    Dim pdfReader As PdfReader = New PdfReader(pdfTemplate) 
    Dim de As KeyValuePair(Of String, iTextSharp.text.pdf.AcroFields.Item) 

    For Each de In pdfReader.AcroFields.Fields 
     Console.WriteLine(de.Key.ToString()) 
    Next 
End Sub 

私はいくつかの検索を開始し、別の種類のPDF構造への参照があったことがわかりました。 XFA。私は正直なところ、これについての満足のいく文書/サンプルをまだ見つけていませんが、XFA PDFの構造を読み込むようなコードを見つけました。 (以下のコード)。実際に私が試した2つの方法があります。最初は、xfaFieldsにxmlNodesがないことを基本的に示しています。 2番目のノードは "data"というノードを見つけますが、それは子ノードが見つかりません。

Private Sub ReadXfa(pdfTemplate As String) 
    pdfReader.unethicalreading = True 
    Dim readerPDF As New PdfReader(pdfTemplate) 

    Dim xfaFields = readerPDF.AcroFields.Xfa.DatasetsSom.Name2Node 

    For Each xmlNode In xfaFields 
     Console.WriteLine(xmlNode.Value.Name + ":" + xmlNode.Value.InnerText) 
    Next 
    'Example of how to get a field value 
    ' Dim lastName = xfaFields.First(Function(a) a.Value.Name = "textFieldLastNameGlobal").Value.InnerText 


    Dim reader As New PdfReader(pdfTemplate) 
    Dim xfa As New XfaForm(reader) 
    Dim node As XmlNode = xfa.DatasetsNode() 
    Dim list As XmlNodeList = node.ChildNodes() 
    For i As Integer = 0 To list.Count - 1 
     Console.WriteLine(list.Item(i).LocalName()) 
     If "data".Equals(list.Item(i).LocalName()) Then 
      node = list.Item(i) 
      Exit For 
     End If 
    Next 
    list = node.ChildNodes() 
    For i As Integer = 0 To list.Count - 1 
     Console.WriteLine(list.Item(i).LocalName()) 
    Next 
    reader.Close() 
End Sub 

https://www.uscis.gov/system/files_force/files/form/i-9.pdf?download=1

上記のリンクは、政府が提供するI9のPDFに行きます。

そう...私は複数の質問があると思います。最も簡単なのは、もし誰かがこのプロセスをやったならば/彼らが私を助けることができるかどうかです。この新しいPDFファイルからの読み書き方法に関して、誰かが正しい方向で私を指すことができるのであれば、それはすごいでしょう。私は率直にも彼らが使用した形式の "タイプ"を決定する方法を特定していない - AcroFieldXFA、何か他の?

お時間をいただきありがとうございます。

答えて

2

私はもうvb.netをやっていませんが、それに続くコードを変換できるはずです。

新しいフォームがXFAであることが既に分かっています。フォームフィールドとデータを表示するには、プログラムではない簡単な方法があります。あなたはあなたのバージョンのAdobe Readerをアップグレードしたので、Reader DCを使用していると思います。

Edit => Form Options => Export Data... 

あなたが調べることができますXMLファイルにフォームをエクスポート:メニューオプションから。 XMLファイルは、フォームを記入するのに対応するXML文書が必要であるというヒントを示します。これは、AcroFormの処理方法とはまったく異なります。

ここでは簡単なコードを紹介します。今、私たちは、有効なXMLを作成するための方法を持っていることを

public string FillXml(Dictionary<string, string> fields) 
{ 
    // XML_INFILE => physical path to XML file exported from I-9 
    XDocument xDoc = XDocument.Load(XML_INFILE); 
    foreach (var kvp in fields) 
    { 
     // handle multiple elements in I-9 form 
     var elements = xDoc.XPathSelectElements(
      string.Format("//{0}", kvp.Key) 
     ); 
     if (elements.Count() > 0) 
     { 
      foreach (var e in elements) { e.Value = kvp.Value; } 
     } 
    } 

    return xDoc.ToString(); 
} 

を、いくつかのサンプルデータを持つフォームフィールド記入:空白のXMLドキュメントを読んで、それを更新するための最初の方法あなたに答えるために

var fields = new Dictionary<string, string>() 
{ 
    { "textFieldLastNameGlobal", "Doe" }, 
    { "textFieldFirstNameGlobal", "Jane" } 
}; 
var filledXml = FillXml(fields); 

using (var ms = new MemoryStream()) 
{ 
    // PDF_READER => I-9 PdfReader instance 
    using (PDF_READER) 
    { 
     // I-9 has password security 
     PdfReader.unethicalreading = true; 
     // maintain usage rights on output file 
     using (var stamper = new PdfStamper(PDF_READER, ms, '\0', true)) 
     { 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(filledXml); 
      stamper.AcroFields.Xfa.FillXfaForm(doc.DocumentElement); 
     } 
    } 
    File.WriteAllBytes(OUTFILE, ms.ToArray()); 
} 

を最後の質問は、フォームのタイプ」をどのように決定するか、そのようPdfReaderインスタンスを使用します。

PDF_READER.AcroFields.Xfa.XfaPresent 

trueがXFA、false手段を意味し、 AcroForm。

+0

ありがとうございました!私は今これを試してみるつもりです。私は結果を更新します。 – Brenda

1

ここで私の最終的なコードは、誰かがそれを使うことができる場合です。私は、i9がちょっとばかばかしいフォームなので、次の場所でOn Error Resumeを持っています。彼らは私に欲しい。また、私は変数をいくつか設定してどこを短くするかを決めました。あなたの助けのためにkuujinboに再びありがとう!

Private Sub ExportI9() 
    Dim pdfTemplate As String = Path.Combine(Application.StartupPath, "PDFs\2017-I9.pdf") 
    pdfTemplate = Replace(pdfTemplate, "bin\Debug\", "") 


    Dim fields = New Dictionary(Of String, String)() From { 
    {"textFieldLastNameGlobal", Me.tbLast.Text}, 
    {"textFieldFirstNameGlobal", Me.tbFirst.Text}, 
    {"textFieldMiddleInitialGlobal", Mid(Me.tbMiddle.Text, 1, 1)}, 
    {"textFieldOtherNames", Me.tbOtherName.Text}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Top/subEmployeeInfo/subSection1Row2/textFieldAddress", addr1}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Top/subEmployeeInfo/subSection1Row2/textFieldAptNum", ""}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Top/subEmployeeInfo/subSection1Row2/textFieldCityOrTown", city1}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Top/subEmployeeInfo/subSection1Row2/State", state1}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Top/subEmployeeInfo/subSection1Row2/textFieldZipCode", zip1}, 
    {"dateFieldBirthDate", Me.dtpBirth.Value}, 
    {"SSN", Me.tbSSN.Text}, 
    {"fieldEmail", ""}, 
    {"fieldPhoneNum", sphone}, 
    {"radioButtonListCitizenship", citizenship}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subCitizenshipStatus/textFieldResidentType", alienuscis}, 
    {"dateAlienAuthDate", dauth}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subAuthorizedAlien/numFormI94Admission", Me.tbi94.Text}, 
    {"numForeignPassport", Me.tbPassport.Text}, 
    {"CountryofIssuance", Me.tbPassportCountry.Text}, 
    {"numAlienOrUSCIS", usc}, 
    {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subAuthorizedAlien/textFieldResidentType", alienuscis}, 
    {"rbListPerparerOrTranslator", 3}, 
    {"dropdownMultiPreparerOrTranslator", 1}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow2/textFieldFirstName", prepfirst}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow2/textFieldLastName", preplast}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow3/textFieldAddress", Replace(prepadd, "#", "No. ")}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow3/textFieldCityOrTown", prepcity}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow3/State", prepstate}, 
     {"form1/section1Page1/subSection1PositionWrapper/subSection1Bottom/subPreparerTranslator/subPrepererTranslator1/subTranslatorSignature/subRow3/textFieldZipCode", prepzip}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subDocListA1/selectListA1DocumentTitle", doctitle1}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListB/selectListBDocumentTitle", doctitle2}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListC/selectListCDocumentTitle", doctitle3}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subDocListA1/textFieldIssuingAuthority", issued1}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListB/textFieldIssuingAuthority", issued2}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListC/textFieldIssuingAuthority", issued3}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subDocListA1/dateExpiration", expdate1}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListB/dateExpiration", expdate2}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListC/dateExpiration", expdate3}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subDocListA1/textFieldDocumentNumber", docnum1}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListB/textFieldDocumentNumber", docnum2}, 
    {"form1/section2and3Page2/subSection2/subVerificationListsBorder/subListBandCBorder/subDocListC/textFieldDocumentNumber", docnum3}, 
     {"form1/section2and3Page2/subSection2/subCertification/subAttest/dateEmployeesFirstDay", CDate(Me.dtpHired.Value).ToShortDateString}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow2/textFieldLastName", certlast}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow2/textFieldFirstName", certfirst}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow3/textFieldAddress", orgadd}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow3/textFieldCityOrTown", orgcity}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow3/State", orgstate}, 
     {"form1/section2and3Page2/subSection2/subCertification/subEmployerInformation/subEmployerInfoRow3/textFieldZipCode", orgzip}, 
     {"textBusinessOrgName", orgname} 
    } 


    Dim PDFUpdatedFile As String = pdfTemplate 
    PDFUpdatedFile = Replace(PDFUpdatedFile, "I9", Me.tbSSN.Text & "-I9") 
    If System.IO.File.Exists(PDFUpdatedFile) Then System.IO.File.Delete(PDFUpdatedFile) 
    Dim readerPDF As New PdfReader(pdfTemplate) 


    Dim filledXml = FillXml(fields) 
    Using ms = New MemoryStream() 
     Using readerPDF 
      ' I-9 has password security 
      PdfReader.unethicalreading = True 
      Dim stamper As New PdfStamper(readerPDF, ms, ControlChars.NullChar, True) 
      Using stamper 
       Dim doc As New XmlDocument() 
       doc.LoadXml(filledXml) 
       stamper.AcroFields.Xfa.FillXfaForm(doc.DocumentElement) 
      End Using 
     End Using 
     File.WriteAllBytes(PDFUpdatedFile, ms.ToArray()) 
    End Using 
End Sub 


Public Function FillXml(fields As Dictionary(Of String, String)) As String 
    ' XML_INFILE => physical path to XML file exported from I-9 
    Dim xmlfile As String 

    xmlfile = Path.Combine(Application.StartupPath, "PDFs\2017-I9_data.xml") 
    xmlfile = Replace(xmlfile, "bin\Debug\", "") 
    Dim kvp As KeyValuePair(Of String, String) 

    Dim xDoc As XDocument = XDocument.Load(xmlfile) 
    For Each kvp In fields 
     ' handle multiple elements in I-9 form 
     Dim elements = xDoc.XPathSelectElements(String.Format("//{0}", kvp.Key)) 
     If elements.Count() > 0 Then 
      For Each e As XElement In elements 
       On Error Resume Next 
       e.Value = kvp.Value 
      Next 
     End If 
    Next 

    Return xDoc.ToString() 
End Function 
関連する問題