{"id":553,"date":"2008-08-02T10:44:24","date_gmt":"2008-08-02T09:44:24","guid":{"rendered":"http:\/\/minibrain.wordpress.com\/2008\/08\/02\/tutorial-itextsharp-erstellen-von-pdf-objekten\/"},"modified":"2008-08-02T10:44:24","modified_gmt":"2008-08-02T09:44:24","slug":"tutorial-itextsharp-erstellen-von-pdf-objekten","status":"publish","type":"post","link":"https:\/\/abramowitsch.de\/blog\/?p=553","title":{"rendered":"Tutorial iTextSharp: Erstellen von PDF-Objekten"},"content":{"rendered":"<h2>Texte<\/h2>\n<p>In iTextSharp werden Texte mithilfe von drei Klassen zusammengesetzt: Chunk, Phrase und Paragraph. Diese sollen in den n\u00e4chsten Zeilen etwas n\u00e4her beschrieben werden.<\/p>\n<h3>Chunk<\/h3>\n<p>Die Klasse Chunk befindet sich im Namespace iTextSharp.text. Chunk stellt die \u201ekleinste\u201c Einheit in iTextSharp dar. Es besteht aus einem String, bei dem alle Zeichen die gleiche Formatierung (also Schriftart, -gr\u00f6\u00dfe, -stil und -farbe) besitzen.<\/p>\n<p>Chunk-Objekte besitzen keinerlei Informationen \u00fcber Zeilenabst\u00e4nde. Das hei\u00dft, dass wenn der enthaltene String zu lang ist, wird ein Wagenr\u00fccklauf (Carriage return) ohne Zeilenvorschub ausgel\u00f6st. Das Resultat ist das, dass die gerade geschriebene Zeile \u00fcberschrieben wird (ohne gel\u00f6scht zu werden). Deshalb sollten Chunk-Objekte in der Regel nicht dazu verwendet werden, direkt einem Dokument hinzugef\u00fcgt zu werden. Stattdessen sollten sie in Kombination mit anderen Objekten verwendet werden.<\/p>\n<p><strong>Code-Beispiel<\/strong><\/p>\n<p><span style=\"font-family:&quot;font-size:x-small;\">Document doc = new Document(PageSize.A4);<br \/>\nPdfWriter writer = PdfWriter.GetInstance(doc, File.Create(&#8222;Zitate.pdf&#8220;));<br \/>\ndoc.Open();<br \/>\nChunk zitatEinstein = new Chunk(&#8222;Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.&#8220;);<br \/>\nChunk zitatTwain = new Chunk(&#8222;Gib jedem Tag die Chance, der sch\u00f6nste deines Lebens zu werden.&#8220;);<br \/>\ndoc.Add(zitatEinstein);<br \/>\ndoc.Add(zitatTwain);<br \/>\ndoc.Close();<\/span><\/p>\n<p><strong>Ausgabe im Adobe Reader<\/strong><\/p>\n<p><a href=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image4.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right:0;border-top:0;border-left:0;border-bottom:0;\" src=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image-thumb2.png\" alt=\"image\" width=\"244\" height=\"183\" \/><\/a><\/p>\n<h3>Phrase<\/h3>\n<p>Ein Phrase-Objekt (engl. Satz) besteht aus einer Aneinanderreihung von Chunk-Objekten mit einem wichtigen Extra: Wenn ein Zeilenende erkannt wird, dann wird neben den Wagenr\u00fccklauf (Carriage Return) auch ein Zeilenvorschub (New Line \/ Line Feed) ausgel\u00f6st, sodass sich die Chunks nicht mehr \u00fcberschreiben. Der Zeilenabstand wird auch als <em>Leading<\/em> bezeichnet und kann im Konstruktor als auch in der Leading-Eigenschaft der Phrase-Klasse als float-Wert angegeben werden.<\/p>\n<p>Zus\u00e4tzlich ist es m\u00f6glich, eine Hauptschriftart anzugeben, mit der das Phrase-Objekt formatiert wird. Somit erhalten alle enthaltenen Chunk-Objekte die gleiche Formatierung und ein einheitliches Aussehen. Aber ebenso kann man auch jedes Chunk-Objekt einzeln formatieren.<\/p>\n<p><strong>Code-Beispiel<\/strong><\/p>\n<p><span style=\"font-family:&quot;font-size:x-small;\">Document doc = new Document(PageSize.A4);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">PdfWriter writer = PdfWriter.GetInstance(doc, File.Create(&#8222;Zitate.pdf&#8220;));<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">doc.Open();<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">Chunk zitatEinstein = new Chunk(&#8222;Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.&#8220;);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">Chunk zitatTwain = new Chunk(&#8222;Gib jedem Tag die Chance, der sch\u00f6nste deines Lebens zu werden.&#8220;);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">Phrase zitate = new Phrase(25);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">zitate.Add(zitatEinstein);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">zitate.Add(zitatTwain);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">doc.Add(zitate);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">doc.Close();<\/span><\/p>\n<p><strong>Ausgabe im Adobe Reader<\/strong><\/p>\n<p><a href=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image5.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right:0;border-top:0;border-left:0;border-bottom:0;\" src=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image-thumb3.png\" alt=\"image\" width=\"244\" height=\"183\" \/><\/a><\/p>\n<h3>Paragraph<\/h3>\n<p>Das Paragraph-Objekt verbindet mehrere Chunk- und Phrase-Objekte zu einem Absatz (Paragraph, engl. Absatz). Nach jedem Absatz wird automatisch ein Zeilenumbruch erstellt. Das entspricht etwa dem, dass man einem Phrase-Objekt ein Chunk.NEWLINE oder new Chunk(&#8222;n&#8220;) anh\u00e4ngt.<\/p>\n<p>Die Paragraph-Klasse leitet von der Phrase-Klasse ab und erg\u00e4nzt diese um einige Funktionen:<\/p>\n<p><a href=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image6.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right:0;border-top:0;border-left:0;border-bottom:0;\" src=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image-thumb4.png\" alt=\"image\" width=\"244\" height=\"244\" \/><\/a><\/p>\n<p>Abbildung 3: Klassenhierarchie bei Phrase und Paragraph<\/p>\n<p>Der Zusammenhang zwischen Chunk, Phrase und Paragraph soll in folgender Abbildung verdeutlicht werden:<\/p>\n<p><a href=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/bild1.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right:0;border-top:0;border-left:0;border-bottom:0;\" src=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/bild1-thumb.png\" alt=\"Bild1\" width=\"304\" height=\"128\" \/><\/a><\/p>\n<p>Abbildung 4: Zusammenhang zwischen Paragraph, Phrase und Chunk<\/p>\n<h4>Initialisierung<\/h4>\n<p>Die Paragraph-Klasse besitzt mehrere Konstruktoren:<\/p>\n<p><span style=\"font-family:&quot;font-size:x-small;\">public Paragraph()<br \/>\npublic Paragraph(float leading)<br \/>\npublic Paragraph(Chunk chunk)<br \/>\npublic Paragraph(float leading, Chunk chunk)<br \/>\npublic Paragraph(string str)<br \/>\npublic Paragraph(string str, Font font)<br \/>\npublic Paragraph(float leading, string str)<br \/>\npublic Paragraph(float leading, string str, Font font)<br \/>\npublic Paragraph(Phrase phrase) <\/span><\/p>\n<p>Ein Absatz kann also aus Chunks, Phrases oder String-Objekten erstellt werden. \u00dcber das Font-Objekt kann eine beliebige Schriftart f\u00fcr den Absatz festgelegt werden.<\/p>\n<h4>Abstand zwischen den Zeilen festlegen<\/h4>\n<p>Zus\u00e4tzlich unterst\u00fctzen einige Konstruktoren die Definition von Zeilenabst\u00e4nden (hier leading genannt). Alternativ kann \u00fcber die Leading-Eigenschaft der Zeilenabstand festgelegt werden.<\/p>\n<h4>Abstand zwischen Abs\u00e4tzen festlegen<\/h4>\n<p>Den Abstand zwischen einzelnen Abs\u00e4tzen kann \u00fcber die Eigenschaften SpacingBefore und SpacingAfter gesteuert werden. Dabei wird der angegebene Wert zu dem Wert addiert, der als leading definiert wurde.<\/p>\n<h4>Ausrichtung<\/h4>\n<p>Als \u201eBesonderheit\u201c beim Paragraph-Objekt ist die M\u00f6glichkeit, Textausrichtungen vorzunehmen. Dazu wird die Methode SetAlignment verwendet. Als Parameter wird ein String erwartet, der als Konstante in ElementTag-Klasse festgelegt ist. M\u00f6gliche Werte sind: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_JUSTIFIED, ALIGN_JUSTIFIED_ALL, ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM und ALIGN_BASELINE.<\/p>\n<p>Ebenso w\u00e4re es m\u00f6glich, anstatt die SetAlignment-Methode zu verwenden, der Alignment-Eigenschaft einen Wert zuzuweisen. Dieser Wert muss dabei vom Typ integer sein. Auch hier gibt es wieder Konstanten, die zum Setzen der richtigen Ausrichtung verwendet werden \u2013 allerdings sind sie in der Element-Klasse definiert: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_JUSTIFIED, ALIGN_JUSTIFIED_ALL, ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM und ALIGN_BASELINE.<\/p>\n<p>Wann man welche Methode verwendet, ist reine Geschmackssache. Intern wird SetAlignment auf Alignment gemappt.<\/p>\n<p>Nachfolgend ein paar <strong>Code-Beispiele<\/strong> f\u00fcr die Textausrichtung im Absatz:<\/p>\n<p><span style=\"font-family:&quot;font-size:x-small;\">Document doc = new Document(PageSize.A4);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">PdfWriter writer = PdfWriter.GetInstance(doc, File.Create(&#8222;Zitate.pdf&#8220;));<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">doc.Open();<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">Chunk zitatTwain = new Chunk(&#8222;Gib jedem Tag die Chance, der sch\u00f6nste deines Lebens zu werden.&#8220;);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">zitatTwain.Font = FontFactory.GetFont(&#8222;Tahoma&#8220;, 24);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">Paragraph paragraphTwain = new Paragraph(zitatTwain);<\/span><\/p>\n<p><span style=\"font-size:x-small;\">Setzen der Ausrichtung \u00fcber SetAlignment-Methode<\/span><\/p>\n<p><span style=\"font-family:&quot;font-size:x-small;\">paragraphTwain.SetAlignment(ElementTags.ALIGN_CENTER);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">doc.Add(paragraphTwain);<br \/>\n<\/span><span style=\"font-family:&quot;font-size:x-small;\">paragraphTwain.SetAlignment(ElementTags.ALIGN_LEFT);<\/span><\/p>\n<p>Setzen der Ausrichtung \u00fcber Alignment-Eigenschaft<\/p>\n<p><span style=\"font-family:&quot;\">doc.Add(paragraphTwain);<br \/>\n<\/span><span style=\"font-family:&quot;\">paragraphTwain.Alignment = Element.ALIGN_RIGHT;<br \/>\n<\/span><span style=\"font-family:&quot;\">doc.Add(paragraphTwain);<br \/>\n<\/span><span style=\"font-family:&quot;\">doc.Close();<\/span><\/p>\n<p><strong>Ausgabe im PDF<\/strong><\/p>\n<p><a href=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image7.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right:0;border-top:0;border-left:0;border-bottom:0;\" src=\"http:\/\/abramowitsch.de\/blog\/wp-content\/uploads\/2008\/08\/image-thumb5.png\" alt=\"image\" width=\"244\" height=\"183\" \/><\/a><\/p>\n<h4>Einr\u00fcckungen am Absatzanfang<\/h4>\n<p>Weiterhin besitzt das Paragraph-Objekt noch die M\u00f6glichkeit, Einr\u00fcckungen am Anfang eines Absatzes einzuf\u00fcgen. Die wird mithilfe der IdentationLeft- und IdentationRight-Eigenschaft.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Texte In iTextSharp werden Texte mithilfe von drei Klassen zusammengesetzt: Chunk, Phrase und Paragraph. Diese sollen in den n\u00e4chsten Zeilen etwas n\u00e4her beschrieben werden. Chunk Die Klasse Chunk befindet sich im Namespace iTextSharp.text. Chunk stellt die \u201ekleinste\u201c Einheit in iTextSharp dar. Es besteht aus einem String, bei dem alle Zeichen die gleiche Formatierung (also Schriftart, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3],"tags":[126,57,86],"class_list":["post-553","post","type-post","status-publish","format-standard","hentry","category-net","tag-net","tag-itextsharp","tag-tutorial"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Ug90-8V","_links":{"self":[{"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=553"}],"version-history":[{"count":0,"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/553\/revisions"}],"wp:attachment":[{"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/abramowitsch.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}