Ihre PDF-Bibliothek wechseln, ohne alles neu zu schreiben

Nur ein Teil Ihres Programms schreibt Dokumente. Ihre Seitenentwürfe, Ihre Daten, Ihre Geschäftsregeln und Ihre Bildschirme bewegen sich nicht. Was sich bewegt, ist die Handvoll Dateien, die aus einer Datenzeile eine Seite machen — und diese Dateien bauen auf denselben Ideen auf wie die Engine hier.

Was Sie ersetzen, und was Sie unangetastet lassen

Stellen Sie sich Ihr Rechnungsprogramm vor. Da ist der Teil, der entscheidet, was auf eine Rechnung kommt: welcher Kunde, welche Positionen, welche Summen, welche Regeln in welchem Land gelten. Und da ist der Teil, der es zu Papier bringt: dieser Text hier, jene Tabelle dort, das Logo oben links, der Barcode unten rechts.

Nur der zweite Teil ändert sich. Der erste Teil — der, den richtig hinzubekommen Jahre gedauert hat — ist gar nicht betroffen. Er liefert weiterhin dieselben Zahlen. Etwas anderes erzeugt die Seiten.

Auf Ihrer Seite bewegt sich sonst auch nichts: Ihre Datenbank, Ihr Webserver, Ihre Zeitpläne, die Art, wie Dokumente gespeichert und versendet werden, Ihre Tests, Ihr Build. Ihre Kunden erhalten dieselbe Rechnung.

Was gleich ist

Jede Bibliothek, die PDF schreibt, baut auf derselben Handvoll Ideen auf, denn das Format hat sie, und niemand kann andere erfinden. Eine Seite einer Größe. Eine in die Datei gelegte Schrift. Ein Textblock, der fließt und umbricht, wo ihm der Platz ausgeht. Eine Tabelle mit Spalten und Linien. Ein Bild, platziert und skaliert. Ein Barcode. Ein Feld, das jemand ausfüllt. Eine Signatur. Eine Reihe von Angaben über das Dokument.

Sie finden all das hier, unter selbst gewählten Namen, mit derselben Aufgabe. Wer bereits beruflich Dokumente geschrieben hat, erkennt jedes davon wieder und muss nur unsere Namen lernen.

Was anders ist

Unsere Namen sind unsere eigenen, unsere Art, eine Seite zu gestalten, ist unsere eigene, und Ihre Programmierer schreiben die Aufrufe um.

Was sie nicht neu schreiben, ist der Entwurf. Die Seite, die Sie heute haben, mit dem Logo auf dieser Höhe und der Tabelle ab dieser Zeile, wird neu beschrieben — sie wird nicht neu erfunden.

Zwei weitere Unterschiede. Unsere Engine wird aus Rust und Python aufgerufen; ist Ihr Programm in einer anderen Sprache geschrieben, ist eine C-API für eine künftige Version geplant, und heute gingen Sie stattdessen über den Server — Sie senden ihm, was auf die Seite soll, und er übergibt Ihnen das Dokument, was aus jeder Sprache funktioniert. Und wie Sie Dinge verlangen, ist auf dieser Website vollständig aufgeschrieben, Seite für Seite, mit einem Dokument zum Herunterladen für jede: Sie können alles lesen, bevor Sie sich auf etwas festlegen.

Wie lange es dauert

Niemand kann es Ihnen auf den Tag genau sagen, ohne Ihr Programm zu sehen. Zählen Sie Ihre Dokumentmodelle — nicht Ihre Dokumente. Eine Rechnung ist ein Modell, auch wenn Sie vierhunderttausend davon versenden; eine Rechnung, eine Gutschrift, ein Lieferschein, ein Kontoauszug und eine Mahnung sind fünf.

Die Dauer bestimmen diese Zahl, wie viel Ihres Layouts eine über viele Seiten laufende Tabelle ist und wie tief der Code, der das Dokument erzeugt, mit dem Rest Ihres Programms verflochten ist. Sonst wiegt nichts darauf: Ihre Daten, Ihre Regeln und Ihre Bildschirme bleiben, wo sie sind.

Wie groß das Vorhaben auch ist, tun Sie zuerst dies: Nehmen Sie Ihr kompliziertestes Dokument, schreiben Sie es mit uns neu und legen Sie beide nebeneinander. Kommt dieses richtig heraus, ist der Rest Wiederholung. Wenn nicht, haben Sie es am Anfang erfahren statt am Ende.

Wie lange Ihres auch ausfällt, das Team bleibt bei Ihnen. Die Leute, die die Engine schreiben, sind die Leute, die Ihre Nachrichten beantworten, innerhalb eines Arbeitstags und meist schneller.

Alles, was die Engine heute schreibt

Hier steht, was die Engine heute schreibt. Es ist die Liste, an der Sie Ihre eigenen Anforderungen Zeile für Zeile messen.

Text
Ihre eigenen Schriften in der Datei getragen, wobei nur die tatsächlich verwendeten Buchstaben mitreisen, Text, der markierbar und durchsuchbar bleibt, Text, der über Spalten und Seiten fließt, und Text, den Sie messen können, bevor Sie ihn zeichnen.
Tabellen
Spalten, die Sie bemessen oder von der Engine bemessen lassen, Linien und Rahmen nebeneinander, übergreifende Zellen, oben auf jeder Seite wiederholte Überschriften, eine Tabelle, die über so viele Seiten läuft, wie sie braucht.
Bilder
JPEG, PNG, BMP und TIFF, platziert, skaliert und zugeschnitten; ein TIFF mit mehreren Bildern wird Bild für Bild gelesen.
Farbe und Druck
die Farben eines Bildschirms und die vier Druckfarben einer Druckmaschine, ICC-Farbprofile, Sonderfarben, Überdrucken und das Kennzeichen, ob der Auftrag überfüllt wurde. Schnitt- und Anschnittmarken werden wie alles andere auf die Seite gezeichnet, und drei der Beispiele zeichnen ihre.
Barcodes und quadratische Codes
die Strichcodes der Ladenkasse, des Lagers und der Werkbank — Code 128, Code 39, Code 93, ITF-14, Codabar, EAN-13, UPC-A, EAN-8, UPC-E, GS1 DataBar und die beiden Add-ons — dazu QR-Codes, Data Matrix, PDF417 und Aztec.
Formulare
Felder, in die jemand tippt, die er ankreuzt, aus einer Liste wählt und unterschreibt.
Normen
PDF/A-2, PDF/A-3 und PDF/A-4, um ein Dokument lesbar zu halten, PDF/X-4 für die Druckmaschine, PDF/UA-1 und PDF/UA-2 für ein Dokument, das sich ohne Sehen der Seite lesen lässt, Factur-X für die elektronische Rechnung — die auf der europäischen Norm EN 16931 aufbaut — und vollständiges Tagging unter allem.
Signieren
PAdES-Signaturen, wobei Ihr Zertifikat auf Ihrer Maschine bleibt und nie auf unserer.
Schutz
AES-256-Verschlüsselung, ein Passwort, bevor die erste Seite erscheint, und Berechtigungen pro Aktion.
Ein vorhandenes PDF lesen
eine von einem anderen Programm geschriebene Datei öffnen, ihre Seiten, Notizen, Links, Felder, Lesezeichen, Ebenen und Struktur lesen und eine ganze Seite daraus in das Dokument übernehmen, das Sie schreiben.
Die Datei selbst
jedes übliche Seitenformat und jedes Format, das Sie nennen, eine gewählte Kompressionsstufe, eine gewählte Formatversion, dieselben Daten, die jedes Mal dieselben Bytes ergeben (ein Datum oder ein Verschlüsselungsschlüssel kommt von dem Programm, das sie aufruft), und — was eine eigene Seite wert ist — ein Dokument, das so geschrieben ist, dass seine erste Seite erscheint, bevor die Datei vollständig angekommen ist. Das Buch selbst Wie das funktioniert und was es spart

Für eine künftige Version geplant: eine C-API, die jede Sprache nutzen kann, die C aufrufen kann, und der automatische Ersatz einer fehlenden Schrift.

Technisch

Zwei Sprachschnittstellen über einem Kern, jede in ein eigenes Programm eingebunden: ein Rust-Crate und ein auf der stabilen ABI gebautes CPython-Wheel, beide offline, beide deterministisch, beide auf eine Version festgelegt und aus Ihrem eigenen Artefaktspeicher auflösbar. Die Python-Schnittstelle ist die Rust-Schnittstelle — dieselben Objektfamilien, dieselben Aufrufnamen, auf Python-Konventionen übertragen —, sodass ein Machbarkeitsnachweis in Python ohne Neuentwurf nach Rust übergeht oder umgekehrt.

Die Aufrufe nehmen typisierte Objekte an, keine Optionszeichenketten: Sie bauen die Objekte und übergeben sie einem Dokument. Das ist ein echter Umschreibaufwand überall, wo die Aufrufe geschrieben sind, und ein echter Gewinn bei allem danach — der Compiler fängt beim Build ab, was eine Zeichenketten-API zur Laufzeit auf der Maschine des Kunden abfängt.

Das Layout ist messbar, bevor es festgelegt wird: Fragen Sie, welche Breite ein Textabschnitt einnehmen wird, fragen Sie nach der größten Schriftgröße, in der ein Titel noch in eine gegebene Breite passt, fragen Sie einen Fließblock, wie weit er gekommen ist, und erhalten Sie zurück, wo er aufgehört hat. So lässt sich eine Migration an der alten Ausgabe prüfen statt nach Augenmaß.

Jedes ausgearbeitete Beispiel dieser Website gibt es in Rust und in Python, und ein wachsender Teil davon ein drittes Mal als JSON-Anfrage, die der Server beantwortet. Ein Skript führt alle drei erneut aus und vergleicht die Ergebnisse, Byte für Byte, wo beide Arten der Anfrage dieselben Anweisungen schreiben, Punkt für Punkt, wo nicht. Dieser Vergleich ist bereits geschrieben, und er ist die Vorlage, um Ihre eigene Migration zu prüfen: die alte und die neue Datei, Seite für Seite, von einem Programm verglichen statt von jemandem, der scrollt.

Ein dritter Weg, ohne dass etwas in Ihr Programm eingebunden wird: Senden Sie dem Server eine JSON-Anfrage, die das Dokument beschreibt, und er gibt das PDF zurück. Das ist der Weg für ein Programm, das weder in Rust noch in Python geschrieben ist, und der Weg, mit dem man beginnt, während die Migration selbst geplant wird.

Wo Sie als Nächstes nachsehen

Alles, was die Engine auf eine Seite setzt, Gruppe für Gruppe Die Engine in Ihrem eigenen Programm Ein Dokument über das Internet anfordern, ohne etwas zu installieren Die elektronische Rechnung und die Termine, die das Gesetz setzt

Die Preise ansehen Die Beispiele ansehen