Heim >Backend-Entwicklung >C++ >Wie kann man übermäßige Leerzeichen beim Zusammenführen von PDFs beseitigen?

Wie kann man übermäßige Leerzeichen beim Zusammenführen von PDFs beseitigen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-26 00:48:16907Durchsuche

How to Eliminate Excessive Whitespace When Merging PDFs?

Leerzeichen beim Zusammenführen entfernen

Problem:

Beim Zusammenführen mehrerer PDFs wird jede Seite sogar als ganze Seite betrachtet wenn es nur wenig Inhalt hat, ergibt sich ein deutliches Weiß Raum.

Lösung:

private void Merge(MemoryStream outputStream, List<PdfReader> inputs) {
    try {
        this.OpenDocument(outputStream);

        foreach (PdfReader reader in inputs) {
            this.Merge(reader);
        } // foreach of the PDF files to merge
    } finally {
        this.CloseDocument();
    } // try-catch-finally
} // Merge

Dieser Code richtet den Zusammenführungsprozess ein, indem er die erforderlichen Strukturen öffnet und initialisiert.

public void Merge(PdfReader reader) {
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);

    for (int pageIndex = 1; pageIndex <= reader.NumberOfPages; pageIndex++) {
        this.Merge(reader, parser, pageIndex);
    } // foreach of the pages of the current PDF
} // Merge

Hier, Jede Seite des angegebenen PdfReader wird zum Zusammenführen analysiert.

public void Merge(PdfReader reader, PdfReaderContentParser parser, int pageIndex) {
    PdfImportedPage importedPage = Writer.GetImportedPage(reader, pageIndex);
    PdfContentByte directContent = Writer.DirectContent;

    PageVerticalAnalyzer finder = parser.ProcessContent(pageIndex, new PageVerticalAnalyzer());

    if (finder.VerticalFlips.Count < 2)
        return;

    Rectangle pageSizeToImport = reader.GetPageSize(pageIndex);

    int startFlip = finder.VerticalFlips.Count - 1;
    bool first = true;

    while (startFlip > 0) {
        if (!first)
            this.NewPage();

        float freeSpace = this.YPosition - PageSize.GetBottom(BottomMargin);
        int endFlip = startFlip + 1;

        while ((endFlip > 1) && (finder.VerticalFlips[startFlip] - finder.VerticalFlips[endFlip - 2] < freeSpace))
            endFlip -= 2;

        if (endFlip < startFlip) {
            float height = finder.VerticalFlips[startFlip] - finder.VerticalFlips[endFlip];

            directContent.SaveState();
            directContent.Rectangle(0, this.YPosition - height, pageSizeToImport.Width, height);
            directContent.Clip();
            directContent.NewPath();

            this.Writer.DirectContent.AddTemplate(importedPage, 0, this.YPosition - (finder.VerticalFlips[startFlip] - pageSizeToImport.Bottom));

            directContent.RestoreState();
            this.YPosition -= height + this.Gap;
            startFlip = endFlip - 1;
        } else if (!first) {
            throw new ArgumentException(string.Format("Page {0} content too large", pageIndex));
        } // if

        first = false;
    } // while
} // Merge

Die Merge-Methode analysiert dann den vertikalen Inhalt jeder Seite mithilfe der PageVerticalAnalyzer-Klasse. Es identifiziert vertikale Abschnitte, die zusammengeführt werden können, wodurch Leerräume eliminiert werden, während der Inhalt erhalten bleibt.

Das obige ist der detaillierte Inhalt vonWie kann man übermäßige Leerzeichen beim Zusammenführen von PDFs beseitigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn