(开源,GPLv3)EbookCopier 实现(3) - 使用 iTextSharp 库生成 PDF 文档

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 中)
image

在生成 PDF 之前,我们先让用户设置 PDF 文档信息:
image

使用这些信息创建 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值