.NET-Bibliothek zum Setzen von Dokumenten (PDF oder ähnliches)?

8

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:

  1. Ich erstelle Text in irgendeiner Schrift und Farbe.
  2. Ich frage die Bibliothek nach der Breite, wenn dieser Text gedruckt wird.
  3. Ich berechne Position ([X, Y] Koordinaten auf Seite) dieses Textes basierend auf Informationen von 2. und lasse die Bibliothek an dieser Position auf einer Seite drucken.

Szenario 2:

  1. Ich erstelle einen Text mit einigen Teilen davon in hochgestellter Schrift. Alle Teile des Textes (normal und hochgestellt) sind in derselben (aber variablen) Schriftart.
  2. Ich frage die Bibliothek, was die Breite ist, wenn dieser Text gedruckt wird. Ich bekomme die richtige Antwort, die auch Kerning zwischen normalem Text und hochgestelltem Text berücksichtigt.
  3. Ich berechne die Position ([X, Y] -Koordinaten) auf einer Seite, auf der dieser Text gedruckt werden soll (unter Verwendung der Breite aus Schritt 2.). Ich lasse die Bibliothek an dieser Stelle drucken. Auf der Seite gedruckt hat es genau die Breite, die von Bibliothek im vorherigen Schritt zurückgegeben wurde.

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:

  1. Ich möchte ein Bild drucken, das aus Linien, Kreisen, gefüllten Kreisen, Buchstaben und Bezierkurven am exakten Punkt einer Seite besteht. Ich muss die Breite von Linien und Kreisen angeben. Alle Formen müssen in Pixelgenauigkeit gedruckt werden.

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:

  1. Funktion, die die genaue Breite für die angegebene Zeichenfolge und die gegebene Schriftart zurückgibt, in der der Text angezeigt werden soll
  2. Möglichkeit, Text an der exakten Position auf der Seite zu positionieren
  3. habe Text mit einem Teil davon im Super-Skript
  4. Funktion, um die genaue Breite eines Textes zu erhalten, der einen Teil davon hochgestellt hat
  5. Fähigkeit, Bilder oder sogar bessere Option hinzuzufügen, um einfache Graphiken zu zeichnen (Linie der gegebenen Stärke, gefüllter Kreis des gegebenen Radius / Durchmessers)

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.

    
drasto 12.04.2011, 00:15
quelle

7 Antworten

4

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:

  • Funktion, die die genaue Breite für die angegebene Zeichenfolge und die gegebene Schriftart zurückgibt, in der der Text angezeigt werden soll

Sie können hierfür die Methode PdfCanvas.MeasureText () verwenden.

  • Möglichkeit, Text an der exakten Position auf der Seite zu positionieren

Es gibt viele Überladungen, die es erlauben, Text in einer beliebigen Position oder in einem beliebigen Bereich anzuzeigen.

Ссылка

Ссылка

  • habe Text mit einem Teil davon im Super-Skript

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: Ссылка

  • Funktion, um die genaue Breite eines Textes zu erhalten, der einen Teil davon hochgestellt hat

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.

  • Fähigkeit, Bilder oder sogar bessere Option hinzuzufügen, um einfache Graphiken zu zeichnen (Linie der gegebenen Stärke, gefüllter Kreis des gegebenen Radius / Durchmessers)

Unterstützt. Schau dir Beispiele an:

Ссылка

Ссылка

PDF-Viewer-Komponente ist in unseren Plänen, aber derzeit Docotic.Pdf bietet keine solche Funktionalität.

    
Vitaliy Shibaev 12.04.2011 17:42
quelle
2

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%     
Mark Storer 12.04.2011 23:19
quelle
1

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.

    
Dave White 12.04.2011 02:20
quelle
1

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: Ссылка

    
Martín Coll 21.04.2011 01:43
quelle
1

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.

    
The Lazy Coder 22.04.2011 05:57
quelle
1

Unser Produkt PDFOne .NET entspricht möglicherweise Ihren Anforderungen. Es kommt mit lizenzfreien kommerziellen Lizenz.

  1. Funktion, die die exakte Breite für die angegebene Zeichenfolge und die angegebene Schriftart zurückgibt, in der der Text angezeigt werden soll
    Sie können hierfür die Methode PDFFont.GetTextWidth () verwenden.
  2. Möglichkeit, Text an die genaue Position auf der Seite zu positionieren
    Sie könnten eine der vielen PDFDocument.WriteText () - Überladungen für dieses
  3. verwenden
  4. habe Text mit einem Teil davon in Super-Skript
    PDF hat keine dieses Konzept in seinen Texten. Was uns als Superstring erscheint, ist nur ein anderer String mit einer anderen Schriftgröße und Position. Sie müssen dafür nur einen anderen Text aufrufen.
  5. Funktion, um die genaue Breite eines Textes zu erhalten, der einen Teil davon hochgestellt hat.
    Verweisen auf vorherige Antwort.
  6. Möglichkeit zum Hinzufügen von Bildern oder noch besser Option zum Zeichnen einfacher Grafiken (Linie mit gegebener Dicke, gefüllter Kreis mit gegebenem Radius / Durchmesser) - PDFOne .NET hat Renderbilder, Quadrate, Rechtecke, Bögen, Bezeir-Kurven, Ellipsen, Kreise, Rechtecke, Polylinien, Polygone, Rechtecke, Wasserzeichen, Stempel, verschiedene Arten von Anmerkungen, ...

PDFOne .NET wird außerdem mit einer PDF-Druckerkomponente und einer PDF-Viewer-Komponente geliefert.

HAFTUNGSAUSSCHLUSS: Ich arbeite für Gnostice.

    
BZ1 12.04.2011 05:10
quelle
0
  1. LaTeX: LaTeX für die PDF-Generierung in der Produktion
  2. Für Pay-Bibliotheken wie Aspose: Ссылка
  3. einfaches HTML mit gutem CSS kann auch ziemlich gut funktionieren.
  4. Microsoft Open XML: Ссылка

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.

    
Milimetric 12.04.2011 02:02
quelle