Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghapuskan Ruang Putih Berlebihan Apabila Menggabungkan PDF?

Bagaimana untuk Menghapuskan Ruang Putih Berlebihan Apabila Menggabungkan PDF?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-26 00:48:16907semak imbas

How to Eliminate Excessive Whitespace When Merging PDFs?

Mengalih keluar Ruang Putih semasa Penggabungan

Masalah:

Apabila menggabungkan berbilang PDF, setiap halaman dianggap sebagai halaman penuh, malah jika ia hanya mempunyai sedikit kandungan, menghasilkan warna putih yang banyak ruang.

Penyelesaian:

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

Kod ini menyediakan proses penggabungan dengan membuka dan memulakan struktur yang diperlukan.

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

Di sini, setiap halaman PdfReader yang ditentukan dianalisis untuk digabungkan.

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

The Kaedah gabungan kemudian menganalisis kandungan menegak setiap halaman menggunakan kelas PageVerticalAnalyzer. Ia mengenal pasti bahagian menegak yang boleh digabungkan, menghapuskan ruang putih sambil mengekalkan kandungan.

Atas ialah kandungan terperinci Bagaimana untuk Menghapuskan Ruang Putih Berlebihan Apabila Menggabungkan PDF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn