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:
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.
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?