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

Bagaimana untuk Menghapuskan Ruang Putih Apabila Menggabungkan PDF?

Mary-Kate Olsen
Lepaskan: 2024-12-25 22:43:09
asal
414 orang telah melayarinya

How to Eliminate White Space When Merging PDFs?

Cara menghapuskan ruang kosong semasa menggabungkan

Soalan:

Saya mempunyai beberapa kod yang mengandungi 3 tatasusunan bait PDF yang berbeza , dan gabungkan mereka. Kod ini berfungsi dengan baik. Sesetengah orang menghadapi masalah kerana setiap PDF dianggap sebagai halaman penuh (jika dicetak), walaupun hanya terdapat kira-kira 4 inci kandungan padanya, meninggalkan 7 inci ruang putih menegak. Kemudian dokumen tengah disisipkan dan mungkin tiada ruang putih menegak di hujungnya. Pengaki kemudiannya juga diletakkan pada halamannya sendiri.

Berikut ialah kod:

byte[] Bytes = rv.LocalReport.Render("PDF", null, out MimeType, out Encoding, out Extension, out StreamIDs, out Warnings);
List<byte[]> MergeSets = // 在此代码之前填充

// 将任何其他页面附加到此主要信件
if (MergeSets.Count > 0)
{
    MemoryStream ms = new MemoryStream();
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, ms);
    document.Open();
    PdfImportedPage page;
    PdfReader reader = new PdfReader(Bytes); // 读取生成的正文信
    int pages = reader.NumberOfPages;

    for (int i = 0; i < pages;)
    {
        page = copy.GetImportedPage(reader, ++i);
        copy.AddPage(page);
    } // 遍历所有正文信的页面

    // 现在附加合并集
    foreach (byte[] ba in MergeSets)
    {
        reader = new PdfReader(ba);
        pages = reader.NumberOfPages;

        for (int i = 0; i < pages;)
        {
            page = copy.GetImportedPage(reader, ++i);
            copy.AddPage(page);
        } // 遍历当前合并集中的所有页面
    } // 遍历数据集中所有内容

    document.Close();

    ServerSaved = SaveGeneratedLetter(ms.GetBuffer(), DateTime.Now.Year, hl.LetterName, SaveName);
} // 如果有待合并的任何内容
Salin selepas log masuk

Soalan:

Adakah terdapat cara untuk memotong/memadam/memadam semasa saya menggabungkan setiap halaman Menegak ruang putih di hujung setiap PDF supaya ia kelihatan sebagai satu dokumen yang lancar?

Kemas kini:

Berikut ialah contoh fail .pdf yang saya cuba gabungkan.

Tajuk, kandungan, pengaki

Kemas kini 2: Menggunakan jawapan:

Saya telah menukar kod @mkl kepada C# seperti yang ditunjukkan di bawah .

Kelas utiliti:

public class PdfVeryDenseMergeTool
{

    private Rectangle PageSize;
    private float TopMargin;
    private float BottomMargin;
    private float Gap;
    private Document Document = null;
    private PdfWriter Writer = null;
    private float YPosition = 0;

    public PdfVeryDenseMergeTool(Rectangle size, float top, float bottom, float gap)
    {
        this.PageSize = size;
        this.TopMargin = top;
        this.BottomMargin = bottom;
        this.Gap = gap;
    } // PdfVeryDenseMergeTool

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

            foreach (PdfReader reader in inputs)
            {
                this.Merge(reader);
            } // 遍历待合并的 PDF 文件
        }
        finally
        {
            this.CloseDocument();
        } // try-catch-finally
    } // Merge

    public void OpenDocument(MemoryStream outputStream)
    {
        this.Document = new Document(PageSize, 36, 36, this.TopMargin, this.BottomMargin);
        this.Writer = PdfWriter.GetInstance(Document, outputStream);

        this.Document.Open();
        this.NewPage();
    } // OpenDocument

    public void CloseDocument()
    {
        try
        {
            this.Document.Close();
        }
        finally
        {
            this.Document = null;
            this.Writer = null;
            this.YPosition = 0;
        } // try-finally
    } // CloseDocument

    public void NewPage()
    {
        this.Document.NewPage();
        this.YPosition = PageSize.GetTop(this.TopMargin);
    } // Merge

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

        for (int pageIndex = 1; pageIndex <= reader.NumberOfPages; pageIndex++)
        {
            this.Merge(reader, parser, pageIndex);
        } // 遍历当前 PDF 的所有页面
    } // Merge

    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
} // PdfVeryDenseMergeTool
Salin selepas log masuk

Kelas pendengar render:

Kemas kini 3: Membetulkan 1 baris kod sekarang Berfungsi dengan baik : Lihat ulasan dalam kod

public class PageVerticalAnalyzer : IRenderListener
{

    public PageVerticalAnalyzer()
    { }

    public List<float> VerticalFlips = new List<float>();

    public void AddVerticalUseSection(float from, float to)
    {
        if (to < from)
        {
            float temp = to;
            to = from;
            from = temp;
        }

        int i = 0;
        int j = 0;

        for (i = 0; i < VerticalFlips.Count; i++)
        {
            float flip = VerticalFlips[i];
            if (flip < from)
                continue;

            for (j = i; j < VerticalFlips.Count; j++)
            {
                flip = VerticalFlips[j];
                if (flip < to)
                    continue;
                break;
            }
            break;
        } // 遍历所有垂直翻转

        bool fromOutsideInterval = i % 2 == 0;
        bool toOutsideInterval = j % 2 == 0;

        while (j-- > i)
            VerticalFlips.RemoveAt(j); // 这是存在问题的代码行,只使用了 .Remove(j)
        if (toOutsideInterval)
            VerticalFlips.Insert(i, to);
        if (fromOutsideInterval)
            VerticalFlips.Insert(i, from);
    } // AddVerticalUseSection

    public void BeginTextBlock()
    { /* Do nothing */ }

    public void EndTextBlock()
    { /* Do nothing */ }

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        Matrix ctm = renderInfo.GetImageCTM();
        List<float> YCoords = new List<float>(4) { 0, 0, 0, 0 };

        for (int x = 0; x < 2; x++)
        {
            for (int y = 0; y < 2; y++)
            {
                Vector corner = new Vector(x, y, 1).Cross(ctm);
                YCoords[2 * x + y] = corner[Vector.I2];
            }
        }

        YCoords.Sort();
Salin selepas log masuk

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan