itextsharp利用模板生成pdf文件笔记

Posted 涛声依旧1988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了itextsharp利用模板生成pdf文件笔记相关的知识,希望对你有一定的参考价值。

 iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件。

中文参考网站:http://hardrock.cnblogs.com/ 

http://pdfhome.hope.com.cn/Article.aspx?CID=bf51a5b6-78a5-4fa3-9310-16e04aee8c78&AID=f5fe52dd-8419-4baa-ab1c-ea3f26952132

英文参考网站:http://itext.ugent.be/library/

·  技术文章(http://itext.ugent.be/articles/

· 在线示例 (http://itextdocs.lowagie.com/tutorial/

· 英文API(http://itext.ugent.be/library/api/

<<iText in Action 2nd>>读书笔记汇总http://www.cnblogs.com/chinafine/archive/2008/07/08/1238010.html

一.            生成pdf 的关键代码

1. 首先初始化个流和获取到的model数据

 2、利用adobe acrobat pro编辑pdf模板

 

 

如上图所示,如“案由”这类文本,编辑字段与代码的model 一致即可,在输出的时候回自动匹配数据,具体实现后面具体说明。

 

如案件基本情况的这种表,需要连接输入,就不能直接输出来做,此时需要用定位坐标的方式来实现。在此之前需要我们设置几个参数变量以及静态数据,方便以后的修改

 

 

2. 生成主页的pdf

  

 

 

图中340,咱们需要用850-340=510(因为itext与Adobe Acorbat Pro Y坐标方向相反,需要转换下,850为全页的高度)

截取字符串的问题,需要注意一下,全部长度-“请见续页”长度,加上“请见续页”这几个字才算完成。()

3. 生成续页的pdf

首先获取到续页的字符串

 

续页套打的原理同首页。

 

4、文字删除线、下划线样式等

 public void Print<TModel>(Stream output, TModel model) where TModel : PdfBaseModel
        {
            base.Print(output);
            if (PrintBaseFont != null)
            {
                PStamper.AcroFields.AddSubstitutionFont(PrintBaseFont);
            }
            PdfPrinterUtility.FillFormByModel(PStamper, model, PrintBaseFont);
            Phrase phrase = new Phrase();
            phrase.Font = PrintCurrentFont;//return new Font(PrintBaseFont, 11, Font.NORMAL);
            phrase.Add(new Chunk("公开11,"));//继承短句的字体
            //采用fontfactory方法,结果不支持中文。只显示出来22.
            phrase.Add(new Chunk("不公开22", FontFactory.GetFont(FontFactory.HELVETICA, 11, Font.STRIKETHRU)));
            ////采用字体文件来生成字体,支持中文
            phrase.Add(new Chunk("不公开33", new Font(PrintBaseFont, 11, Font.STRIKETHRU)));
            ColumnText column = new ColumnText(Canvas);
            column.SetSimpleColumn(131, 425, 504, 523, 23, Element.ALIGN_LEFT);
            column.AddText(phrase);
            column.Go();
            PStamper.FormFlattening = true;
            PStamper.Writer.CloseStream = false;
            PStamper.Close();
        }
 public static class PrintCultureInfo
    {
        private static readonly string FontsBaseFolder =
            System.Web.HttpContext.Current.Server.MapPath("~/Fonts/");

        private static readonly string ChineseBaseFontName = "simsun.ttc,1";

        public const string Chinese = "zh-CN";

        public static BaseFont CreateChineseFont()
        {
            var basefontPath = Path.Combine(FontsBaseFolder, ChineseBaseFontName);
            BaseFont baseFT = BaseFont.CreateFont(basefontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            return baseFT;
        }

    }

5、在利用模板生成当前pdf后,需要附加其他pdf文件内容

 

 public byte[] AppendExistPdf(byte[] currentPdfBytes, List<string> pdfPathsToAppend)
        {
            using (MemoryStream appendedStream = new MemoryStream())
            {
                var appendedDocument = new Document();
                var appendedPdfWriter = PdfWriter.GetInstance(appendedDocument, appendedStream);
                appendedDocument.Open();
                var appendedPdfContentByte = appendedPdfWriter.DirectContentUnder;
                appendedDocument.NewPage();
                var reader = new PdfReader(currentPdfBytes);
                for (int i = 1; i <= reader.NumberOfPages; i++)
                {
                    var page = appendedPdfWriter.GetImportedPage(reader, i);
                    appendedDocument.NewPage();
                    appendedPdfContentByte.AddTemplate(page, 0, 0);
                }
                foreach (var existPdfPath in pdfPathsToAppend)
                {
                    reader = new PdfReader(existPdfPath);
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        var page = appendedPdfWriter.GetImportedPage(reader, i);
                        appendedDocument.NewPage();
                        appendedPdfContentByte.AddTemplate(page, 0, 0);
                    }
                }
                appendedDocument.Close();
                appendedPdfWriter.Close();
                return appendedStream.ToArray();
            }
        }

 

二.            Adobe Acorbat Pro的使用说明。

用这个软件来编辑pdf模板

1、 测量坐标

(1)     编辑——首选项——单位和参考线——将单位设置成点,与itext单位一致

(2)     视图——隐藏和显示——光标坐标

2、 创建表单(类似于网页中的form)

(1)     工具——表单——创建表单

 

 

(2)添加域——文本域——域命名——属性(设置字体,是否多行显示,字体大小,是否自动大小),注意字体要选Helvetica(itext只支持4种字体,其他的不会显示)

 

(2)     添加完成后保存表单。

3、编辑pdf模板中的文本

 

 4、编写简单的column,规则矩形

ColumnText commentColumn = new ColumnText(getCanvas());
// commentColumn.setSimpleColumn(480, yllIndex, 515, yurIndex, 15, Element.ALIGN_LEFT);
// commentColumn.addText(commentPhrase);
// commentColumn.go();

5、复杂的column,不规则多边形

Phrase proofsPhrase = new Phrase();
proofsPhrase.setFont(getPrintCurrentFont());
proofsPhrase.add(new Chunk(showStr));
float[] left = {175, 508, 175, 492, 90, 486, 90, 248};
float[] right = {500, 508, 500, 248};
ColumnText column = new ColumnText(canvas);
column.setLeading(26, 0);
column.setColumns(left, right);
column.addText(proofsPhrase);
column.go();

三、需要注意的坑

1、应用columnText时需要填写的内容不能为空字符串,否则报错

 

以上是关于itextsharp利用模板生成pdf文件笔记的主要内容,如果未能解决你的问题,请参考以下文章

iTextSharp 从现有的 PDF 模板生成 PDF

iTextSharp 正在生成损坏的 PDF

C#如何利用itextSharp修改现有PDF文件内容,比如插入

如何使用 iTextSharp 为横向生成的页面添加页脚到 PDF 文档

ITextSharp构造PDF文件

使用itextsharp.dll生成PDF [关闭]