2016-06-06 9 views
0

Ich muss eine Windows-Formulare-Anwendung entwickeln, die PDF-Dateien aus Excel-Blatt-Daten generiert. Das Mapping von Daten aus dem Excel-Blatt zu den Steuerelementen in PDF sollte mit einem XML erfolgen Datei.Eine PDF-Datei muss für jede Zeile des Excel-Blattes mit einem Klick erzeugt werden. Wie ist das gemacht?Erstellen von PDF-Dateien aus Excel-Blatt mit Xml und Windows-Formulare

+0

Suche nach iTextSharp. Sie könnten eine PDF-Vorlage mit einem Raster erstellen und die Zellen ausfüllen oder das PDF im Handumdrehen erstellen (viel Arbeit wäre meine Vermutung.) – rheitzman

+0

@rheitzman Ich habe bereits eine PDF-Vorlage .wie füllen Sie die spezifischen Felder aus in der pdf mit Werten aus der Excel-Tabellenzeile? und es muss für jede Zeile getan werden. – Rosasiya

+0

Meine "Antwort" unten sollte helfen. Sie müssen den Code zum Lesen der Excel-Zeilen erstellen, die Excel-Spalten den PDF-Feldnamen zuordnen und die Bereitstellungsroutine aufrufen. Viel Glück! – rheitzman

Antwort

0

Hier ist eine Bibliotheksroutine, die ein Verzeichnis von Feldnamen und Werten verwendet, um eine PDF-Vorlage zu füllen. Für Ihren Fall müssten Sie das Wörterbuch aus Ihren Excel-Zeilendaten erstellen, die die Daten korrekt in die Feldnamen (Groß-/Kleinschreibung beachten) in der Vorlage einordnen. Sie müssen keine "fehlenden" Felder ausfüllen, es sei denn, Sie möchten Standardwerte einfügen.

Das Projekt benötigt einen Verweis auf itextsharp. Die Datei itextsharp.dll muss in das Ausgabeverzeichnis kopiert werden.

Imports iTextSharp.text.pdf 
Import System.IO 
Public Function FillPDFForm(PDF_MasterPath As String, Flds As Dictionary(Of String, String), Optional PDF_FinalPath As String = "", Optional FlattenForm As Boolean = True) As Boolean 
    ' case matters: Dictionary Keys == PDF Form Field Names 
    Dim pdfFormFields As AcroFields 
    Dim pdfReader As PdfReader 
    Dim pdfStamper As PdfStamper 

    Try 
     If PDF_FinalPath = "" Then PDF_FinalPath = PDF_MasterPath.Replace(".pdf", "_Out.pdf") 
     Dim newFile As String = PDF_FinalPath 

     pdfReader = New PdfReader(PDF_MasterPath) 
     pdfStamper = New PdfStamper(pdfReader, New FileStream(newFile, FileMode.Create)) 
     pdfReader.Close() 
     pdfFormFields = pdfStamper.AcroFields 

     For Each sKVP As KeyValuePair(Of String, String) In Flds 
      pdfFormFields.SetField(sKVP.Key, sKVP.Value) 
     Next 

     ' flatten the form to remove editing options? 
     ' set it to false to leave the form open to subsequent manual edits 
     If My.Computer.Keyboard.CtrlKeyDown Then 
      ' leave in editable state 
      pdfStamper.FormFlattening = False 
     Else 
      pdfStamper.FormFlattening = FlattenForm 
     End If 

     pdfStamper.Close() 

     Process.Start(newFile) 
     Return True 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     Return False 
    Finally 
     pdfStamper = Nothing 
     pdfReader = Nothing 
    End Try 
End Function 

Hier einige Code der Formularfeldnamen aus einem PDF-Formular zu ernten:

Private Function PDFFieldNames(pdfPath As String) As String 
    Try 
     Dim s As String = "" 

     ' create a new PDF reader based on the PDF template document 
     Dim pdfReader As PdfReader = New PdfReader(pdfPath) 

     Dim fields As IDictionary(Of String, iTextSharp.text.pdf.AcroFields.Item) = pdfReader.AcroFields.Fields 
     For Each key As String In fields.Keys 
      's = "pdfFormFields.SetField(""{fname}"", Row!{fname})".Replace("{fname}", key) 
      s &= key & "|" 
     Next 
     pdfReader.Close() 
     Return s 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     Return "" 
    End Try 
End Function