Diese Seite kann automatisch übersetzten Text enthalten.

So ordnen Sie PDF-Seiten an

Die PdfDocumentBuilder.Generate-Methode stellt ihrem Delegate ein Objekt vom Typ Document zur Verfügung. Verwenden Sie die Pages-Methode dieses Objekts, um die Seiten Ihres Dokuments zu erstellen. Sie müssen der Methode einen Delegate übergeben, der einen Parameter vom Typ PageLayout akzeptiert.

PDF-Seiten anordnen

Ein Aufruf der Methode genügt, wenn alle Seiten in Ihrem PDF-Dokument dasselbe Layout haben. Wenn Ihr Dokument unterschiedliche Layouts enthält, verwenden Sie mehr als einen Aufruf der Pages-Methode. Sie können die Methode beispielsweise einmal aufrufen, um eine Titelseite zu gestalten. Danach rufen Sie die Methode erneut auf, um den Berichtskörper zu beschreiben.

Jeder Aufruf von Pages erstellt mindestens eine Seite. Die erstellte Seite kann leer sein, wenn für sie kein Inhalt bereitgestellt wird.

Dieser Artikel ist Teil einer Serie über die Layout API für die PDF-Erzeugung. Wenn Sie die API noch nicht kennen, lesen Sie zuerst den Teil Erste Schritte mit Layout API.

Inhaltsbereiche

Um das Layout von Seiten zu beschreiben, verwenden Sie vordefinierte Container. Ich nenne sie auch Inhaltsbereiche. Sie können auf diese Container zugreifen, indem Sie Methoden eines PageLayout-Objekts aufrufen.

Es gibt drei Hauptbereiche: Content, Header und Footer. Und zwei Bereiche für zusätzlichen Inhalt: Background und Foreground. Standardmäßig sind alle fünf Container leer und beanspruchen keinen Seitenplatz. Sie verteilen den Seiteninhalt gemäß Ihren Anforderungen auf die Bereiche.

Lesen Sie den Artikel Container und ihr Inhalt, um zu erfahren, wie Sie Ihre Seiten mithilfe von Containern anordnen.

Es wird Sie nicht überraschen, dass der Inhalt von Kopf- und Fußzeile in die Bereiche Header bzw. Footer gehört. Die API wiederholt diese Bereiche auf jeder erzeugten Seite oberhalb und unterhalb des Hauptinhalts. Die Layout API teilt Inhalt von Kopf- oder Fußzeile niemals über mehrere Seiten auf. Sie erhalten eine LayoutException, wenn eine Kopf- oder Fußzeile nicht auf eine Seite passt.

Hauptinhalt

Der eigentliche Seiteninhalt, wie Bilder, Tabellen und Text, gehört in den Bereich Content. Die Layout API teilt diesen Inhalt automatisch auf Seiten auf.

Der folgende Code weist allen Hauptinhaltsbereichen einfachen Textinhalt zu. Der Code legt außerdem Hintergrundfarben für die Bereiche fest.

PdfDocumentBuilder.Create().Generate("pages-main-slots.pdf", doc => doc.Pages(pages => {
    pages.Header()
        .Text("This text goes to the header")
        .BackgroundColor(new PdfRgbColor(66, 135, 245));

    pages.Content()
        .Text("The main content goes in this slot")
        .BackgroundColor(new PdfRgbColor(242, 233, 206));

    pages.Footer()
        .Text("This is the footer contents")
        .BackgroundColor(new PdfRgbColor(194, 192, 188));
}));

Prüfen Sie das Ergebnis des Codes in pages-main-slots.pdf.

Wie Sie sehen können, beansprucht jeder Bereich nur einen Teil der Seite. Der genaue Bereich hängt vom Inhalt innerhalb des Bereichs ab. Der Bereich Header klebt am oberen Seitenrand. Der Bereich Content beginnt unmittelbar nach Header. Der Bereich Footer klebt am unteren Rand.

Zusätzlicher Inhalt

Die Container Background und Foreground stellen Container für Wasserzeichen, Überlagerungen und Hintergründe bereit. Alle Inhalte im Bereich Background liegen unter Kopfzeile, Fußzeile und Hauptinhalt einer Seite. Der Inhalt im Bereich Foreground überdeckt alles, was zur Seite hinzugefügt wird.

Diese Container beanspruchen die gesamte Seite. Das ist das besondere Merkmal dieser Container. Die API wiederholt ihren Inhalt auf jeder erzeugten Seite. Genau wie bei Kopf- und Fußzeilen-Containern.

Ich habe dem obigen Code einige Zeilen hinzugefügt, um zu zeigen, wie die Container Foreground und Background verwendet werden.

PdfDocumentBuilder.Create().Generate("pages-all-slots.pdf", doc => doc.Pages(pages => {
    // ... 

    pages.Background()
        .Background(new PdfRgbColor(208, 227, 204));

    pages.Foreground()
        .Rotate(45)
        .Text(new string(' ', 30) + "Your watermark could go here, in the foreground");
}));

Für den Container Background gebe ich keinen Text oder Ähnliches an. Ich lege nur die Hintergrundfarbe fest. Alles unterhalb von Kopfzeile, Hauptinhalt und Fußzeile zeigt diesen Grünton.

Ich drehe den Inhalt im Container Foreground und füge etwas Text hinzu. Wegen der führenden Leerzeichen überdeckt der Text nicht den Inhalt der Kopf- oder Fußzeile. Inhalt in allen Containern ist auf der Seite sichtbar.

Sie können das Ergebnis des Codes in pages-all-slots.pdf sehen.

Einstellungen

Bis hierhin konzentrierten sich alle Codeausschnitte auf die Container, aus denen die Seiten bestehen. Jetzt ist es an der Zeit zu sehen, wie Sie die Seiten selbst anpassen können, statt nur ihre Inhaltsbereiche.

Zum Einrichten von Seiten verwenden Sie Methoden der Klasse PageLayout. Denken Sie daran, dass ein PageLayout-Objekt mehr als eine Seite beschreiben kann. Methodenaufrufe wirken sich auf alle von Ihnen beschriebenen Seiten aus.

Größe

Wahrscheinlich ist die grundlegendste Einstellung die Seitengröße. Mit der Methode Size können Sie eine der vordefinierten Größen für Ihre Seiten angeben. Es gibt alle üblichen Größen wie A4, Ledger oder Monarch Envelope.

Optional können Sie eine Ausrichtung für die Seiten angeben. Es ist auch möglich, eine benutzerdefinierte Seitengröße festzulegen, indem Sie Breite und Höhe in Punkten angeben.

Seitenränder

Seitenränder können zur Lesbarkeit, Ästhetik und Gesamtkomposition Ihrer Seiten beitragen.

Setzen Sie alle Seitenränder mit der Methode Margin auf denselben Wert in Punkten. Verwenden Sie die Methoden MarginVertical und MarginHorizontal, um nur vertikale oder horizontale Ränder festzulegen. Verwenden Sie die Methoden MarginLeft/Top/Right/Bottom, um jeden Rand unabhängig voneinander anzugeben.

Textstil

Die Layout API stellt die Klasse TextStyle zum Erstellen von Textstilen bereit. Sie erstellen und wenden Stile auf Text an, um das gewünschte Erscheinungsbild zu erzielen.

Es gibt Fälle, in denen ein großer Teil des Textes auf Ihren Seiten denselben Stil verwendet. Sie können diesen Stil als Standard-Textstil für die Seiten festlegen. Der Standardstil wirkt sich auf den gesamten Text in den Hauptinhaltsbereichen aus. Sie können den Standardstil aber für bestimmte Elemente überschreiben. Wenden Sie einfach einen anderen Stil auf Textabschnitte an, die anders aussehen sollen.

PdfDocumentBuilder.Create().Generate("pages-text-styles.pdf", doc =>
{
    var defaultStyle = TextStyle.Parent.FontSize(30);
    var tightSpacing = TextStyle.Parent.LetterSpacing(-0.1);

    doc.Pages(pages =>
    {
        pages.TextStyle(defaultStyle);

        pages.Content().Text(t =>
        {
            t.Line("This line uses the default text style.");
            t.Line("This line uses a tight letter spacing.").Style(tightSpacing);
            t.Line("This line uses the default text style, again.");
        });
    });
});

Sie können das Ergebnis des Codes in pages-text-styles.pdf sehen.

Beachten Sie, dass Sie dokumentweit Textstile mit der Methode Document.Typography festlegen können. Jede Eigenschaft der Klasse Typography definiert einen Stil für einen Anwendungsfall. Diese Stile überschreiben den Stil, der mit der Methode PageLayout.TextStyle angegeben wurde. Beispielsweise überschreibt die Eigenschaft Typography.Body den Standardstil für Text in den Containern Content.

Textrichtung

Es gibt Sprachen, die von rechts nach links geschrieben werden. Die Layout API verarbeitet Text in diesen Sprachen problemlos. Sie müssen die Textrichtung jedoch explizit angeben.

Wenn der Großteil des Textes auf Ihren Seiten in einer RTL-Sprache verfasst ist, können Sie rechts nach links als Standard-Textrichtung für die Seiten festlegen. Dann können Sie für jeden Container auf Ihren Seiten eine andere Richtung angeben.

PdfDocumentBuilder.Create().Generate("pages-content-direction.pdf", doc =>
{
    var defaultTextStyle = doc.TextStyleWithFont(SystemFont.Family("Calibri"));

    doc.Pages(pages =>
    {
        pages.Size(PdfPaperSize.A6).TextStyle(defaultTextStyle);

        pages.ContentFromRightToLeft();

        pages.Content().Column(column =>
        {
            column.Item()
                .ContentFromLeftToRight()
                .Text("There are languages written from right to left.");

            column.Item()
                .Text("هناك لغات تكتب من اليمين إلى اليسار.");

            column.Item()
                .Text("יש שפות שנכתבות מימין לשמאל.");
        });
    });
});

Im obigen Code habe ich rechts nach links als Standard-Textrichtung festgelegt. Für den Container mit der englischen Version des Satzes ändere ich die Richtung auf links nach rechts. Sie können das Ergebnis des Codes in pages-content-direction.pdf sehen.

Seitenzahlen

Beim Erzeugen von PDF berechnet die Layout API automatisch die aktuelle Seitenzahl. Sie berechnet auch die Gesamtzahl der Seiten im Dokument. Sie können die Zahlen abrufen, indem Sie die Methoden CurrentPageNumber und PageCount eines beliebigen Textcontainers aufrufen. Unabhängig davon, ob sich der Container in Kopfzeile, Fußzeile oder im Hauptinhaltsbereich befindet.

PdfDocumentBuilder.Create().Generate("pages-page-numbers.pdf", doc => doc.Pages(pages =>
{
    pages.Content().Text(t =>
    {
        t.Span("This line is on page ");
        t.CurrentPageNumber();
        t.Line();
        t.Line("Check the footer.");
    });

    pages.Footer().Row(r =>
    {
        r.AutoItem().Text("Created with Docotic.Pdf Layout API");

        r.RelativeItem(2).Text(t =>
        {
            t.AlignRight();

            t.Span("Page ");
            t.CurrentPageNumber();
            t.Span(" of ");
            t.PageCount();
        });
    });
}));

Das Ergebnis des Codes befindet sich in pages-page-numbers.pdf.

Beide Methoden geben eine Instanz von TextPageNumber zurück, die Sie zum Formatieren der Zahlen verwenden können.

Fügen Sie Kopf- und Fußzeilen zu PDF-Dokumenten hinzu-Beispiel zeigt, wie eine benutzerdefinierte Formatierung für Seitenzahlen angewendet wird.

Beispielcode

Wir haben einige Beispiel-Apps, die die oben genannten Funktionen ausführlicher abdecken. Bitte nehmen Sie sich etwas Zeit, um sie zu prüfen.