用 iTextSharp (开源的.NET类库) 生成 PDF 文档是件很轻松的事情。iTextSharp 是 iText 的C#版本,文档可以参阅 Java 版本的 iText 文档。苟安廷撰写的《用C#制作PDF文件全攻略》写的很实用,特别是关于中文支持部分,推荐大家阅览。
数字图书复印机要生成的 PDF 文档很简单:将一组图片添加到PDF文档中,每张图片作为一个页面。相关的源代码在 /EbookCopier/Pdf 目录下。
需要注意的是,PDF 文档生成过程是件很耗时的操作,当你的图片很多时,可能需要几分钟的时间,因此我们把它到后台线程工作。使用 BackgroundWorker 可以很方便地报告进度和状态。我们先初始化一个 BackgroundWorker 实例:
bw = new BackgroundWorker(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
将 PDF 操作放在 DoWork 中:
void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = sender as BackgroundWorker; object[] args = e.Argument as object[]; if (args == null || args.Length < 3) return; string filename = args[0] as string; PdfSettings settings = args[1] as PdfSettings; IList<string> imagefiles = args[2] as IList<string>; CreatePdf(bw, e, filename, settings, imagefiles); }
同时在 PdfProcessForm 窗体界面报告进度,如下图所示。(实现代码在 /EbookCopier/Pdf/PdfProcessForm.cs 中)
使用这些信息创建 PDF 文档,如下:
// step 1: creation of a document-object Document document = new Document(); // step 2: // we create a writer that listens to the document // and directs a PDF-stream to a file PdfWriter.GetInstance(document, new FileStream(filename, FileMode.Create)); // step 3: we open the document document.Open();
document.AddTitle(settings.Title); document.AddAuthor(settings.Author); document.AddSubject(settings.Subject); document.AddKeywords(settings.Keywords); document.AddCreator("数字图书复印机(EbookCopier)"); if (settings.Header != null && settings.Header.Trim() != "") {//添加页眉 document.Header = ParseHeaderFooter(settings.Header); } if (settings.Footer != null && settings.Footer.Trim() != "") { document.Footer = ParseHeaderFooter(settings.Footer); } document.SetMargins(settings.LeftMargin, settings.RightMargin, settings.TopMargin, settings.BottomMargin);
页眉和页脚可能包含中文字符,所以我们设置页面和页脚的字体为宋体以正确显示中文:
//宋体 BaseFont bfSun0 = BaseFont.CreateFont(Path.Combine(fontsPath, "SIMSUN.TTC,0"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); font = new Font(bfSun0, 12, Font.BOLD);
接下来添加图片,并将每张图片铺满一个页面:
System.Drawing.Image iamge = System.Drawing.Image.FromFile(file); Image pdfImage = Image.GetInstance(iamge, System.Drawing.Imaging.ImageFormat.Png); pdfImage.Alignment = Image.MIDDLE_ALIGN; pdfImage.ScaleToFit(document.Right - document.Left - document.LeftMargin - document.RightMargin, document.Top - document.Bottom - document.TopMargin - document.Bottom); document.Add(pdfImage);
添加完毕,关闭文档:
document.Close();
到此为止,我们就得到了想要的 PDF 文档。
数字图书复印机(EbookCopier) 遵循 GPLv3 协议开源,如果你有更多的创意,欢迎请加入我们。
项目地址:http://code.google.com/p/ebookcopier/
源代码和可执行程序下载:http://code.google.com/p/ebookcopier/downloads/list
http://chuangen.name/ (我的主页)
http://blog.csdn.net/chuangen (IT 社区)
http://chuangen.cnblogs.com/ (.NET 技术社区)
http://chuangen-cn.spaces.live.com/ (live Spaces)