﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Ironsoft</title><link>http://www.cnblogs.com/Ironsoft/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 25 Jul 2008 06:41:52 GMT</lastBuildDate><pubDate>Fri, 25 Jul 2008 06:41:52 GMT</pubDate><ttl>60</ttl><item><title>是谁黑了我们的浏览器？</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/03/30/362309.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Thu, 30 Mar 2006 01:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/03/30/362309.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/362309.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/03/30/362309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/362309.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/362309.html</trackback:ping><description><![CDATA[
		<p>不知道什么时候，我们的游览器上开始有很多的插件，最夸张的时候，在网上看到一幅抓图，有一哥们</p>
		<p>把IE的插件装全了，打开IE后，上面的工具条多到让IE没有空间来显示网页的内容。这让我想起来了以</p>
		<p>前某名人说的话：如果屁值钱的话，穷人将失去屁眼。我们经常抱怨我们打开一个网页很慢，可是仔细</p>
		<p>看的话，会发现我们的IE在下载插件，因为现在大部分的插件都是经过MS认证的，而经过MS认证，一切</p>
		<p>是那么简单，如果不想花那钱，那就研究一下破解，如果嫌麻烦，那就交点钱，MS很容易就给你的插件</p>
		<p>安装包弄个认证，于是IE很容易就认为这些插件是信任的，而大部分用户的IE的安全里面，这些受信任</p>
		<p>的插件是不会提醒的情况下安装的。当然我们的IE被装上插件是在我们根本在没有上网，而又不知情的</p>
		<p>情况下装上去了。现在的很多免费或是破解的软件会给我们的IE带上五花八门的插件，比较有良心的作</p>
		<p>者会在安装的时候，在一些不起眼的角落里面会提醒用户在装他的软件的时候，会装上**插件，而更多</p>
		<p>的时候，没有提醒，直接就给你装上去了，导致了你被强奸了，都不知道是谁干了。<br />说了这么多的前言，让我们言归正传吧。作为一个开发一些免费软件给广大网民们用的我，也碰到了这</p>
		<p>样的一件的事情。在一个阳光明媚的早上，我收到了国内著名的一家公司的业务推广员的邮件，大意是</p>
		<p>和我谈合作，我心里一喜，是不是我作的东西很有价值，引起人家重视了，事实上很多作软件的人都会</p>
		<p>有这样的想法，自己的东西突然有一天被慧眼发现了，从而得到风险投资组建一家公司，接着上市，圈</p>
		<p>钱，我当然不会有例外了。于是乐得赶快加上他提供的MSN，才聊了几句，我就知道他的来意是想让我的</p>
		<p>东东的安装包里面加上他们在推广的插件：雅虎助手，DM，IEBAR,PCAST。虽然我早就猜到收益的方式，</p>
		<p>但是不深入虎穴，怎么抓到小老虎？于是我装成一个财迷和他聊起来，最终终于得到了一线的消息：用</p>
		<p>户每安装上一个插件，我就可以得到几分钱的收益。作为长期和这些插件抗争的我，当然知道装了这些</p>
		<p>东西的危害：这些插件都是流氓软件，基本上用常规方法是根本就无法删除的（说到这，让我想起了，</p>
		<p>为了删除这些破东西，结果导致了我的系统分区被毁，重装系统的惨痛经历，但是我觉得很值，如果大</p>
		<p>家都不向这些东西低头，我想这些东西自然会不了了之）。古人有不为五斗米折腰的故事，我当然也不</p>
		<p>能差太远了，不能为了赚几分钱，而让广大的网友们受到这些伤害。当然我不会很直白地拒绝，必意我</p>
		<p>还想活下去，最后婉拒了他们的要求。<br />从这件事情可以看出来，经常我们的良心只值几分钱，所以为了广大网民的利益出发，希望广大的共享</p>
		<p>软件的作者们能够拒绝这种捆绑，还大家一个干净的IE。</p>
<img src ="http://www.cnblogs.com/Ironsoft/aggbug/362309.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41298/" target="_blank">[新闻]SourceForge可正常访问</a>]]></description></item><item><title>3721的另一种防范方式</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/03/05/343337.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Sun, 05 Mar 2006 08:16:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/03/05/343337.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/343337.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/03/05/343337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/343337.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/343337.html</trackback:ping><description><![CDATA[机子里面又有3721了，虽然被雅虎收购了，可是它的毒性一点都不减当年：在DOS下面删除的，重启后，再上一下网又有了。进安全模式根本删除不掉，看来江湖中关于3721在启动时是以ring0级来启动的这个传闻不假了。在DOS下面删除后，打开IE，看了安全选项卡，这才发现，安全级别里面，Internet区域里面的Activex的相关设置被改成了只要这个Activex被标记成为安全的，就可以下载和自动运行而不会有提示。看来他们又学会了一招，就是不管三七二十一被装上3721后，他们会去修改安全级别的，难怪AntiSpayWare现在都无能为力了。把它们修改回来，同时想到了以彼之道还施彼身的方式：就是在IE的安全里面，把3721的相关站点加到受限站点里面，然后把所有的安全级别调成最高。这样只要不是在软件里面捆绑的3721，基本上就没有事了。<img src ="http://www.cnblogs.com/Ironsoft/aggbug/343337.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41295/" target="_blank">[新闻]2008年7月25日IT博客精选</a>]]></description></item><item><title>HTML转PDF之HTML内容解析和PostScript的生成</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/02/17/332635.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Fri, 17 Feb 2006 08:29:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/02/17/332635.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/332635.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/02/17/332635.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/332635.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/332635.html</trackback:ping><description><![CDATA[<P><BR>因为这两块内容很相关，所以我在这里把它们一块写了。<BR>HTML的标准标签有很多，但是事实上分析一下，除了表单的那些标签外，其它的标签都是用来布局和显示内容的。所以只要很熟悉HTML的各个标签，那么就可以很容易知道这个标签的默认样式。同时对显示的内容分析，显示的内容有三种：<BR>1、文本，这是最复杂的一个显示内容。总结了一下，我定义了这样的结构来描述文本的显示样式：<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">struct</SPAN><SPAN style="COLOR: #000000">&nbsp;FontStyle<BR><IMG id=Codehighlighter1_26_387_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_387_Open_Text.style.display='none'; Codehighlighter1_26_387_Closed_Image.style.display='inline'; Codehighlighter1_26_387_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_26_387_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_387_Closed_Text.style.display='none'; Codehighlighter1_26_387_Open_Image.style.display='inline'; Codehighlighter1_26_387_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_26_387_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_26_387_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;FontName;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">字体的名称</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">uint</SPAN><SPAN style="COLOR: #000000">&nbsp;FontSize;　　</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">文字大小</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Color&nbsp;FontColor;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;字体的颜色</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;IsUnderLine;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">是否下划线</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;IsItalic;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">是否斜体</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">bool</SPAN><SPAN style="COLOR: #000000">&nbsp;IsBold;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">是否粗体</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Alignment&nbsp;Align;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">对齐方式</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">&nbsp;BgColor;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">背景颜色</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;Link;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">字体关联的链接</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;RaiseType&nbsp;Raise;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">文字的水平位置（普通，上标，下标）</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">enum</SPAN><SPAN style="COLOR: #000000">&nbsp;RaiseType<BR><IMG id=Codehighlighter1_414_440_Open_Image onclick="this.style.display='none'; Codehighlighter1_414_440_Open_Text.style.display='none'; Codehighlighter1_414_440_Closed_Image.style.display='inline'; Codehighlighter1_414_440_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_414_440_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_414_440_Closed_Text.style.display='none'; Codehighlighter1_414_440_Open_Image.style.display='inline'; Codehighlighter1_414_440_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_414_440_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_414_440_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Normal,<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Sub,<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Sup<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P>对于HTML的DOM模型，是一种树型结构，所以找到一根结点，不断去遍历下面的子结点，就可以得到相应的字体样式。在遍历一层的时候，只要复制一下字体显示的结构，就可以很容易解决样式表里面，样式继承的问题。<BR>2、水平线<BR>对于水平线，样式就简单多了，只有宽，粗，连颜色都没有，所以我就不多说什么了。<BR>3、图片<BR>图片也比较简单，只是可能会带上链接，这里要注意。<BR>对于布局的标签，真正难于处理的就是表格布局，特别是表格里面的各单元格不指定宽高的时候，要根据里面的内容来定，这个在做PDF的生成的时候，远比正真用GDI/GDI+在画布上画出来难。现在我的办法只好是先粗画一下，然后再做一次调整。整个的效率和效果都不是很好，很希望得到大家的指正。<BR>再说PostScript，PDF里面显示的内容都是由PostScript来实现的，如果用记事本打开PDF的时候，经常会看到里面大段的乱码，这里面很可能就是压缩后的PostScript了。和所有的语言一样，它也是遵守：操作码，操作数这样规则的。具体的大家还是去看说明吧，如果真讲起来写上几十篇都写不完。因为只关联到显示，所以现在初步我只关心定位，显示大小，画图片等几个常用的。<BR>用PostScript画图的时候，感觉很痛苦。因为它的坐标系统的原点在左下角，而不是平常所用的左上角，所以想写下第一行，必须要知道整个的高度。同时，感觉它原始到了极点，第一行文字的换行都要手工来换（不知道是不是还有其它的方法可以实现，如果有，一定要告诉我噢），也就是说我们要根据当前字体的宽度来算出来这串字符会有多宽，然后把它折成两行，其它的就和画画一样了，定坐标，选画笔颜色和类型，画上所要的内容。<BR>还要说明一点是，在PDF里面字体是没有下划线这个样式的，所以下划线的实现就是写上文字后，在下面再画上一条线。PDF里面的链接的实现，也是要在PDF文档里面显示说明它所有效的区域。<BR>写得很粗糙，因为我喜欢从整体去抽象一个东西。</P><img src ="http://www.cnblogs.com/Ironsoft/aggbug/332635.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41292/" target="_blank">[新闻]微软称Windows 7开发很顺利 IE 8年底上市</a>]]></description></item><item><title>如何从一个字体文件里面去获得字体的相关信息？</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/01/18/319679.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Wed, 18 Jan 2006 08:01:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/01/18/319679.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/319679.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/01/18/319679.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/319679.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/319679.html</trackback:ping><description><![CDATA[比如说字体的名称，字体里面包含的字符集，以及点阵信息等等．谢谢<img src ="http://www.cnblogs.com/Ironsoft/aggbug/319679.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41291/" target="_blank">[新闻]中国SNS捱过严冬 未来十八个月决定SNS生死</a>]]></description></item><item><title>HTML转PDF之HTML解析</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/01/13/316850.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Fri, 13 Jan 2006 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/01/13/316850.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/316850.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/01/13/316850.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/316850.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/316850.html</trackback:ping><description><![CDATA[开始想先写PDF的内容显示，但是发现大家对HTML的解析更为感兴趣，所以我先写HTML的解析。<BR>HTML的解析，很多人都会想着用IHTMLDocument这个内置对象来完成，但是我始终觉得这个是在COM的基础上来.NET，感觉不是很爽，同时它并不能完全满足我的要求，所以我自己实现这一过程。这个过程也许很多人认为是个很大的工程量，但是事实上，经过仔细的分析，并没有想象的那么复杂。最后我只用了三四个小时，三四百行的C#代码就实现了。<BR>从功能上，我把HTML的解析分成了结构解析，和显示的外观解析，外观解析这个把它和PDF的生成放到一起，因为他们的关系很密切这里先说结构解析。从宏观上来看，HTML也是一种很类似于XML的一种格式，只是相对来说它的容错性上要好很多。所以HTML的解析事实上很容易就转化成了写一个有容错性的XML解析器。<BR>HTML解析后的结构可以有多种，我比较喜欢DOM模型，所以我把他们往DOM模型方向去解析。熟悉HTML的人都知道，一个HTML标签可以分解成为以：一个标签名，若干个属性，具体的文本内容 这样的一种形式。所以抛开显示的因素去想，这时候整个HTML用这个模型就可以很容易地解析了个大概了，剩下的没有处理的就是style标签和style属性，还有外挂的样式文件。估计写得大家会比较晕，下面就来看我具体的解析过程。<BR>首先是解析生成HTML节点树。在OO出现之前，描述节点树的数据结构还是比较复杂的，感觉要用个二维的树形结构，因为每个节点里会含多个属性，同时也会含有多个子节点，但是有了OO，很简单了，放两个ArrayList一个里面放属性对象，另一个放子节点。为了处理方便，我先用正则把里面的script块和注释块给替换掉了。下面的解析中，就是根据起始标签的&lt;,&gt;号去分解。至于容错，开始想是用迭代法来实现，也就是在前面找到一个标签后，到后面去找反标签，但是后来发现要处理的异常情况太多了，所以就放弃了。而使用堆栈的形式。每找到一个正标签，就把把它压栈，当找到一个封闭的标签的时候，就把它出栈，当然不能和栈顶的标签来匹配的时候，就会往下找，直到找到为止。事实上这个压栈的顺序就含着包含的关系，所以生成这个树的过程很容易就完成了。<BR>其次就是属性的解析，因为HTML的高容错性，所以属性有多种情况，有单独的一个单词做属性如：checked,selected,readonly等，还有A=BA=“B” A=‘B’ 这三种形式，为了容易解析，这里用了一个正则来实现，为了方便大家的使用，就把它写出来了：((<A href="file://\\w+)=((\&quot;[^\&quot;]*\&quot;)|('[^']*')|([^\&quot;^'">\\w+)=((\"[^\"]*\")|('[^']*')|([^\"^'</A> ]+)))|readonly|checked|selected。对匹配后的结果进行分析，这样就完成了大部分的属性的解析。当然这里面还有一个STYLE块的解析的问题还没有解决，不过相对来说也不难，就是根据属性值里面的;号进行分割，然后再按:号来取样式的名称和值。<BR>这样一个HTML解析过程基本上就完成了。<BR>下一次我将写PDF的内容显示，也就是PostScript。<img src ="http://www.cnblogs.com/Ironsoft/aggbug/316850.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41290/" target="_blank">[新闻]微软追求雅虎告一段落 与Facebook展开搜索合作</a>]]></description></item><item><title>微软创新日散记</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/01/08/313364.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Sun, 08 Jan 2006 10:48:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/01/08/313364.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/313364.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/01/08/313364.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/313364.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/313364.html</trackback:ping><description><![CDATA[<BR>很幸运地拿到了微软创新日的门票，因为是免费的，而且又可以找借口请一天的假不工作，当然是去啦。不过去了之后才发现这两天收获不小，不虚此行。所以写此文来和大家分享一下收获。<BR>总的说来，微软在这过去的几个月里面发布了一些重量级的产品和技术，让人对微软的实力不敢小看。如去年年底的时候发布了VS2005,SQL Server 2005,BizTalk2006，每一样产品的性能，易用性都让人不禁惊叹。加上这个创新日，更加让人对微软不得不服。创新日里面见到了它的很多新成果：Windows Vista, MCE(Windows XP Media Center Editon), WPF(Windows Presentation Foundation), WWF(Windows Workflow Foundation), WCF(Windows Communication Foundation)。每样都够让人忙碌一阵子了（感觉做程序员如果都跟着这些跑，真的好辛苦。也不能怪MS，必竟这些东西真的是太有诱惑力了）。同时MS还把这些新技术都做了整合，所有的东西在开发的时候，都可以在VS2005里面实现，通过插件的形式。这样让开发者对于这些开发没有陌生的感觉。MS就是这样不断地想到我们所需的东西，然后让我们心甘情愿地把口袋里的钱掏光。下面我就对于自己参加的一些主题说一下收藏吧（内容太多，一个人看不过来，只能是挑了几个）在这两天的时间里面，我主要关注的是MCE, WPF, WWF。<BR>首先说一下MCE，虽然在03年的时候，就听说过这个东东了，可是也就是在那两天才第一次见到它。它代表着MS对于软件开发的一种新的理念，那就是使用一个软件的时候，应该是一种体验，而不是工作，这应该也是MS之所以能成功的原因吧。MCE提出了以PC为核心的数字生活和数字工作，一台PC通过网络把所有的家电联结起来，实现所有的设备都可以互相共享数据。到时候拿到一张电影的盘，不论什么格式的，只要放在电脑上面，这样电视也可以看，支持MP4的设备也可以看，而不需要大量地转化。一切操作起来都是那么简单。而且对于开发者来说，开发这上面的应用也是极其简单，只要在原来的程序的基础上加上修改就OK了（比如说支持摇控器等，而这些系统都已经提供了完整的API，只要一个简单的调用就可以了）。看着给我们做的开发地DEMO，忍不住在想，程序员再这样被惯下去，不知道以后程序员还会什么？<BR>接下来就是WPF，这是微软下一步出来的利器了，直接挑战的是Adobe, Mecromedia等公司。它提供了一种新的语言XAML，来做为界面表现的利器，在XAML里面，一切图形都是矢量图（当然已经成为位图的资源是不可能矢量化了），通过像写HTML一样的简单的过程，就可以做出很炫丽的效果。而且也支持动画，其效率和效果是FLASH不可比拟的，因为XAML实现的时候是直接去调用DirectX的，再加上MS若干年的苦心优化，有着极高的效率，当时是在VPC上操作的，要知道VPC是微软自己开发的一个虚拟机系统，效率是极差的，可是在上面动行XMAL做的动画的时候就相当流畅。同时微软还做了一系列的工具来支持XAML开发的全过程，一个矢量图的编辑工具，一个矢量动画的编辑工具，再加上它的FP，MM的三剑客就全败下来了。不过这个应该还有相当长的时间才会实现，因为这一切都是在.NET 2.0的基础上实现的，要普及这样的平台还有很长的一段时间。同时MS还提出了一种新的文件格式XPS，类似于PDF，也是在XAML的基础之上实现的，而且也是与平台无关的，由于MS提供了全部的API用来做二次开发，估计PDF在windows平台上也并不好过了。<BR>最后说一下WWF，这是一个针对于工作流的东东，按讲师的说法，以后只要开发好一个类库，公司里面做工作流的时候，只要领导们拿鼠标拖一拖，就全搞定了，到时候程序员们只要关心某一流程要怎么实现，而不要去想那么复杂的业务问题了。<BR>这一两月里参加了微软的两个活动，感觉自己好落伍了，有一种井底之蛙的感觉。唉，不知道明天的软件开发会成为什么样子呢？<img src ="http://www.cnblogs.com/Ironsoft/aggbug/313364.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41289/" target="_blank">[新闻]百度C2C项目年底上线</a>]]></description></item><item><title>PDF文件格式的一些研究心得</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/01/05/311467.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Thu, 05 Jan 2006 05:06:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/01/05/311467.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/311467.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/01/05/311467.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/311467.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/311467.html</trackback:ping><description><![CDATA[<P>现在让我简要介绍一下PDF的文件格式，PDF的文件格式说明，最权威的就是Adobe官方网上的PDFReference，纯英文版的，一千多页，个人认为对于国内的开发者做PDF的生成的时候，最大的困难就在这里了，一个是没有充足的时间去看，二个一看满篇的英文基本上就头大。我只看了三分之一左右，看了整体描述和有针对性地看了一些，必竟HTML转PDF的时候，有不少的东西是用不着的。现在我介绍一下PDF格式的一些要点：<BR>一、PDF文件是一种文本和二进制混排的格式，但是Adobe更愿意让人把它当成二进制的文件，所以在里面建议当文件里面的文本太多的时候，可以加一些二进制的注释，好让现有的一些编译器把它当成二进制文件。里面的文本主要是对文件结构的一种描述，二进制的内容来自于三个方面：1、图片；2、字体；3、压缩后的Post Script。<BR>二、文件结构可以分为三方面：<BR>1、首部。用文本编辑器打开的时候就可以看到：%PDF-1.4 这样的字眼，其中最后一位就是PDF文件格式版本号，软件的版本号总要比文件格式的版本号高1，比如说Read 5能打开的内容就是4。<BR>2、文件体。里面有若干个的obj，以及xref来组成，OBJ这种形式：<BR>30979 0 obj<BR>&lt;&lt; <BR>/Linearized 1 <BR>/O 30982 <BR>/H [ 15061 25084 ] <BR>/L 9379963 <BR>/E 166967 <BR>/N 978 <BR>/T 8760262 <BR>&gt;&gt; <BR>endobj&nbsp;<BR>第一个数字就是这个OBJ的顺序号，是为了便于在xref中查找，后面的0是为了区分不同的OBJ，现在都是0（个人感觉是为了以后扩展用的）后面就是关键字obj.下面的各行就是属性，/关键字 值 的形式。<BR>xref是obj的索引表，用来索引各个obj在文档中的起始位置，它的形式是：<BR>xref<BR>0 211<BR>0000000000 65535 f<BR>0000000009 00000 n <BR>……<BR>0000087999 00000 n </P>
<P>trailer<BR>&lt;&lt;<BR>/Size 211<BR>/Root 2 0 R<BR>/Info 1 0 R<BR>/ID [&lt;B29FBB52459C4623DB1A90CBFC28381E&gt;&lt;B29FBB52459C4623DB1A90CBFC28381E&gt;]<BR>&gt;&gt;<BR>其中0,211分别代表这个xref的obj的起始和终止序号。其中0这个是估计是为了程序中好处理所以加了这个（个人英文水平不行，有些地方看不明白），可以不加入这个。下面的各行就代表各个obj在这个文档的起始位置，其中第一串字符（10个）代表起始位置，中间的五个字符也是为了区分用的，现在基本上全为0， 后面的字母有两种f代表删除的，n代表要使用的。后面的trailer是对整个xref的摘要，说明里面有多少个OBJ，读的时候从哪个OBJ开始解析，信息节点等，ID是为了让一些文件检索工具能够唯一区分文件。<BR>3、文件尾。<BR>startxref<BR>88019<BR>%%EOF<BR>因为一个文档中可以有多个xref，所以这里要指明要从哪个xref开始进行解析这个文件。<BR>从上面的分析来看：PDF文件内部校验是很复杂的，只要里面有一位错位了，就会导致整个文档读取错误。而且它时硕会有不少的二进制内容，所以一般来说在内存里面存储的时候，用流对象，而不能用字串，特别是生成的时候，每加入一个obj的时候，去获取一下当前流的长度就可以得到每个obj的起始位置，同时把获取的这些位置存到ArrayList里面，这样就可以很方便地得到和内容相一致的xref了。<BR>三、PDF里面对象的组成形式，可以说是用树形结构来相互关联的，驵下面挂页集合，页集合下面挂页，页里挂图片，链接，内容等<BR>四、PDF里面的obj的类型主要有以下几种：<BR>1、文件描述对象，用来描述这个文件的标题，作者，时间等<BR>2、组对象，也就是文档内容的起始结点。Type 为Catalog<BR>3、页集合，里面聚合了大量的页对象。&nbsp; Type 为pages<BR>4、页对象，里面指明了当前页里面用到的字体，内容，活动对象，图片等。Type 为page<BR>5、活动对象，有链接，文字，声音，电影等，Type 为Annots<BR>6、图片对象， Type 为 XObject<BR>7、字体对象，Type 为 Font 。PDF可以内置字体，所以即使目标机器上没有，只要它内置了，也可以正常地显示，不受影响（内置字体，这个我还没有研究清楚，希望知道的人可以告诉我一下，这里先谢了）<BR>8、流对象。所有的二进制内容都是存在这个对象里面，文件流的常见的压缩方式是：图片的一些压缩算法，FlateDecode,ASCIIHexDecode,ASCII85Decode等等，FlateDecode事实上就是ZIP的压缩算法（关这个，我就花了好长的时间去研究）。流对象的长度是关连到一个长度对象上的/Length&nbsp; 188 0 R这种形式。188就是存这个长度的OBJ的顺序号。<BR>9、数字对象。<BR>188 0 obj<BR>2538<BR>endobj<BR>里面只有一个数字，经常用来表示长度，为什么要把长度还要再用对象来表示，这个到现在我也想不太明白。<BR>以上就是我对PDF文件格式的理解的摘要。也许有些地方可能理解得不正确，希望得到大家的指正。</P><img src ="http://www.cnblogs.com/Ironsoft/aggbug/311467.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41288/" target="_blank">[新闻]鲍尔默：微软每年至少投资25亿美元死拼Google</a>]]></description></item><item><title>HTML转PDF控件开发的一些技术</title><link>http://www.cnblogs.com/Ironsoft/archive/2006/01/04/310920.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Wed, 04 Jan 2006 09:34:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2006/01/04/310920.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/310920.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2006/01/04/310920.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/310920.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/310920.html</trackback:ping><description><![CDATA[一切听起来是那么地疯狂：开发一个可以把HTML转化成为PDF的控件，不在现有的PDF控件上完成，因为这个关系到版权的问题。自从和老外合作后，发现自己也对版权变得敏感了，开发的东东里面，再也不想去在别人的基础上去调用，更多的时候是想着自己去实现。<BR>通过两个多月的业余时间的开发，中间经历了N轮的大规模重构（因为原来的设计不太满足一些需求），现在控件越来越OO了，当想到一个调用，就有成千上万个对象在各司其则地计算，内心不由得有点发晕。虽然还有一些BUG，但是已经实现得差不多了。只差对CSS的样式块没有解析，和流化字体文件这两块了。现在想着把里面的一些东西记下来，不知道能不能坚持把它写完。<BR>HTML转PDF的过程中，我把所要解决的问题列成以下几点：<BR>一、PDF的生成<BR>1、PDF文件结构<BR>2、PDF内容结构<BR>3、PDF图片转化<BR>4、PDF字体的转化<BR>二、HTML解析<BR>1、HTML文件结构解析<BR>2、样式解析<BR>3、表格的处理<BR>4、层的处理<BR>三、HTML转PDF<BR>下面将分文对这些问题进行解决。<img src ="http://www.cnblogs.com/Ironsoft/aggbug/310920.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41287/" target="_blank">[新闻]CNNIC发布《第22次中国互联网络发展状况统计报告》</a>]]></description></item><item><title>下一步该开发什么呢？</title><link>http://www.cnblogs.com/Ironsoft/archive/2005/03/05/113395.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Sat, 05 Mar 2005 03:07:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2005/03/05/113395.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/113395.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2005/03/05/113395.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/113395.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/113395.html</trackback:ping><description><![CDATA[原来拼命地开发了ASP的三个组件：文件上传，图片处理，Flash抓图，可是看起来，并没有多少人对它们感兴趣。很多人说现在是.NET时代了，COM已经成为了一种过去，在一个已经日暮西山的平台上开发再多的产品，也是很快会被淘汰掉。然道我也要跟风地去开发.NET上的东西吗？<img src ="http://www.cnblogs.com/Ironsoft/aggbug/113395.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41286/" target="_blank">[新闻]巨人与51.COM本月26日互通帐号</a>]]></description></item><item><title>IronSoft ASP系列组件1.4版</title><link>http://www.cnblogs.com/Ironsoft/archive/2005/02/22/107427.html</link><dc:creator>铁匠</dc:creator><author>铁匠</author><pubDate>Tue, 22 Feb 2005 04:29:00 GMT</pubDate><guid>http://www.cnblogs.com/Ironsoft/archive/2005/02/22/107427.html</guid><wfw:comment>http://www.cnblogs.com/Ironsoft/comments/107427.html</wfw:comment><comments>http://www.cnblogs.com/Ironsoft/archive/2005/02/22/107427.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Ironsoft/comments/commentRss/107427.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Ironsoft/services/trackbacks/107427.html</trackback:ping><description><![CDATA[修正了往上写字的时候，多行的文本写在一行上的BUG（只有当角度为0时，才有效）<BR>添加水印时的透明度<BR>添加了图片的透明度属性。<BR>修正了Gif格式保存的时候颜色失真的问题<BR>添加了文件上传组件直接转发给图片处理组件的通道<BR>增加了图片处理组件从网址来装载图片的方法<BR>详细的可以查看demos下面的uptodraw.asp, drawdemo2.asp<BR><BR>文件下载地址: <BR>&nbsp;简体中文下载: <BR><A href="http://blog.ironsoft.net/download/UploadDraw_Chinese(PRC)1.4.rar"><U><FONT color=#0000ff>http://BLog.IronSoft.net/download/UploadDraw_Chinese(PRC)1.4.rar</FONT></U></A> <BR>繁体中文下载： <BR><A href="http://blog.ironsoft.net/download/UploadDraw_Chinese(Taiwan)1.4.rar"><U><FONT color=#0000ff>http://BLog.IronSoft.net/download/UploadDraw_Chinese(Taiwan)1.4.rar</FONT></U></A> <BR><BR>免安装包下载： <BR><A href="http://blog.ironsoft.net/download/IronSoft.1.4.rar"><U><FONT color=#0000ff>http://BLog.IronSoft.net/download/IronSoft.1.4.rar</FONT></U></A> <img src ="http://www.cnblogs.com/Ironsoft/aggbug/107427.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41285/" target="_blank">[新闻]FEEDSKY和BLOGBUS的出路</a>]]></description></item></channel></rss>