HTML转PDF之HTML内容解析和PostScript的生成


因为这两块内容很相关,所以我在这里把它们一块写了。
HTML的标准标签有很多,但是事实上分析一下,除了表单的那些标签外,其它的标签都是用来布局和显示内容的。所以只要很熟悉HTML的各个标签,那么就可以很容易知道这个标签的默认样式。同时对显示的内容分析,显示的内容有三种:
1、文本,这是最复杂的一个显示内容。总结了一下,我定义了这样的结构来描述文本的显示样式:

 public struct FontStyle
 
{
  
public string FontName;  //字体的名称
  public uint FontSize;  //文字大小
  public Color FontColor;  // 字体的颜色
  public bool IsUnderLine; //是否下划线
  public bool IsItalic;    //是否斜体
  public bool IsBold;      //是否粗体
  public Alignment Align;  //对齐方式
  public object BgColor;   //背景颜色
  public string Link;      //字体关联的链接
  public RaiseType Raise;  //文字的水平位置(普通,上标,下标)
 }


 
public enum RaiseType
 
{
  Normal,
  Sub,
  Sup
 }

对于HTML的DOM模型,是一种树型结构,所以找到一根结点,不断去遍历下面的子结点,就可以得到相应的字体样式。在遍历一层的时候,只要复制一下字体显示的结构,就可以很容易解决样式表里面,样式继承的问题。
2、水平线
对于水平线,样式就简单多了,只有宽,粗,连颜色都没有,所以我就不多说什么了。
3、图片
图片也比较简单,只是可能会带上链接,这里要注意。
对于布局的标签,真正难于处理的就是表格布局,特别是表格里面的各单元格不指定宽高的时候,要根据里面的内容来定,这个在做PDF的生成的时候,远比正真用GDI/GDI+在画布上画出来难。现在我的办法只好是先粗画一下,然后再做一次调整。整个的效率和效果都不是很好,很希望得到大家的指正。
再说PostScript,PDF里面显示的内容都是由PostScript来实现的,如果用记事本打开PDF的时候,经常会看到里面大段的乱码,这里面很可能就是压缩后的PostScript了。和所有的语言一样,它也是遵守:操作码,操作数这样规则的。具体的大家还是去看说明吧,如果真讲起来写上几十篇都写不完。因为只关联到显示,所以现在初步我只关心定位,显示大小,画图片等几个常用的。
用PostScript画图的时候,感觉很痛苦。因为它的坐标系统的原点在左下角,而不是平常所用的左上角,所以想写下第一行,必须要知道整个的高度。同时,感觉它原始到了极点,第一行文字的换行都要手工来换(不知道是不是还有其它的方法可以实现,如果有,一定要告诉我噢),也就是说我们要根据当前字体的宽度来算出来这串字符会有多宽,然后把它折成两行,其它的就和画画一样了,定坐标,选画笔颜色和类型,画上所要的内容。
还要说明一点是,在PDF里面字体是没有下划线这个样式的,所以下划线的实现就是写上文字后,在下面再画上一条线。PDF里面的链接的实现,也是要在PDF文档里面显示说明它所有效的区域。
写得很粗糙,因为我喜欢从整体去抽象一个东西。

posted on 2006-02-17 16:29  铁匠  阅读(1827)  评论(5编辑  收藏  举报