• 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时需要填写的内容不能为空字符串,否则报错

  • 相关阅读:
    C# Debugger.IsAttached 调试启动浏览器 VS if DEBUG 启动调试内容
    【转载】如何三个月从零基础到C#中级程序员
    【转载】如何成为一个高级程序员
    如何找回QQ聊天记录、语音、图片?
    hexo博客yili主题个性化自定义教程(1) ——借鉴中学习,初认yili主题
    2019hexo博客部署到coding该绕的坑-奥怪的小栈
    2019Hexo博客Next主题深度美化 打造一个炫酷博客(2)-奥怪的小栈
    2019软件工程专业大学排名附官网-奥怪的小栈
    浅谈互联网+足球
    2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈
  • 原文地址:https://www.cnblogs.com/taoshengyujiu/p/6958700.html
Copyright © 2020-2023  润新知