zoukankan      html  css  js  c++  java
  • itextsharp生成pdf

    itextsharp在ios中可用,亲测

    (一)生成文档

            Document document = new Document(new Rectangle(0, 0, 2000, 9000), 0, 0, 0, 0);
            //Document document = new Document(PageSize.A4.Rotate(), 0, 0, 50, 0);
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));
            document.Open();
            //创建摘要
            document.AddTitle("");
            document.AddAuthor("");
            document.AddSubject("");
            document.AddCreator("");
    
    
        //添加pdf内容
    
    
    
    
        document.Close();

    (二)定义字体

            BaseFont heiBaseFont = BaseFont.CreateFont(Path.Combine(Application.streamingAssetsPath, "GBK.TTF"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font font = new iTextSharp.text.Font(heiBaseFont, 28);
            font.Color = new iTextSharp.text.Color(255, 255, 255);

    (三)定义段落并添加到document中

            Paragraph Pmodel = new Paragraph("段落内容", font);
            Paragraph Pmodel_1 = new Paragraph("段落内容1", font);
            document.Add(Pmodel_1 );
           document.Add(Pmodel );    

    可以定义段落的左右边距等如下

            Paragraph p = new Paragraph();
            p.IndentationLeft = 200;//左边距
            p.IndentationRight = 200;//右边距
            p.SpacingBefore = 0.2f;//前边距
            p.SpacingAfter = 0.2f;//后边距
            p.Alignment = Element.ALIGN_LEFT;//靠左

    段落可以通过add添加表格,图片以及文字元素。

    (四)生成表格

    1)定义表格

            Table table = new Table(5);//根据列数据创建表格
            List<int> widths = new List<int>();
            //widths.Add(200);
            widths.Add(500);//定义每一列的宽度,但是如果不对数值进行lock则是相对值
            widths.Add(200);
            widths.Add(200);
            widths.Add(200);
            widths.Add(100);
            table.SetWidths(widths.ToArray());
    
            table.Cellpadding = 3;//表格中内容padding
            table.Cellspacing = 1;

    通过pdfpTable定义表格并锁定宽度

                PdfPTable pdfPTable = new PdfPTable(currentList.Count);
                  //pdfPTable.le
                pdfPTable.TotalWidth = currentList.Count * unitWidth;
                //PdfPTable pdfPTable = new PdfPTable(column);
                //pdfPTable.TotalWidth = column * unitWidth; 
                pdfPTable.LockedWidth = true;   
                pdfPTable.HorizontalAlignment = Element.ALIGN_LEFT;

    2)添加内容

    每一个单元格为cell元素,table添加cell,pdfpTable添加pdftcell,要添加图片则只能用pdftcell

    cell添加

                CellElem elem = list[i];
                Cell cellElem = new Cell(new Phrase(""));
                cellElem.HorizontalAlignment = Element.ALIGN_CENTER;
                cellElem.VerticalAlignment = Element.ALIGN_MIDDLE;
                cellElem.BackgroundColor = elemHead.backGroundColor;
    
                Paragraph text = new Paragraph(elem.texts[ii], font);
                cellElem.AddElement(text);
    
                table.AddCell(cellElem);        

    pdfpCell添加

          PdfPTable pdfPTable = new PdfPTable(currentList.Count);
          PdfPCell pdfPCell = new PdfPCell(new Phrase(title, font));
          pdfPCell.Colspan = column;
          pdfPCell.HorizontalAlignment = Element.ALIGN_CENTER;
          pdfPTable.AddCell(pdfPCell);

    table添加单元格是按行来添加,当一行添加满后自动从下一行添加,如果某一单元格是三行三列的,则可设置其Colspan和Rowspan均为三即可(即表示此单元个列和行均占用三列和三行),但是低版本的pdfpCell无Rowspan,所以简易采用高版本

    head.Rowspan = userTable.numRow;

    3)添加表格到文档中

    可以直接采用document.Add()直接将表格添加到文档中,也可以先把表格添加到段落Paragraph中,然后在将段落添加到document中,采用其一种方式无法设置表格的左右边距,后一种方法可以通过段落实现左右边距

    (五)添加图片

                    var image = Image.GetInstance(new FileStream(imageElem.imageBytes,FileMode.Open,FileAccess.Read));//可以直接添加bytes
                    image.ScalePercent(265);
                    image.Alignment = Element.ALIGN_CENTER;

    图片可以直接添加到document中也可以添加到表格中,在通过表格添加到文档中。但是只能pdfpTable中可以添加图片。table不可以

                    PdfPCell pdfPCellImage = new PdfPCell(image);
                    pdfPCellImage.PaddingTop = 5;
                    pdfPCellImage.PaddingBottom = 2;
                    pdfPCellImage.HorizontalAlignment = 1;
                    pdfPTable.AddCell(pdfPCellImage); 

     由于用的itextsharp插件版本较低,在把Image插入pdfpCell时,报空指针异常,原因为在new PdfPCell(image)时相当于又进行了一次Image.GetInstance()操作,ios对此有问题,所以只能把图片插入到document文档中,所以排版有问题。默认一个图片一个段落,如果强制修改其absolutePostion则会跟问题表格覆盖,所以处理比较复杂。从好处理角度进行分页

    (五)添加表单

    对于可编辑的pdf文件(即点击可编辑的文字时,可以像inputfield那样更改),是由专业版本的pdf编辑器,通过添加form形成的,通过itextsharp也可以制作相关pdf,但是最简单的方法就是先编辑一个模板,通过关键字来更改模板的文字,缺点是不够灵活。

    生成图片时,要把背景设置为无,否则不显示图片

        public static void CreateFormPdf(string fileName)
        {
            //string str = Path.Combine(Application.streamingAssetsPath, "Test.pdf");
            if (File.Exists(fileName))    File.Delete(fileName);
            FileStream stream = new FileStream(fileName, FileMode.Create);
            //PdfReader reader = new PdfReader(Path.Combine(Application.streamingAssetsPath, "LindePDF1025.pdf"));
            PdfReader reader = new PdfReader(Path.Combine(Application.streamingAssetsPath, "xxxxx.pdf"));//xxxxx.pdf为pdf模板
            PdfStamper stamper = new PdfStamper(reader, stream);
            AcroFields af = stamper.AcroFields;
            af.SetField("Name", "WangWang");
            af.SetField("Date", "2012-11-11");
            //PushbuttonField addedButton = new PushbuttonField(stamper.Writer,new Rectangle(100,100,100,100), "NewAddBtn");
    
            //stamper.AddAnnotation(addedButton.Field, 1);
    
            string imagepath = Path.Combine(Application.streamingAssetsPath, "Example.png");
            if (!string.IsNullOrEmpty(imagepath) && File.Exists(imagepath))
            {
                //var image = Image.GetInstance(new FileStream(imagepath, FileMode.Open, FileAccess.Read));
                iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagepath);
                if (image != null)
                {
                    //PushbuttonField bf = af.GetNewPushbuttonFromField("Header");
                    //bf.Image = image;
    
                    //af.ReplacePushbuttonField("Header", bf.Field);
    
                    //af.RemoveField("Picture01");
    
                    //PushbuttonField bf1 = af.GetNewPushbuttonFromField("Picture02");
                    //bf1.Image = image;
                    //af.ReplacePushbuttonField("Picture02", bf1.Field);
    
                    PushbuttonField bf2 = af.GetNewPushbuttonFromField("Picture02");
                    bf2.Image = image;
                    af.ReplacePushbuttonField("Picture02", bf2.Field);
    
                    //PushbuttonField addedButton = new PushbuttonField(stamper.Writer, new Rectangle(100, 100, 100, 100), "NewAddBtn");
                    //addedButton.Image = image;
                    //addedButton.Layout = PushbuttonField.LAYOUT_ICON_ONLY;
    
                    //stamper.AddAnnotation(addedButton.Field, 0);
                }
            }        
    
            //stamper.FormFlattening=true; 是否将 pdf Form 转为 pdf文档
            stamper.Close();
    
        }

    在生成的pdf文档中,默认打开时看不到文字,只有点击输入时才会看到,此时是由于缺少字体支持原因,添加如下代码即可实现字体支持

    FontFactory.Register(Path.Combine(Application.streamingAssetsPath, "GBK.TTF"));
    BaseFont heiBaseFont = BaseFont.CreateFont(Path.Combine(Application.streamingAssetsPath, "GBK.TTF"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    AcroFields af = stamper.AcroFields;
    af.AddSubstitutionFont (heiBaseFont);
  • 相关阅读:
    构建了一个简单的时间序列数据集来说明索引功能
    在HTML文件的表单中添加{%csrf_token%}便可以解决问题
    在 Django 模板中遍历复杂数据结构的关键是句点字符
    unicode可以通过编码(encode)成为特定编码的str
    Java NIO系列教程(八) SocketChannel
    Java NIO系列教程(七) FileChannel
    Java NIO系列教程(六) Selector
    Java NIO系列教程(五) 通道之间的数据传输
    Java NIO系列教程(四) Scatter/Gather
    Java NIO系列教程(三) Buffer
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/9593194.html
Copyright © 2011-2022 走看看