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