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);