iTextSharp快速使用指南z
转载至iTextSharp快速使用指南 - JulyLuo - 博客园 (cnblogs.com)
前言
最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可。
所以这篇文章就是告诉大家如何快速的使用iTextSharp(iText .net版本)进行开发。
iTextSharp开发步骤
快速开发之前,我们先了解以下4个类:
| class | 所代表的含义 |
| Paragraph | 报表中的文本 |
| Image | 报表中的图片 |
| PdfPTable | 表格 |
| PdfPCell | 单元格 |
知道这4个类之后就是开发的步骤了:
1. 往单元格PdfPCell类中添加内容。
2.将单元格PdfPCell添加到PdfPTable。
3.将表格PdfPTable添加到Document。
在以上的步骤中最重要的就是第一步也就是往PdfPCell中添加内容,而PdfPCell中的内容又可以分为以下三种情况:
| 文本 | Paragraph |
| 图片 | Image |
| 表格 | PdfPTable |
接下来我们就直奔主题,看是如何往PdfPCell添加内容。因为报表需要数据,所以我就从百度分辨率统计获取了一些数据,下面是这个网址的截图:
往PdfPCell添加文本
文本由Paragraph来表示,在添加之前还要注意一下字体的问题,因为我们用的是中文字体,如果用默认英文字体渲染则会乱码,所以我们要先定义中文字体:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#2b91af">BaseFont </span></span><span style="background-color:#ffffff"><span style="color:#000000">BF_Light = </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">BaseFont</span></span><span style="background-color:#ffffff"><span style="color:#000000">.CreateFont(</span></span><span style="background-color:#ffffff"><span style="color:#a31515">@"C:\Windows\Fonts\simsun.ttc,0"</span></span><span style="background-color:#ffffff"><span style="color:#000000">, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">BaseFont</span></span><span style="background-color:#ffffff"><span style="color:#000000">.IDENTITY_H, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">BaseFont</span></span><span style="background-color:#ffffff"><span style="color:#000000">.EMBEDDED);</span></span></span></span></span>
字体定义完之后下面就添加文本:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#008000">//要设置字体和大小
</span></span><span style="background-color:#ffffff"><span style="color:#000000">p = </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Paragraph</span></span><span style="background-color:#ffffff"><span style="color:#000000">(fields[i], </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Font</span></span><span style="background-color:#ffffff"><span style="color:#000000">(BF_Light, 13));
cell = </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPCell</span></span><span style="background-color:#ffffff"><span style="color:#000000">(p);
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//设置cell属性
//cell.Border = Rectangle.NO_BORDER;
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">if </span></span><span style="background-color:#ffffff"><span style="color:#000000">(rowNum == 0)
{
cell.BackgroundColor = </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">BaseColor</span></span><span style="background-color:#ffffff"><span style="color:#000000">.GRAY;
}
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">if </span></span><span style="background-color:#ffffff"><span style="color:#000000">(i == mainColumn - 1)
{
cell.HorizontalAlignment = </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Element</span></span><span style="background-color:#ffffff"><span style="color:#000000">.ALIGN_RIGHT;
}
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//添加单元格
</span></span><span style="background-color:#ffffff"><span style="color:#000000">table.AddCell(cell);</span></span></span></span></span>
其实添加很简单,就是最上面两行代码,而对PdfPCell属性设置的代码一般会比较多,因为我们一般要设置其背景色,水平对其,还有边框Border等。
往PdfPCell添加图片和表格
在大家了解怎么往PdfPCell添加完文本之后,添加图片和表格就简单很多了,就是将Image和PdfPTable作为PdfPCell的构造器参数传入即可:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#008000">//图片
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Image </span></span><span style="background-color:#ffffff"><span style="color:#000000">image = </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Image</span></span><span style="background-color:#ffffff"><span style="color:#000000">.GetInstance(imagePath);
cell = </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPCell</span></span><span style="background-color:#ffffff"><span style="color:#000000">(image, </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">true</span></span><span style="background-color:#ffffff"><span style="color:#000000">);
table.AddCell(cell);
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//表格
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPTable </span></span><span style="background-color:#ffffff"><span style="color:#000000">baseTable = GetBaseTable();
cell = </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPCell</span></span><span style="background-color:#ffffff"><span style="color:#000000">(baseTable);
table.AddCell(cell);</span></span></span></span></span>
以下就是效果图:
iTextSharp画图
通过以上PdfPCell的操作,大家就可以实现一些比较常见的PDF报表,现在我们更进一步实现一下的效果:
这里就必须用到画图,画图用的就是PdfContentByte类,这个就类似于画板,我们可以直接在上面画直线和文本:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#008000">//画线
</span></span><span style="background-color:#ffffff"><span style="color:#000000">canvas.SaveState();
canvas.SetLineWidth(2f);
canvas.MoveTo(100, 100);
canvas.LineTo(200, 200);
canvas.Stroke();
canvas.RestoreState();
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//文本
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">ColumnText</span></span><span style="background-color:#ffffff"><span style="color:#000000">.ShowTextAligned(canvas, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Element</span></span><span style="background-color:#ffffff"><span style="color:#000000">.ALIGN_RIGHT, </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Phrase</span></span><span style="background-color:#ffffff"><span style="color:#000000">(</span></span><span style="background-color:#ffffff"><span style="color:#a31515">"JulyLuo测试"</span></span><span style="background-color:#ffffff"><span style="color:#000000">, </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Font</span></span><span style="background-color:#ffffff"><span style="color:#000000">(BF_Light, 10)), 100, 20, 0);</span></span></span></span></span>
这里要注意的是,无论是画线还是文本我们都需要坐标,而且在画线的时候,要将具体的代码放在SaveState和RestoreState中间,这样就不会导致画图状态的紊乱。
如果我们希望将上图画在一个单元格中,但我们知道画图需要坐标,而在PdfPCell中是坐标没有暴露出来,所以这里我们需要iTextSharp中的接口:IPdfPCellEvent
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#0000ff">public void </span></span><span style="background-color:#ffffff"><span style="color:#000000">CellLayout(</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPCell </span></span><span style="background-color:#ffffff"><span style="color:#000000">cell, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Rectangle </span></span><span style="background-color:#ffffff"><span style="color:#000000">position, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfContentByte</span></span><span style="background-color:#ffffff"><span style="color:#000000">[] canvases)</span></span></span></span></span>
这个接口的意思就是在单元格添加到文档之后暴露的方法。很明显,通过postion参数我们可以获取坐标,canvases参数可以获取画板。
所以要画图就创建一个实现接口IPdfPCellEvent的类,然后在CellLayout方法中画线和文本:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#0000ff">public void </span></span><span style="background-color:#ffffff"><span style="color:#000000">CellLayout(</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPCell </span></span><span style="background-color:#ffffff"><span style="color:#000000">cell, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Rectangle </span></span><span style="background-color:#ffffff"><span style="color:#000000">position, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfContentByte</span></span><span style="background-color:#ffffff"><span style="color:#000000">[] canvases)
{
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfContentByte </span></span><span style="background-color:#ffffff"><span style="color:#000000">cb = canvases[</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPTable</span></span><span style="background-color:#ffffff"><span style="color:#000000">.BACKGROUNDCANVAS];
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfContentByte </span></span><span style="background-color:#ffffff"><span style="color:#000000">cbline = canvases[</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">PdfPTable</span></span><span style="background-color:#ffffff"><span style="color:#000000">.LINECANVAS];
cbline.SaveState();
cb.SaveState();
…………</span></span><span style="background-color:#ffffff"><span style="color:#000000">
cb.SetLineWidth(0.4f);
cbline.SetLineWidth(0.4f);
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//y 轴
</span></span><span style="background-color:#ffffff"><span style="color:#000000">cb.MoveTo(leftX, bottomY);
cb.LineTo(leftX, topY);
cb.Stroke();
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//y 轴突出的短横线
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">yAxiseTextLinetWidth = 3f;
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">yAxisTextSpaceAdjust = 2.5f;
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">for </span></span><span style="background-color:#ffffff"><span style="color:#000000">(</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">y = yScaleNum; y < yMax; y += yScaleNum)
{
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">yPoint = bottomY + (yScale * y);
cb.MoveTo(leftX, yPoint);
cb.LineTo(leftX - yAxiseTextLinetWidth, yPoint);
cb.Stroke();
}
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//y 轴文本
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">for </span></span><span style="background-color:#ffffff"><span style="color:#000000">(</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">y = yScaleNum; y < yMax; y += yScaleNum)
{
</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">float </span></span><span style="background-color:#ffffff"><span style="color:#000000">yPoint = bottomY + (yScale * y);
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">ColumnText</span></span><span style="background-color:#ffffff"><span style="color:#000000">.ShowTextAligned(cb, </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Element</span></span><span style="background-color:#ffffff"><span style="color:#000000">.ALIGN_RIGHT, </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Phrase</span></span><span style="background-color:#ffffff"><span style="color:#000000">(</span></span><span style="background-color:#ffffff"><span style="color:#0000ff">string</span></span><span style="background-color:#ffffff"><span style="color:#000000">.Format(</span></span><span style="background-color:#ffffff"><span style="color:#a31515">"{0}%"</span></span><span style="background-color:#ffffff"><span style="color:#000000">, y), </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">Font</span></span><span style="background-color:#ffffff"><span style="color:#000000">(BF_Light, 5)), leftX - yAxiseTextLinetWidth, yPoint - yAxisTextSpaceAdjust, 0);
}
</span></span><span style="background-color:#ffffff"><span style="color:#008000">//x 轴
</span></span><span style="background-color:#ffffff"><span style="color:#000000">cb.MoveTo(leftX, bottomY);
cb.LineTo(righX, bottomY);
cb.Stroke();
<span style="color:#0000ff">………</span></span></span>
<span style="background-color:#ffffff"><span style="color:#000000"> cb.Stroke();
cb.RestoreState();
cbline.RestoreState();
}</span></span></span></span></span>
最后将这个类和对应的PdfPCell关联起来:
<span style="color:#7d8b8d"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#008000">//画图的类,和cell关联
</span></span><span style="background-color:#ffffff"><span style="color:#2b91af">ResolutionChart </span></span><span style="background-color:#ffffff"><span style="color:#000000">chart = </span></span><span style="background-color:#ffffff"><span style="color:#0000ff">new </span></span><span style="background-color:#ffffff"><span style="color:#2b91af">ResolutionChart</span></span><span style="background-color:#ffffff"><span style="color:#000000">(fileName, yMax, yScale);
cell.CellEvent = chart;</span></span></span></span></span>
以下就是效果图:
iTextSharp快速开发PDF报表指南
本文介绍了如何快速使用iTextSharp(iText.net版本)开发PDF报表。先阐述开发步骤,包括往PdfPCell添加内容、表格等,重点说明了往PdfPCell添加文本、图片和表格的方法,还介绍了iTextSharp画图,利用PdfContentByte类及相关接口实现特定效果。
214

被折叠的 条评论
为什么被折叠?



