简单的 .NET PDF 合并器






4.75/5 (39投票s)
一个简单的 .NET PDF 合并器,支持页眉和页脚文本。
引言
互联网上有一些 PDF 合并器可用。但是,要么它们是商业产品,要么不支持打印页眉和/或页脚文本,这对于打印页码等特别有用。
背景
本文档中介绍的 PDF 合并器使用开源 PDF 库 iTextSharp 来处理 PDF 文件。示例解决方案还包括一个小的 Windows Forms 应用程序来演示其功能。
使用代码
对于合并过程,PDF 库利用 iTextSharp.text.pdf.PdfWriter
对象的 PDF 页面事件。在初始化 PdfPageEvent
实例(继承自 iTextSharp.text.pdf.IPdfPageEvent
)期间,可以将页眉/页脚文本所需的信息传递到构造函数调用中。
writer.PageEvent = new PdfPageEvents(/*Any type of information goes here*/);
重要的是,页眉和页脚文本都应该在 'public void OnEndPage(PdfWriter writer, Document document)
' 方法中渲染。'public void OnStartPage(PdfWriter writer, Document document)
' 是不准确的。
为了提高性能,该库现在利用 iTextSharp 库中的 PdfCopy 类,而不是上述描述的方法。
即使显示的示例非常基础,它通常也能很好地概述如何填充页眉和页脚,例如,使用图片、文本等。
源代码
using System; using System.Collections.Generic; using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; namespace HelveticSolutions.PdfLibrary { public static class PdfMerger { /// <summary> /// Merge pdf files. /// </summary> /// <param name="sourceFiles">PDF files being merged.</param> /// <returns></returns> public static byte[] MergeFiles(List<byte[]> sourceFiles) { Document document = new Document(); using (MemoryStream ms = new MemoryStream()) { PdfCopy copy = new PdfCopy(document, ms); document.Open(); int documentPageCounter = 0; // Iterate through all pdf documents for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++) { // Create pdf reader PdfReader reader = new PdfReader(sourceFiles[fileCounter]); int numberOfPages = reader.NumberOfPages; // Iterate through all pages for (int currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++) { documentPageCounter++; PdfImportedPage importedPage = copy.GetImportedPage(reader, currentPageIndex); PdfCopy.PageStamp pageStamp = copy.CreatePageStamp(importedPage); // Write header ColumnText.ShowTextAligned(pageStamp.GetOverContent(), Element.ALIGN_CENTER, new Phrase("PDF Merger by Helvetic Solutions"), importedPage.Width / 2, importedPage.Height - 30, importedPage.Width < importedPage.Height ? 0 : 1); // Write footer ColumnText.ShowTextAligned(pageStamp.GetOverContent(), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0}", documentPageCounter)), importedPage.Width / 2, 30, importedPage.Width < importedPage.Height ? 0 : 1); pageStamp.AlterContents(); copy.AddPage(importedPage); } copy.FreeReader(reader); reader.Close(); } document.Close(); return ms.GetBuffer(); } } } }
历史
- 2008-01-08 - 创建文章。
- 2014-11-17 - 根据其他用户的反馈更新了实现。