2016-11-15 4 views
1

Ich verwende PDFsharp, um mehrseitige Dokumente für jedes Element in meinem Modell zu erstellen.Positionieren von Daten mit PDFsharp

ich ein grobes Mock-up, was die endgültige PDF muss aussieht gegeben haben:

enter image description here

Um eine lange Geschichte kurz Ich habe zwei verschiedene Arten von PDF-I produzieren muss, die Eine, der ich die Vorlage für folgen muss, ist eine mehrseitige PDF-Datei, daher die Variable _numberOfPages im folgenden Codeausschnitt.

Ich habe so weit wie tatsächlich produzieren Informationen für jeden einzelnen Artikel für die mehrseitige PDF-Version. Abhängig von der Anzahl der Elemente in der Anfrage füge ich eine neue Seite hinzu und hole dann den Index meines Items-Arrays für die aktuelle Seite und füge die Zeilen so an.

PDFDocument Klasse

public PdfDocument BuildPdfDocument() 
    { 
     if (_numberOfPages > 1) 
     { 
      PdfDocument pdfDocument = new PdfDocument(); 
      for (int i = 0; i < _numberOfPages; i++) 
      { 
       PdfPage page = pdfDocument.AddPage(); 
       page.Orientation = PageOrientation.Landscape; 
       XGraphics gfx = XGraphics.FromPdfPage(page); 
       XFont font = new XFont("Arial", 30, XFontStyle.Regular); 
       XTextFormatter tf = new XTextFormatter(gfx); 
       XRect rect = new XRect(0, (page.Height/4), page.Width, page.Height); 
       gfx.DrawRectangle(XBrushes.White, rect); 
       tf.Alignment = XParagraphAlignment.Left; 
       tf.DrawString(_request.GetText(i), font, XBrushes.Black, rect); 
      } 

       return pdfDocument; 
     } 

     else 
     { 
      // stuff relating to the other pdfDocument that is OK 
     } 
    } 

FileRequest Klasse enthält eine Methode GetText

public string GetText(int pageNo) 
{ 
    int[] fileRequestItems = this.FileRequestItems.Select(x => x.Id).ToArray(); 
    var currentFileRequestItem = fileRequestItems[pageNo]; 
    var items = FileRequestItems; 

    FileRequestItem item = items.FirstOrDefault(s => s.Id == currentFileRequestItem); 

    StringBuilder sb = new StringBuilder(); 

    if (item.ObjectContextGetType() == typeof(FileRequestDocument)) // its a document so provide text for the PDF like this 
    { 
     var fileRequestDocument = item as FileRequestDocument; 

     sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D")); 
     if (fileRequestDocument != null) sb.AppendLine("Box No: " + fileRequestDocument.Record.Box.BoxNumber); 
     sb.AppendLine("Location: " + this.Location.LocationName); 
     if (fileRequestDocument != null) sb.AppendLine("Description: " + fileRequestDocument.Record.Description); 
     sb.AppendLine("Requested By: " + this.Name); 
     sb.AppendLine("Tel: " + this.TelephoneNumber); 
     sb.AppendLine("Department: " + this.Department); 
    } 

    if (item.ObjectContextGetType() == typeof(FileRequestBox)) // its a box so provide text for the PDF like this 
    { 
     var fileRequestBox = item as FileRequestBox; 

     sb.AppendLine("Date Requested: " + this.DateOfRequest.ToString("D")); 
     if (fileRequestBox != null) sb.AppendLine("Box No: " + fileRequestBox.Box.BoxNumber); 
     sb.AppendLine("Location: " + this.Location.LocationName); 
     if (fileRequestBox != null) sb.AppendLine("Description: " + $"Entire Contents of Box Number {fileRequestBox.Box.BoxNumber}"); 
     sb.AppendLine("Requested By: " + this.Name); 
     sb.AppendLine("Tel: " + this.TelephoneNumber); 
     sb.AppendLine("Department: " + this.Department); 
    } 

    return sb.ToString(); 
} 

Das Ergebnis all dies ist die unten PDF, eine Dateianforderung genannt, die wird 5 Elemente enthält sein über 5 Seiten, mit Sachen wie der Name/Datum usw. wiederholt, aber die Beschreibung einzigartig zu diesem FileRequestItem oder Seite.

enter image description here

Wie Sie sehen können, obwohl die Informationen alle da ist, wird die Positionierung nicht die gewünschte Vorlage entsprechen.

Wie erstelle ich die angegebene Vorlage oder etwas Ähnliches für jede Seite und positioniere dann meine Daten entsprechend?

Antwort

1

Versuchen Sie, eine lange mehrzeilige Zeichenfolge an XTextFormatter zu übergeben. Falscher Ansatz, wenn Sie Kontrolle über die Positionen benötigen.

Um die volle Kontrolle über die Positionierung zu erhalten, rufen Sie DrawString für einzelne Artikel.

Ich würde MigraDoc verwenden: MigraDoc können Sie eine Tabelle erstellen und die Informationen in einzelnen Tabellenzellen.

MigraDoc verwendet PDFsharp zum Erstellen von PDF-Dateien, bietet aber eine höhere API-Ebene.
http://www.pdfsharp.net/wiki/Invoice-sample.ashx