GDI+ 转 PDF






4.20/5 (10投票s)
使用 iTextSharp 将 GDI+ 图形路径转换为 PDF 内容。
引言
Microsoft GDI+ 和 Adobe PDF 图形概念是两种相似且趋同的图形概念,但在语法层面和对象处理方面实现细节却大相径庭。不经过修改,很难直接使用 GDI+ 对象、方法和代码片段生成 PDF 文件。两种技术中图形对象构建的核心概念是路径。
本文旨在说明将路径从一种技术(GDI+)转换为另一种技术(PDF)是可行的,从而在 GDI+ 和 PDF 之间架起桥梁。
要求
您需要
- 从 SourceForge 项目页面下载 iTextSharp v.4.1.2 DLL 以测试编译后的示例。
- 从 SharpDevelop 主页下载 SharpDevelop v2.2.1 Build 2648 以编译源代码。
下载 iTextSharp 二进制文件后,您需要将 iTextSharp.dll
- 复制到 Exe 目录,然后再启动示例;
- 复制到 Src 目录,然后再编译项目。
描述
从 GDI+ 到 PDF 路径的转换是在 PathToPDF
类的静态 Append
方法中实现的
public class PathToPDF
{
public static void Append(GraphicsPath path, ByteBuffer content)
{
int len = 0;
for (int i = 0; i<path.PathData.Points.Length; i++)
{
content.Append(path.PathData.Points[i + 0].X).Append(' ')
.Append(path.PathData.Points[i + 0].Y).Append(' ');
if (path.PathData.Types[i] ==
(byte)PathPointType.Start)
content.Append("m\n");
else
{
if ((path.PathData.Types[i] &
(byte)PathPointType.Bezier) ==
(byte)PathPointType.Bezier)
{
len++;
if (len == 3)
{
len = 0;
content.Append("c\n");
}
}
else if ((path.PathData.Types[i] &
(byte)PathPointType.Line) ==
(byte)PathPointType.Line)
content.Append("l\n");
if ((path.PathData.Types[i] &
(byte)PathPointType.CloseSubpath) ==
(byte)PathPointType.CloseSubpath)
content.Append("h\n");
}
}
}
}
此 Append
方法类似于
Private Function _createSVG(ByVal _path As GraphicsPath) As String
来自 Alexander Seel 的 CodeProject 文章 使用 VB.NET 在路径上显示文本,但已针对 PDF 内容语法进行了调整和优化。
- 示例中使用了 Bruno Lowagie 的描述:iText in Action - Creating and Manipulating PDF,Manning Publications, 2007, ISBN 1932394796。
- 文本拟合方法是改编自 Charls Petzold 的示例 FullFit.cs:使用 C# 编程 Microsoft Windows,Microsoft Press, 2001, ISBN 0735613702。
Using the Code
要使用 iTextSharp 创建 PDF 文件,您需要执行五个简单的步骤
- 创建一个文档对象
- 创建一个将 PDF 流定向到文件的写入器
- 打开文档
- 获取
ContentByte
并对其进行操作 - 关闭文档
在第 4 步中,使用以下代码从 PDF 流的 DirectContent
中获取 ContentByte
后
ContentByte cb = writer.DirectContent;
您可以直接将准备好的 GDI+ 路径附加到 PDF 文档的内容中。
iTextSharp.Utility.PathToPDF.Append(path, cb.InternalBuffer);
在第 5 步关闭文档之前,可以附加更多不同的路径。如附带示例所示,您可以使用 PathToPDF
将文本精确地拟合到 PDF 页面的任何矩形中。请注意,拟合的文本被转换为用于所用字体的字符定义中的各种路径,而不是像往常一样保存为字符串。
历史
- 2008 年 6 月 19 日 - 发布版本 1.0。