首页 >后端开发 >C++ >合并PDF时如何消除过多的空白?

合并PDF时如何消除过多的空白?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-26 00:48:16907浏览

How to Eliminate Excessive Whitespace When Merging PDFs?

删除合并时的空格

问题:

合并多个 PDF 时,每个页面都被视为整页,即使如果它的含量很少,会导致大量的白色

解决方案:

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

此代码通过打开和初始化必要的结构来设置合并过程。

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

这里,分析指定 PdfReader 的每一页合并。

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

Merge 方法然后使用 PageVerticalAnalyzer 类分析每个页面的垂直内容。它识别可以合并的垂直部分,在保留内容的同时消除空白。

以上是合并PDF时如何消除过多的空白?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn