BEARBEITEN: Bessere Erklärung: Bevor ich ein Kopfgeld für diese Frage setze, möchte ich klarstellen, was ich brauche:
Ich brauche eine .NET-Bibliothek zum Erzeugen von druckbaren Dokumenten. Benutzer sollten in der Lage sein, das gleiche Dokument, das sie sehen, entweder mit meiner Anwendung oder mit einem externen Tool (wie Adobe Acrobat Reader) zu drucken. Es muss keine Bibliothek zum Erzeugen von PDF-Dokumenten sein, irgendein Dokumentformat, das die obige Bedingung erfüllt, wird dies tun.
Ich brauche die Bibliothek, um folgende Szenarien zu unterstützen:
Szenario 1:
Szenario 2:
Hinweis für das zweite Szenario: Ich habe Text mit einigen hochgestellten Teilen - Beispiel AAA{v-superscript text}BBB
(wobei Text in {}
geschweifte Klammern hochgestellt ist). Die Bibliothek muss in der Lage sein, diesen Text mit dem richtigen Kerning zu drucken. Ohne das richtige Kerning gibt es die gleiche Lücke zwischen dem letzten A
und dem ersten hochgestellten v
zwischen dem letzten hochgestellten t
und dem ersten B
. Für den Benutzer sieht es aus wie ein Leerzeichen zwischen A
und hochgestelltem v
, aber kein Leerzeichen nach dem letzten hochgestellten Buchstaben. Der Text wird also hässlich aussehen. Wenn die Bibliothek dies richtig handhaben soll, würde sie eine Methode haben, um den gesamten Text AAA{v-superscript text}BBB
auf einmal zu drucken, mit der Angabe, dass ein Teil davon hochgestellt ist. Dann würde das richtige Kerning zwischen normalem Text und hochgestelltem Text verwendet werden.
Szenario 3:
Die Bibliothek sollte kostenlos sein und nicht GPL (LGPL ist in Ordnung). Gibt es etwas, das mir erlaubt zu tun, was ich brauche? Kann es mit iTextSharp (Version 4.1.6, das ist LGPL nicht AGPL) getan werden? Oder vielleicht mit Fixed-Dokument? Vielen Dank für Anregungen.
Ursprüngliche Frage:
Ich muss komplexe Dokumente in .NET (C #) - Anwendung für den Benutzer einstellen. Die primäre Verwendung dieser Dokumente erfolgt zum Drucken.
Dokumente enthalten Text und einfach generierte Grafiken. Layout von Text und Grafik wird komplex sein und muss berechnet werden (in anderen Worten, Textposition im Dokument muss von meinem Code kontrolliert werden, es wird nicht automatisch von der gewählten Bibliothek ausgeführt).
Hier sind meine API-Anforderungen:
Es muss keine Bibliothek zum Erstellen von PDF-Dokumenten sein - jedes andere "Was Sie sehen, ist, was gedruckt wird" -Dokument-Format wird auch tun. Wenn es eine WPF-Komponente gibt, die solche Dokumente anzeigen kann, ist dies von Vorteil. Ich weiß, dass es iTextSharp gibt, aber es ist nicht einfach, 4. Anforderung mit iTextSharp zu erreichen. Natürlich wird auch eine PDF-Generierungsbibliothek, die die obigen Anforderungen erfüllt, eine großartige Lösung sein.
Vielen Dank für Anregungen, ich bin auch gerne bereit, Details oder eine klarere Erklärung zu geben.
Sie können Docotic.Pdf Library lesen (Disclaimer: Ich arbeite für Bit Miracle). Es hat eine benutzerfreundliche API und eine gute Auswahl an Beispielen, die Sie online anzeigen oder in der Beispielanzeigeanwendung ausführen können.
Auch erfüllt es Ihre Anforderungen:
Sie können hierfür die Methode PdfCanvas.MeasureText () verwenden.
Es gibt viele Überladungen, die es erlauben, Text in einer beliebigen Position oder in einem beliebigen Bereich anzuzeigen.
Die PdfCanvas.TextRise-Eigenschaft ermöglicht das Anzeigen von hochgestelltem Text. Sie können es in Kombination mit der PdfCanvas.FontSize-Eigenschaft verwenden, um die Größe von hochgestelltem Text zu steuern. Die Probe: Ссылка
Wenn Sie eine andere Schriftart oder Schriftgröße für hochgestellten Text verwenden, führt der direkte Aufruf der PdfCanvas.MeasureText () -Methode zu falschen Ergebnissen.
Es gibt Problemumgehungen:
- Messen Sie jeden Teil der Zeichenkette, der mit verschiedenen Zeichensätzen gezeichnet wurde, und summieren Sie dann alle Breiten.
- Wenn Sie die Breite des gezeichneten Texts erhalten möchten, können Sie die ursprüngliche Textposition nach dem Zeichnen einfach von der endgültigen Textposition subtrahieren.
Unterstützt. Schau dir Beispiele an:
PDF-Viewer-Komponente ist in unseren Plänen, aber derzeit Docotic.Pdf bietet keine solche Funktionalität.
Wie wäre es mit der Suche nach einer besseren Methode zur Berechnung der Breite von Text in gemischter Größe / Stil, anstatt nach anderen Bibliotheken zu suchen?
%Vor% Phrase erweitert ArrayList um verschiedene Textlayout-Funktionen und -Attribute. Absatz erweitert die Phrase. Jeder Chunk hat eine spezifische Font
mit seiner eigenen Farbe, Größe und zugrunde liegenden PDF-Schriftart. Jedes Stück hat seinen eigenen "Textanstieg", um seine Grundlinie anzupassen.
Welche Version von iText verwenden Sie? ColumnText gibt es schon seit einiger Zeit.
Sie wollen also Kerning zwischen normalem & amp; hochgestellte Buchstaben? Das klingt für mich nicht nach einer sehr guten Idee. Kerning ist eine Anpassung, so dass "T" beispielsweise "j" überhängen kann. Kerning-Werte setzen eine gemeinsame Basislinie und Schriftgröße voraus. Sie werden nie eine Baseline teilen und haben höchstwahrscheinlich unterschiedliche Schriftgrößen, wenn Sie mit hochgestelltem Text arbeiten. Und selbst wenn Sie entscheiden, dass es eine gute Idee ist, diese Werte zu verwenden (und ich würde nicht zustimmen), kern Sie die Punktgröße des Basistexts oder die Schriftgröße der hochgestellten Schrift?
Mein Punkt ist, dass ich denke, dass Ihr Ziel (tiefgestellte / tiefgestellte Textgrenzen mit normalem Text) zu einem schlechteren Layout führt, nicht besser.
Oder missverstehe ich dich? Lassen Sie mich Ihren Kommentar noch einmal lesen:
Aber wenn Sie auch diesen Text positionieren möchten, der hochgestellte Zeichen auf der Seite enthält, müssen Sie PdfContentByte verwenden.
Nicht ganz sicher, was du dort meinst. Wenn Sie Text an einer beliebigen Stelle auf der Seite platzieren möchten, müssen Sie PdfContentByte
verwenden.
Bei der Verwendung habe ich keine Möglichkeit gefunden, komplexen Text, der hochgestellt ist, gleichzeitig zu drucken.
Der gesamte Text in einem gegebenen "show text" -Befehl muss die gleiche Schriftart / Größe / Farbe / etc teilen. So funktioniert PDF , das ist keine Einschränkung von iText.
Ich denke, es erlaubt nur einen Textabschnitt in der Zeit zu drucken.
Korrigieren.
Also kann ich Text mit hochgestellten Buchstaben nicht messen, indem ich das Kerning in Betracht ziehe und ihn dann an die Stelle auf der Seite setze
Sie müssen alle Breiten der verschiedenen Stücke zusammenfügen. Ich kann nicht glauben, Kerning zwischen normalem und hochgestelltem Text ist eine gute Idee, aber eine PDF-Probe, die das Problem zeigt, könnte mich anders überzeugen.
Es scheint mir, dass Sie BaseFont.getWidthPointKerned(String text, float fontSize)
verwenden müssen. Hochgestellt, tiefgestellt oder normal, dreht sich alles um Punktgröße und Schrift. Und wenn Sie absolut darauf bestehen, können Sie BaseFont.getKerning(int c1, int c2)
verwenden, um den Kerning-Wert zwischen zwei beliebigen Buchstaben innerhalb der gleichen Schriftart zu ermitteln und damit das Zwischenkerning zu bestimmen.
Eine andere Möglichkeit, Text mit iText & amp; PdfContentByte
ist mit ColumnText
verbunden. Ich glaube, iText verwendet ColumnText, wenn er Absätze erstellt, aber ich müsste den Code überprüfen, um sicher zu sein.
Auf jeden Fall könnte Ihr Code etwa so aussehen:
%Vor%Hier ist ein Artikel zum Erstellen von FixedDocument-Objekten in MSDN.
Wenn Sie WPF verwenden und Druckqualitätsdokumente erstellen möchten, sind die integrierten FixedDocument- und XPS-Technologien wahrscheinlich das, was Sie lernen sollten. Und da Sie schließlich im Objektmodell auf das gesamte FixedDocument zugreifen können, kann es Ihnen auch Ihre Breitenzahlen mitteilen. Ich habe damit noch nicht experimentiert.
Ich denke, Sie könnten Ihr Problem überdenken, während WPF große Druckfähigkeiten hat. Sie können jedes visuelle Bild (Visualisierungen sind fast alle WPF-Klassen) genau so, wie Sie es auf dem Bildschirm sehen, auf eine wirklich einfache Art und Weise drucken. Es gibt ein gutes Tutorial hier: Ссылка
Klingt so, als müssten Sie etwas Erfahrung in GDI + sammeln.
Ich arbeitete für eine Hypothekengesellschaft und sie sind sehr speziell darin, wie sie ihre Berichte angelegt haben wollen. Bis auf Pixelgenauigkeit. Leider misst GDI + Text nicht sehr gut. Daher wäre Ihre bessere Alternative, Windows-API zu verwenden
%Vor%Übergeben Sie das Handle der Bitmap, auf der Sie zeichnen. Viel genauer.
Alternativ können Sie den TextRenderer verwenden
Ich kann nicht behaupten, wie genau es ist.
Unser Produkt PDFOne .NET entspricht möglicherweise Ihren Anforderungen. Es kommt mit lizenzfreien kommerziellen Lizenz.
PDFOne .NET wird außerdem mit einer PDF-Druckerkomponente und einer PDF-Viewer-Komponente geliefert.
HAFTUNGSAUSSCHLUSS: Ich arbeite für Gnostice.
Was es wert ist, denke ich, dass iTextSharp der einfachste ist. Sie können tun, was Sie in allen von ihnen wollen, aber sie haben jeweils Vor- und Nachteile.
Tags und Links .net pdf itextsharp pdf-generation kerning