2012-11-07 8 views
7

Hallo Ich verwende PDF scharf, um Benutzereingabe auf Positionen in einem Vorlagedokument zu drucken.C# PDF Scharfe Position im Dokument

Die Daten (Felder) werden vom Benutzer (Webseite) gesammelt und an geeigneten Stellen im Dokument mit der Drawstring-Methode geschrieben.

Derzeit finde ich die Pixelposition jedes Vorlagenfelds auf jeder Seite durch Versuch und Irrtum. Es wäre viel einfacher, wenn es eine Möglichkeit gibt, die Pixelposition jedes Feldes in der PDF-Seite zu bestimmen.

Jeder Vorschlag wäre am hilfreichsten.

dank

Antwort

4

Als ich PDF Sharp verwendet wird, war mein Ansatz Verwendung der XUnit Struktur und verweisen den linken oberen Punkt des Dokuments als mein Ausgangspunkt für X/Y-Positionen zu machen.

Offensichtlich wird der Verweis auf den oberen linken Punkt des Dokuments (0,0) für jedes Element auf einer PDF-Seite unordentlich. Um dies zu bekämpfen, habe ich die XRect-Klasse verwendet, um Rechtecke für Elemente zu erstellen, in denen sie sitzen können. Sobald der XRect auf die Seite gezeichnet wurde, können Sie über die XRect-Eigenschaften auf die X/Y-Position des Rechtecks ​​verweisen. Dann sollten Sie in der Lage sein, die Koordinaten für die Position des nächsten Elements, das Sie der PdfPage hinzufügen möchten, zu berechnen, indem Sie die Koordinaten und die Breite/Höhe des XRect verwenden.

Folgen Sie diesem Codebeispiel, ich habe eine grobe Skizze des Endergebnisses zur Verfügung gestellt. Der Code ist noch nicht getestet, basiert aber sehr stark auf Code in der Produktion.

// Create a new PDF document 
PdfDocument document = new PdfDocument(); 

// Create an empty page with the default size/orientation 
PdfPage page = document.AddPage(); 
page.Orientation = PageOrientation.Landscape; 
page.Width = XUnit.FromMillimeter(300); 
page.Height = XUnit.FromMillimeter(200); 

// Get an XGraphics object for drawing 
XGraphics gfx = XGraphics.FromPdfPage(page); 

// Add the first rectangle 
XUnit horizontalOffset = XUnit.FromMillimeter(5); 
XUnit verticalOffset = XUnit.FromMillimeter(5); 
XUnit columnWidth = XUnit.FromMillimeter(100); 
XUnit columnHeight = page.Height - (2 * verticalOffset); 
XRect columnRect = new XRect(horizontalOffset, verticalOffset, columnWidth, columnHeight); 
gfx.DrawRectangle(XBrushes.Teal, columnRect); 

// Insert an image inside the rectangle, referencing the Left and Top properties of the rectangle for image placement 
XImage topLogo = XImage.FromFile(GetFilePath(@"content\img\pdfs\standard\logo-no-strapline.jpg")); // GetFilePath is a private method, not shown for brevity 
gfx.DrawImage(topLogo, 
    columnRect.Left + XUnit.FromMillimeter(5), 
    columnRect.Top + XUnit.FromMillimeter(5), 
    columnRect.Width - XUnit.FromMillimeter(10), 
    XUnit.FromMillimeter(38)); 

Und die Ausgabe: Mock up of the rendered output

Schließlich, ich bin sicher, dass Sie sich bewusst, aber es ist eine gute Ressource von PDFsharp Proben here.

0

PDF-Dateien haben keine Pixel und keine Pixelpositionen.
Sie können PDF-Seiten drucken (verwenden Sie die Größenoption "Tatsächliche Größe") und Positionen mit einem Lineal messen (dies funktioniert bei unseren Druckern ziemlich gut).
Oder Sie können Adobe Acrobat verwenden, um die Positionen von Elementen auf den PDF-Seiten zu messen.

Ein bisschen Versuch und Irrtum bleibt, wie Sie vielleicht einen halben Millimeter geben oder nehmen müssen.
Abhängig von Ihrem Lineal können Sie XUnit.FromMillimeter oder XUnit.FromInch verwenden, um die Punktpositionen für PDFsharp zu erhalten (aber Punkte sind keine Pixel).

Die aktuellen PDFsharp Proben sind hier:
http://www.pdfsharp.net/wiki/PDFsharpSamples.ashx

9

Ich hatte das gleiche Problem wie du, josephj1989, und ich fand, was ich glaube, dass unsere Antwort sein.

Nach this page in der PDFSharp Dokumentation,

Die aktuelle Implementierung von PDFsharp hat nur ein Layout des Kontextes Grafiken. Der Ursprung (0, 0) ist oben links und Koordinaten wachsen nach rechts und unten. Die Maßeinheit ist immer Punkt (1/72 Zoll).

Also, sagen, ich möchte ein Bild 3 Zoll von links und 7 zu zeichnen.5 Zoll von der Spitze einer 8,5 x 11 Seite, dann würde ich so etwas tun:

PdfDocument document = GetBlankPdfDocument(); 
PdfPage myPage = document.AddPage(); 
myPage.Orientation = PdfSharp.PageOrientation.Portrait; 
myPage.Width = XUnit.FromInch(8.5); 
myPage.Height = XUnit.FromInch(11); 
XImage myImage = GetSampleImage(); 

double myX = 3 * 72; 
double myY = 7.5 * 72; 
double someWidth = 126; 
double someHeight = 36; 

XGraphics gfx = XGraphics.FromPdfPage(myPage); 
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight); 

ich das selbst mit einem Barcode-Bild getestet, und ich fand, dass wenn Sie ihre Formel Positionierung für die Messung, Sie können ein Niveau der Genauigkeit bei, gut, 1/72 eines Zolls bekommen. Das ist nicht schlecht.

So, an diesem Punkt wäre es gut, eine Art Kapselung für solche Messungen zu erstellen, so dass wir uns hauptsächlich auf die Aufgabe konzentrieren und nicht die Details der Konvertierung.

public static double GetCoordinateFromInch(double inches) 
{ 
    return inches * 72; 
} 

konnten wir gehen an andere Helfer auf diese Weise machen ...

public static double GetCoordinateFromCentimeter(double centimeters) 
{ 
    return centimeters * 0.39370 * 72; 
} 

Mit einer solchen Hilfsmethoden, könnten wir dies mit dem vorherigen Beispielcode:

double myX = GetCoordinateFromInch(3); 
double myY = GetCoordinateFromInch(7.5); 
double someWidth = 126; 
double someHeight = 36; 

XGraphics gfx = XGraphics.FromPdfPage(myPage); 
gfx.DrawImage(myBarcode, myX, myY, someWidth, someHeight); 

Ich hoffe, das ist hilfreich. Ich bin mir sicher, dass Sie saubereren Code schreiben werden als in meinem Beispiel. Außerdem gibt es wahrscheinlich viel klügere Möglichkeiten, diesen Prozess zu rationalisieren, aber ich wollte hier nur etwas einfügen, das sofort das nutzt, was wir in der Dokumentation gesehen haben.

Happy PDF-Rendering!