Diese Seite kann automatisch übersetzten Text enthalten.

Dokumente erstellen

Natürlich müssen Sie ein PDF-Dokument mit Ihren Daten erzeugen. Oft möchten Sie die PDF-Datei aber auch mit Passwörtern verschlüsseln. Und normalerweise möchten Sie der Ausgabedatei außerdem PDF-Metadaten hinzufügen.

Lesen Sie weiter, um zu erfahren, wie Sie den Generator anweisen, PDF-Dateien zu verschlüsseln. Wie Sie Dokumentautor und Schlüsselwörter angeben.

Dieser Artikel ist Teil einer Reihe über Layout API für die PDF-Generierung. Wenn Sie mit der API noch nicht vertraut sind, lesen Sie zuerst den Teil Erste Schritte mit Layout API.

Erstellen von PDF-Dokumenten

Erstellen & Generieren

Der Einstiegspunkt von Layout API ist die Klasse PdfDocumentBuilder. Sie beginnen, indem Sie mit der Methode Create eine Instanz der Klasse erstellen. Um ein PDF zu erzeugen, rufen Sie die Methode Generate der Klasse auf.

Generate kann die Ausgabe in einer Datei oder in einem Stream speichern. Beide Varianten der Methode erfordern als zweiten Parameter einen Delegate vom Typ Action<Document>. Im Delegate beschreiben Sie das Dokument, das Sie erhalten möchten. Die Bibliothek generiert dann ein PDF auf Grundlage der Beschreibung.

Verschlüsselung

Um das Ausgabepdf zu verschlüsseln, rufen Sie vor der Methode Generate die Methode Encryption auf.

Dazu müssen Sie einen Verschlüsselungshandler erstellen und bereitstellen. Zum Verschlüsseln von PDF mit Passwörtern verwenden Sie einen Handler vom Typ PdfStandardEncryptionHandler.

PdfDocumentBuilder.Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Generate("encrypted-with-password.pdf", doc => doc.Pages(_ => { }));

Sie können PDF auch mit Zertifikaten verschlüsseln. Lesen Sie den Artikel PDF-Dokumente verschlüsseln. Er enthält detaillierte Informationen über Verschlüsselungshandler und PDF-Berechtigungen.

PDF-Metadaten

In einigen Workflows ist es sehr wichtig, im Ausgabepdf geeignete PDF-Schlüsselwörter und den PDF-Autor anzugeben. Layout API bietet dafür eine einfache Möglichkeit. Rufen Sie vor der Methode Generate die Methode Info auf und übergeben Sie die Metadatenwerte im Delegate.

PdfDocumentBuilder.Create()
    .Info(info =>
    {
        info.Author = $"{Environment.UserName}";
        info.Title = "Generate encrypted PDF with custom metadata";
        info.Keywords = "Metadata keywords encryption";
    })
    .Generate("metadata.pdf", doc => doc.Pages(_ => { }));

Optionen

Für denselben Inhalt kann die Bibliothek PDF-Dateien mit unterschiedlicher interner Struktur erzeugen. Diese Optionen wirken sich auf das Ausgabe-PDF aus.

Version

Verwenden Sie die Methode Version, um die minimale PDF-Formatversion für das Ausgabe-PDF festzulegen.

PdfDocumentBuilder.Create()
    .Version(PdfVersion.Pdf17)
    .Generate("version.pdf", doc => doc.Pages(_ => { }));

Bitte beachten Sie, dass die Bibliothek ein PDF mit einer höheren Version als angegeben erstellen kann. Das geschieht, wenn der Dokumentinhalt eine neuere Version erfordert. Anders ausgedrückt: wenn das Dokument Funktionen verwendet, die in der angegebenen Version des PDF-Standards nicht verfügbar sind.

Objektstreams

Standardmäßig verwendet die Bibliothek Objektstreams in generierten PDFs. Das hilft, kleinere, besser komprimierte Dateien zu erzeugen.

Sie können die API anweisen, PDF-Dateien ohne Objektstreams mit der Methode ObjectStreams zu erstellen.

PdfDocumentBuilder.Create()
    .ObjectStreams(false)
    .Generate("no-object-streams.pdf", doc => doc.Pages(_ => { }));

Ich empfehle, Objektstreams weiter zu verwenden, sofern es keine regulatorischen Anforderungen gibt. Oder wenn andere Teile Ihres Workflows keine Dokumente mit Objektstreams verarbeiten können.

Stream-Anbieter

Die Bibliothek verwendet Streams als Zwischenspeicher. Beim Generieren eines PDFs tut sie das für Bilder und andere große Objekte. Die Bibliothek bezieht Streams über den Stream-Anbieter. Es ist immer einer mit der aktuellen PdfDocumentBuilder-Instanz verknüpft.

Die Bibliothek verwendet standardmäßig den PdfMixedStorageStreamProvider. Diese Implementierung des Stream-Anbieters stellt Streams bereit, die Daten im Speicher halten. Wenn zu viele Daten anfallen, schreiben diese Streams ihren Inhalt in temporäre Dateien. Dadurch lassen sich der Speicherverbrauch reduzieren und LOH-Fragmentierung vermeiden.

Sie können Ihre eigene Implementierung der Schnittstelle IPdfStreamProvider verwenden, wenn Sie PDF-Dateien erzeugen. Ein Grund für die Änderung könnten langsame und/oder teure Festplattenoperationen sein. Cloud-Umgebungen könnten in diese Beschreibung passen.

Dieser Code zeigt, wie man ein PDF vollständig im Speicher ohne temporäre Dateien erzeugt. Bitte beachten Sie, dass dafür deutlich mehr Speicher benötigt wird als mit den Standardoptionen.

using var memoryOnlyProvider = new PdfMemoryStreamProvider();
PdfDocumentBuilder.Create()
    .StreamProvider(memoryOnlyProvider)
    .Generate("created-without-temp-files.pdf", doc => doc.Pages(_ => { }));

Die Bibliothek ruft letztlich für jeden Stream, den sie über den Stream-Anbieter erhält, Dispose auf. Sie müssen die Instanz des Stream-Anbieters selbst freigeben.