65.9K
CodeProject 正在变化。 阅读更多。
Home

GDI+ 转 PDF

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (10投票s)

2008 年 6 月 24 日

CPOL

2分钟阅读

viewsIcon

59971

downloadIcon

1742

使用 iTextSharp 将 GDI+ 图形路径转换为 PDF 内容。

引言

Microsoft GDI+ 和 Adobe PDF 图形概念是两种相似且趋同的图形概念,但在语法层面和对象处理方面实现细节却大相径庭。不经过修改,很难直接使用 GDI+ 对象、方法和代码片段生成 PDF 文件。两种技术中图形对象构建的核心概念是路径。

本文旨在说明将路径从一种技术(GDI+)转换为另一种技术(PDF)是可行的,从而在 GDI+ 和 PDF 之间架起桥梁。

要求

您需要

  1. SourceForge 项目页面下载 iTextSharp v.4.1.2 DLL 以测试编译后的示例。
  2. SharpDevelop 主页下载 SharpDevelop v2.2.1 Build 2648 以编译源代码。

下载 iTextSharp 二进制文件后,您需要将 iTextSharp.dll

  1. 复制到 Exe 目录,然后再启动示例;
  2. 复制到 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 内容语法进行了调整和优化。

Using the Code

要使用 iTextSharp 创建 PDF 文件,您需要执行五个简单的步骤

  1. 创建一个文档对象
  2. 创建一个将 PDF 流定向到文件的写入器
  3. 打开文档
  4. 获取 ContentByte 并对其进行操作
  5. 关闭文档

在第 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。
© . All rights reserved.