Announcement

Collapse
No announcement yet.

iTextSharp PDF

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • iTextSharp PDF

    [Edit = gfoidl] Das Thema habe ich im Auftrag von KartenKrieger erstellt. [/Edit]

    Hallo,

    Ich möchte mit iTextSharp PDF´s erzeugen. Hierzu verwende ich (z.B.) ein einseitiges Template welches Formularfelder enthält. Aus den Daten sollen dann so viele Seiten entstehen wie nötig sind um diese darzustellen. Hierbei stelle ich vorher fest wann ich eine neue Seite brauche.
    Zunächst habe ich nach Anleitung PdfCopyFields verwendet. Dann hatte ich zwar die Felder, aber nicht das Layout des Templates. Dann habe ich PdfCopy versucht, dann gab es nur auf der ersten Seite richtig befüllte Felder, die restlichen Seiten waren zwar da, die Felder jedoch nicht...

    Hier meine ungelenken Versuche das Problem zu lösen:
    Code:
    //Mehrseitige Formulare, Template, MasterFile und Stamper!
    DataTable dt = ds.Tables[0]; //GLobale Daten
    DataTable df = ds.Tables[1]; //Seitendaten
    PdfReader pdfX = new PdfReader(TemplateFile);
    Document document = new Document(pdfX.GetPageSizeWithRotation(1));
    Stream pFile = new FileStream(PrintFile, FileMode.Create);
    PdfCopy pdfcopy = new PdfCopy(document, pFile);
    document.Open();
    PdfCopyFields pdfcopyfields = new PdfCopyFields(pFile);
    object[] ItemDataAllPages = dt.Rows[0].ItemArray;
    for (int k = 0; k < df.Rows.Count; k++)
    {
        PdfReader pdfT = new PdfReader(TemplateFile);
        PdfStamper pdfS = new PdfStamper(pdfT, new FileStream(PrintFile + ".tmp", FileMode.Create));
        AcroFields pdfFields = pdfS.AcroFields;
        object[] ItemDataThisPage = df.Rows[k].ItemArray;
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            try
            {
                pdfFields.SetField(dt.Columns[i].ColumnName.ToString(), (string)ItemDataAllPages[i]);
            }
            catch
            { }
        }
        for (int i = 0; i < df.Columns.Count; i++)
        {
            try
            {
                pdfFields.SetField(df.Columns[i].ColumnName.ToString().Replace("_Text",""), (string)ItemDataThisPage[i]);
            }
            catch
            { }
        }
        pdfS.Close();
        PdfReader newPageReader = new PdfReader(PrintFile + ".tmp");
        pdfcopy.AddPage(pdfS.GetImportedPage(newPageReader, 1));
        pdfcopyfields.AddDocument(newPageReader);
        //foreach (DictionaryEntry field in newPageReader.AcroFields.Fields)
        //{
        //    pdfcopy.AcroForm.AddFormField((PdfFormField)field.Value);
        //}
        pdfT.Close();
        }
    document.Close();
    pdfcopy.Close();
    gfoidl i.A. von Karsten
    Zuletzt editiert von gfoidl; 27.05.2010, 22:09.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

  • #2
    Hallo Karsten,

    für solche Aufgaben verwende ich die SQL Server Reporting Services oder den Report Viewer der die PDF im lokalen Modus rendert, mit iTextSharp hab ich keine Erfahrung.

    Sollte diese Alternative möglich sein ist ein guter Startpunkt http://www.gotreportviewer.com/. Für Fragen wie eine PDF dann direkt gerendert werden kann melde dich bei Bedarf.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      gelöst: iTextSharp PDF

      Hallo, das Problem mit den Feldern ist nach ein bischen Googlen gelöst. Der PDF-Stamper legt die Felder im Zieldokument nur dann an wenn "stamper.FormFlattening = true;" gesetzt wird.

      Code:
                      DataTable dt = ds.Tables[0]; //GLobale Daten
                      DataTable df = ds.Tables[1]; //Seitendaten
                      PdfReader pdfX = new PdfReader(TemplateFile);
                      Document document = new Document(pdfX.GetPageSizeWithRotation(1));
                      Stream pFile = new FileStream(PrintFile, FileMode.Create);
                      PdfCopy pdfcopy = new PdfCopy(document, pFile);
                      document.Open();
                      object[] ItemDataAllPages = dt.Rows[0].ItemArray;
                      for (int k = 0; k < df.Rows.Count; k++)
                      {
                          PdfReader pdfT = new PdfReader(TemplateFile);
                          PdfStamper pdfS = new PdfStamper(pdfT, new FileStream(PrintFile + ".tmp", FileMode.Create));
                          pdfS.FormFlattening = true;
                          AcroFields pdfFields = pdfS.AcroFields;
                          object[] ItemDataThisPage = df.Rows[k].ItemArray;
                          for (int i = 0; i < dt.Columns.Count; i++)
                          {
                              try
                              {
                                  pdfFields.SetField(dt.Columns[i].ColumnName.ToString(), (string)ItemDataAllPages[i]);
                              }
                              catch
                              { }
                          }
                          for (int i = 0; i < df.Columns.Count; i++)
                          {
                              try
                              {
                                  pdfFields.SetField(df.Columns[i].ColumnName.ToString().Replace("_Text",""), (string)ItemDataThisPage[i]);
                              }
                              catch
                              { }
                          }
                          pdfS.Close();
                          PdfReader newPageReader = new PdfReader(PrintFile + ".tmp");
                          pdfcopy.AddPage(pdfS.GetImportedPage(newPageReader, 1));
                          pdfT.Close();
                      }
                      document.Close();
                      pdfcopy.Close();
      ... natürlich muss die Fehlerbehandlung noch ergänzt werden.

      Die SQL-Server Reportingservices sind mir bekannt, ich verwende diese auch wenn ich den MS-SQL-Server verwenden kann. Dieses Projekt jedoch arbeitet vollständig mit MySQL, dort gibt es diese Services wohl nicht.

      iTextSharp ist ein gutes Werkzeug PDF´s zu erstellen ohne andere Hilfmittel verwenden zu müssen. Mit der Möglichkeit Templates zu verwenden ist diese Lösung sehr flexibel einsetzbar.

      Vielen Dank für die Hilfe.

      Karsten

      Comment


      • #4
        Die SQL-Server Reportingservices sind mir bekannt, ich verwende diese auch wenn ich den MS-SQL-Server verwenden kann. Dieses Projekt jedoch arbeitet vollständig mit MySQL, dort gibt es diese Services wohl nicht.
        Der ReportViewer kann auch lokale Berichte erstellen. Dabei werden die Daten für den Bericht als DataSet zur Verfügung gestellt. Somit ist keine Abhängigkeit von MS SQL Server gegeben.

        Aber die iTextSharp-Lösung schaut auch gut aus. Das werde ich mir mal anschauen.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X