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!