2016-03-23 14 views
-1

hier ist ein einfacher Code:iTextSharp - draw Rechteck - Randbreite Ausgabe

var w = Utilities.MillimetersToPoints(420); 
var h = Utilities.MillimetersToPoints(210); 

var doc1 = new Document(new Rectangle(w, h)); 

PdfWriter writer = PdfWriter.GetInstance(doc1, new FileStream("Doc1.pdf", FileMode.Create)); 

doc1.Open(); 

PdfContentByte cb = writer.DirectContent; 

var rect = new Rectangle(200, 200, 100, 100); 

und jetzt, wenn ich wie folgt vorgehen:

cb.Rectangle(200, 200, 100, 100); 
cb.Stroke(); 

dann sehe ich das Rechteck. Aber ich brauche seine Grenze Breite, so dass ich

rect.BorderWidth = 5; 
rect.BorderColor = new BaseColor(0,0,0); 

cb.Rectangle(rect); 
cb.Stroke(); 

und jetzt das Rechteck ist nicht sichtbar. Warum ?

+0

antworten Chris und meine Antworten auf Ihre Frage? – mkl

Antwort

3

Die Rectangle() Methode auf PdfContentByte hat ein paar Überlastungen und sie verhalten sich ganz unterschiedlich, je nachdem, was in dir passieren.

Ihr erstes Beispiel ist die sehr einfache Überlastung verwenden, die 4 Schwimmer nur nimmt. Wenn man sich die source for that anschaut, sieht man, dass es abgesehen von einer Plausibilitätsprüfung nur diese Koordinaten direkt in den PDF-Stream schreibt und dabei keine echten Rectangle Objekte erzeugt werden. Später, wenn Sie Stroke() aufrufen, schreibt iText den Strich Befehl in den Stream und das war's. Wenn ein PDF-Renderer (wie der von Adobe) den stroke-Befehl tatsächlich analysiert, schaut er rückwärts in den Puffer und sieht die Koordinaten, die er streichen muss und führt die Aktion aus.

Ihr zweites Beispiel verwendet die viel komplexere Überlast, die Sie see here, die eine tatsächliche Rectangle Objekt dauert. Neben der Darstellung von vier Punkten im Raum ein Rectangle hat Konzepte wie Hintergrundfarben und Grenzen und, am wichtigsten für Sie, können diese Grenzen gezeichnet werden pro Seite und müssen Sie ihm sagen, welche Seiten auf zu zeichnen.

Zum Beispiel für nur links und rechts würden Sie tun:

var rect = new iTextSharp.text.Rectangle(200, 200, 100, 100); 
rect.Border = iTextSharp.text.Rectangle.LEFT_BORDER | iTextSharp.text.Rectangle.RIGHT_BORDER; 
rect.BorderWidth = 5; 
rect.BorderColor = new BaseColor(0, 0, 0); 
cb.Rectangle(rect); 

Und für alle Grenzen würden Sie es ändern:

rect.Border = iTextSharp.text.Rectangle.BOX; 

Auch wenn diese Überlastung nannte es ist eigentlich falsch, Stroke() sofort danach zu rufen, weil diese Überladung kümmert sich um das für Sie (und möglicherweise mehr als einmal getan haben, tatsächlich.)

0

(ein Zusatz zur @ Chris Antwort)

Wenn Sie Ihre Aufgabe implementieren möchten mit den einfachen Mitteln des ersten Beispiels (seine Grenzbreite eingestellt), können Sie explizit die Breite der Linien zu Hub eingestellt :

cb.SetLineWidth(5); 
cb.Rectangle(200, 200, 100, 100); 
cb.Stroke(); 

Sie können diese Zeilen in cb.SaveState() ... cb.RestoreState() einzuhüllen wollen die geänderte Linienbreite zu verhindern später Operationen zu beeinflussen.

0
Document document = new Document(PageSize.A4, 25, 25, 30, 30); 
PdfContentByte cb = writer.DirectContent; 
     cb.Rectangle(30,660, 280,80); 
cb.Stroke(); 

der Funktionsschreiber wird gestartet, um in pdf zu schreiben, und rechteckige Funktion ist create rectangle und stroke ist über Rechteckspezifikation zu zeichnen. also musst du die stroke() funktion schreiben.