2005年05月31日

根据博客中国转载第一财经日报的报道,戴尔在美国又开始了对新联想的黑手。前几天听说戴尔在制作了一个带有侮辱性质的针对联想、惠普等分销而不是直销的电脑厂商的广告,我还觉得这可以算作企业竞争,无足轻重,没想到今天爆出的消息,竟然直接上升了对中国政府的攻击了。

《第一财经日报》29日获得的一组电子邮件显示,戴尔的一位销售人员以避免“支持中国政府”为由,试图劝说IBM的原客户采购戴尔的产品。
  这组邮件是戴尔美国中大西洋地区战术项目军队系统(销售)经理与其所公关的目标客户,一家总部在美国新泽西州的公司一位主管军队系统电脑采购的负责人之间的往来信件。该公司是一家系统集成和咨询公司,成立于1983年,公司的客户包括美国联邦政府以及很多美国军方客户。
  在该组信件中,其中一份发出日期标注为4月27日下午8时12分(美国东部时间)的电子邮件中,这位名叫 Chris的戴尔公司的销售人员称,“要知道,联想公司是一家中国政府控制的企业,最近刚刚收购IBM的个人电脑业务。尽管美国政府已经批准了联想的收购,大家必须明白一点,现在客户们每买IBM的一美元的产品,都是直接支持和资助了中国政府。”
戴尔是进入中国的计算机制造企业获利最多的,每年都有大量政府部门采购戴尔的电脑产品。按理说中国政府对dell不薄,为什么还要如此恶心中国政府?
戴尔在厦门是做了投资,可这种投资,我们真的这么需要么?dell来到中国,就是要攫取超额利润,因为厦门的人力资源极其便宜,厦门政府对戴尔的支持也是极尽了全力,估计厦门也是唯一对戴尔言听计从的一个开放城市。都这样了,戴尔的服务却从进入中国后就得到很多人的诟病。
虽然我还推荐过不少人购买过戴尔的台式机,自己也购买过一个算是便宜的戴尔笔记本电脑,但从朋友的反馈来说,戴尔的质量确实有问题。我的电脑在美国买的,没什么大问题,同样品牌的笔记本,在中国就是一个普通的dvd光驱,内存也有所区别。后来我就想,大概太多类似于戴尔这样的企业到中国来建厂,他们生产的东西只要在中国这块土地上买,大概就会在中国按所谓的中国标准来制造并服务。
受人诟病的戴尔电脑,因为联想收购了全球电脑制造水平最高的“IBM”,他们就要搞点事情。在中国要动真刀真枪,在美国就只需要挪动“意识形态”就可以了。
都全球化这么厉害了,戴尔的经销商还能想到用政治和意识形态来为自己服务,实在是好笑。他们知道IBM的政府客户在迟疑,有所怀疑,所以就提出“每买IBM PC一个美元,就是支持中国政府”的谬论。
这已经脱离了正当竞争的轨道了,戴尔做得确实有点过了。
以前博客中国做过一个戴尔十大瓶颈的专题,那个专题主要针对的是戴尔对用户的不友好,服务的变质等等,没想到,刚过一年时间,随着PC市场的风云变化,戴尔就直接面对自己在全球增长最快市场的政府了。这不得不算作戴尔全球扩张过程中的一种悲哀。竞争不是这个样子,当戴尔被联想惠普等企业在中国市场上孤立起来之后,这样的企业大概也不会有太大的希望。我们常说一个企业要做好一个企业公民,戴尔作出来的行为,告诉我们它不配。当然,中国各级政府的头头脑脑也该好好想想了,自己给戴尔如此友好,购买了几千万上亿的戴尔产品,到头却没想到,美国那边的戴尔,却用意识形态的东西,意欲挖别人的墙脚。

2005年05月22日

上篇文章里我非常简单地介绍了FreeImage,有兴趣的可以看看;最近在学习DotNET,忽然想起了著名的开源项目:FreeImage,隐约记得它提供了DotNET的封装类,于是下载了最新的版本一看,果然如此,很是开心,这个宝贝也许很适合配合我的iText.NET使用呢。

下载,解压缩,用#Develop打开例子,编译,错误多的吓人(63个),经分析,主要是以下两种情况:

1.封装类里把静态函数FreeImage_前缀都去掉了,但demo中仍加上了;

2.UInt32和Integer之间没有做转换;

经过如下修改:

1.把FreeImage_都去掉;

2.把这行代码

Int image = FreeImage.Load(FIF.FIF_PPM, @"C:\FreeImage.ppm", 0);

中的Int改为UInt32

编译成功;

运行测试时又发现问题了,碰到了两个不存在的函数:

GetDotsPerMeterX

和FreeImage_ColorQuantize

一检查,原来是封装中把GetDotsPerMeterX写成了GetDotsPerMeter,而FreeImage_ColorQuantize被写成了

ColorQuantize(封装FreeImage.dll的函数时有FreeImage_是前缀的,封装后的没有)

再次把封装类也修改掉,重新编译FreeImage.NET.dll,编译Demo,运行成功。

还忘记了一个问题,如果你生成的是debug版本,你还会碰到一个问题,就是报freeimaged.dl不存在,这时你需要把freeimage.dll改名为freeimaged.dll(不知道为什么debug版本和relase版本使用不同的FreeImage静态链接库的名字)

至此,FreeImage.NET中所发现的错误已经修正完毕,感觉比较纳闷的是这么一个著名的开源项目中的demo和封装类怎么会有那么多的错误,似乎非常有损FreeImage的形象。

对了,由于本人不怎么熟悉C#,就用#Develop把Demo转为VB.NET版本的来看看,转后又发现一个问题:

  byte[] rawBytes = new byte[] {0,1,0,1,1,1,0};
  Console.WriteLine("ConvertFromRawBits");
  FreeImage.ConvertFromRawBits(rawBytes, 16, 16, 1, 1, 1, 1, 1, false);
  
  Console.WriteLine("ConvertToRawBits");
  IntPtr lpBits = IntPtr.Zero;
  FreeImage.ConvertToRawBits(lpBits, image, 1, 1, 1, 1, 1, false);

这段代码对于VB.NET的代码要改为:

  Dim rawBytes As Byte() = New Byte() {0, 1, 0, 1, 1, 1, 0}
  Console.WriteLine("ConvertFromRawBits")
  Dim i As UInt32=System.Convert.ToUInt32(1)
  
  FreeImage.ConvertFromRawBits(rawBytes, 16, 16, 1, i, i, i, i, False)
  Console.WriteLine("ConvertToRawBits")
  Dim lpBits As IntPtr = IntPtr.Zero
  FreeImage.ConvertToRawBits(lpBits, image, 1, i, i, i, i, False)

才能编译通过,想必各位已经看出红色字体部分的不同了吧?在C#下ConvertFromRawBits和ConvertToRawBits函数的5-8(后者为4-7)位参数使用整型就可以,但在VB.NET下必须是UInt32才可以(函数声明的是UInt32),还没有查找是什么原因呢。

P.S.修改后的源代码和VB.NET Demo

FreeImage是非常有名的开源的图片处理软件,支持跨平台,安全的多线程支持,支持多种编程语言(如C, C++, VB, C#, Delphi, Java和脚本语言:Perl, Python, PHP, TCL or Ruby),可以说非常的强大,下面把FreeImage的特点简单介绍下:

1.易用,这个各位自己试下吧,也没有什么好说的了;

FreeImage支持多种图片格式,如:

  • BMP files [reading, writing]
  • DDS files [reading]
  • Dr. Halo files [reading] *
  • GIF files [reading, writing]
  • HDR files [reading, writing]
  • ICO files [reading, writing]
  • IFF files [reading]
  • JBIG [reading, writing] **
  • JNG files [reading]
  • JPEG/JIF files [reading, writing]
  • KOALA files [reading]
  • LBM files [reading]
  • Kodak PhotoCD files [reading]
  • MNG files [reading]
  • PCX files [reading]
  • PBM files [reading, writing]
  • PGM files [reading, writing]
  • PNG files [reading, writing]
  • PPM files [reading, writing]
  • PhotoShop files [reading]
  • Sun RAS files [reading]
  • TARGA files [reading, writing]
  • TIFF files [reading, writing]
  • WBMP files [reading, writing]
  • XBM files [reading]
  • XPM files [reading, writing]


* 仅灰度格式
** 只能通过外部插件实现,有些是商业的

3.在本地PC上没有使用限制:独特的FreeImageIO 结构可以方便地通过多种途径获得和处理图片:独立的图片文件,内存,压缩文件中,网络;

4.插件驱动:方便编写和使用自己编写的插件

5.支持多种颜色效果转换

6.支持HDR图像

7.直接读取bitmaps bits 和palette

8.支持Metadata

9.开源

10两种信用证可选择:可方便用于开源项目或者商业项目

11.可以方便地与DirectX 、OpenGL集成.

但下篇讲讲下FreeImage.NET中的多处错误(FreeImage的DotNET封装和相关例子都有多处错误)

2005年05月20日

    信息化管理作为未来企业经营管理变革的一种趋势,已经各种传媒频繁炒作。虽然各大公司如IBM、HP等不断推出企业电子商务的解决方案,然而,作为面向具体行业的商务管理,即关于商业企业的“进、销、调、存”管理系统见诸报端的却并不多,比较成熟的面向服装企业的管理信息系统更是凤毛麟角。
    我国有中等规模的服装企业近五万家,这些企业对服装管理软件的需求形成了一个巨大的市场。随着市场竞争的加剧,越来越多的企业家意识到,企业存在的目的就是要获得最大限度的经济效益,企业效益的好坏是衡量企业经营管理水平高低最根本的标准。经营与管理之间能达到动态平衡和良性循环的企业,经济效益较好,反之则举步维艰。现代化的企业已经逐渐从劳动密集型向技术密集型转换,单纯靠对商品的占有,靠个人经验,已经很难把握市场,很难在激烈的角逐中取胜,服装企业尤其如此。
    在现代服装企业的运作中,个人的经验不是第一位的因素,现代经营管理的作用,应该建立在忠实的数据基础之上,应该是一种科学的理性管理。而这种管理与经营的互助,又绝对离不开计算机管理系统。

    “说起来重要,做起来不要”的尴尬
    越来越多的服装企业认识到信息化对企业可持续发展的重要意义,它对服装行业新型工业化起着助推器的作用。据分析,目前服装企业对信息化的应用需求体现在五个方面:产品设计信息化、管理信息化、生产过程控制自动化、制造设备数字化以及企业间协作网络化。然而,从总体上看,信息化之于服装行业还处于一种“说起来重要,做起来不要”的尴尬状态,主要表现如下:
    一是企业对信息化的资金投入严重不足。据抽样调查分析,目前服装企业每年在信息化工作方面的平均投入仅占其销售收入的0.1%左右,投入最多的企业约占销售收入的2%,投入最少的还不到销售收入的0.01%。
    二是企业信息化人才严重短缺。一旦信息系统开发完成,企业参加开发和实施的人员大部分都跳槽到IT公司,尤其在经济发达地区表现更加突出,使一些开发很好的系统验收后不能正常运行,应用日渐萎缩,造成信息系统“通过验收的多,能坚持应用的少”。
    三是缺乏适于企业应用的软件产品。在应用软件方面,主要表现为“定制开发多,可推广的产品少”。系统开发定制进行,不按照统一的标准和规范,没有形成符合科学标准的成熟的软件产品,难以推广。一些迫于无奈的企业只好自行开发,却陷入低水平重复的怪圈,开发周期长,水平也难以提高,影响了应用效果。
    四是缺乏信息化建设总体规划。调查显示,大多数服装企业很少甚至基本不做信息化建设总体规划、总体设计和过程控制,或规划流于形式,形成“单项项目多,综合应用系统少”。开发的项目大部分是单项管理、CAD、自动控制等,不能实现系统集体和信息共享,大大影响了项目的效果;不同厂商提供的系统或模块孤立建设和实施,大多数处于“信息孤岛”状态,不同系统之间互联互通的比例大多低于1/3。
    五是缺乏专业信息化服务机构。在信息化的专业领域中,企业自身要全面了解有关知识很困难,需要较高成本,需要专业咨询服务机构提供科学指导和完整的方案,使企业能借助“外脑”的丰富知识和经验来顺利实施系统。而熟悉服装行业的咨询顾问公司却很少,评测、监理制度也未形成。企业在赞扬合作伙伴、产品技术等方面比较盲目,实施进度、质量难于把握,造成“上项目者多,而成功应用少”的尴尬局面。

    服装企业和软件开发商应减少盲区
    目前国内服装企业大多是近年来崛起的私营企业,企业的经营理念和管理模式还存在着先天的缺陷。绝大多数服装企业是通过人工单据流转程序,来实现信息流对商品流的跟踪;通过财务库存资金帐来控制进销过程;通过仓库来核查物流过程;通过定期盘点、对帐来调整帐目和商品的损益,由此造成物流、款流、票据流分离,财务信息滞后实际业务,所以只有通过盘点才能较准确地了解经营情况。尤其对各类票据、应收、应付款等信息查找困难重重,差错率高,商品进、销、存数量及金额记录统计工作量大,准确性差,各类经营统计数据严重滞后实际业务需要。日益加剧的服装行业的市场竞争,对手工管理模式提出了严峻持挑战。经营者与计算机软件开发者都存在着对对方领域认识的盲区。为促进服装管理软件市场的发展,软件开发商应在服装行业自动化发展过程中起到更多的主导作用和更加积极的作用,减少自己的盲区,同时帮助服装企业减少盲区,并通过优化软件设计思路,优化工作方式,来引导服装企业建立管理信息系统。

    信息化应学会用“减法”
    由于历史和现实的多方面原因,服装企业在经营管理模式、业务流程等方面可谓五花八门、各具特色,众多的服装企业对由于作业手段的变化面带来的经营管理意识上的变革认识不足;其次是服装企业长期没用手工管理二项式所形成的作业习惯和思维习惯难以改变。企业经营者缺乏计算机专业方面的基础知识,而没有认识到它应是管理者经营思想的具体体现,是信息管理系统的灵魂。
    值得称道的是,市场上已经出现具有前瞻性的为服装企业设计的,通过Internet,企业总部和分支机构、零售网点、供货商、代理商、第三方物流公司、外协工厂组成的企业经营数字神经系统,任何一点的业务变化,都可以通过Internet实时传递到有关的其它地点,引起上下游业务环节的互动,大大提高企业对市场变化的响应速度。
    利用互联网突破地域的限制,企业的高层、业务人员不管在什么地点,只要能拉入互联网,就能够对公司业务进行处理,如同本地一样。这样,企业的所有人员就形成了虚拟同室办公的局面,这是服装企业多年追求的理想境界。
    有识之士指出:新一代的服装企业,与传统的企业思维模式恰恰相反,他们不是在做加法,而是不停地在做减法,外包生产、外包物流、外包服务、外包会计,今天,他们连信息系统的建设、管理和维护也一并外包出去,他们越来越聚焦于自己的核心业务,将核心业务做得越来越大,这是真正健康的企业。建立大型数据中心,并将企业需要的信息系统预先准备好、设置好,就像自来水公司建好了水厂,修好了管理,将水龙头装进千家万户,用户只需打开龙头并按时交纳水费,就可使用自来水。业内知名软件管理公司──锐步就是遵循这一理念,将所有的准备工作做好,只需一个电话,技术人员就会上门进行系统培训,帮助企业规范业务流程、数据准备,然后,企业就可轻松迈入e化的门坎。
    事实上,一些具有前瞻性的服装企业正在转变业务动作模式:花更少的时间去揣测未来,而用更多的时间探求新的途径,以对眼前的问题进行更快速的反应。建立一个反应灵敏的组织结构,为难以预料的事件做好充分准备,从容应对突发事件。另外,利用紧密整合的供应链,对模糊不清的客户需求、下游物流系统以及价格的变化,都能实时感知并同步实时响应。
    专家指出:未来服装界信息化管理将呈现出以下特征:实时响应──在不断变化的市场中,对客户、供货商、合作伙伴和竞争对手做出条件反射般的响应;灵活多变──探求更具成本效益的商业动作方式,消除固定成本和管理费用;坚固可靠──采用可靠的技术,实时响应突发事件和威胁;聚焦核心──专注于核心业务,将其它事务交由策略合作伙伴和供货商处理。

        在www.somee.com申请了一个支持asp.net免费空间,用于测试我的iText.NET of IKVM,现在只放了两个简单的asp.net程序,一个类似helloworld,一个是测试中文PDF的显示。

        根据我的时间安排,我会慢慢把iText的教程翻译了上传到网上演示。

2005年05月16日

monoforge.com为对linux下测试.net(mono)感兴趣的人员提供了10M的免费空间和MySql数据库支持,

只需要简单的注册就可以获得帐号。

2005年05月13日
  • Batch ReaderEnable
    利用Acrobat Profession 8及以上版本,批量实现Reader Enable 的功能,如,
    1. Enable For Commenting and Analysis In Adobe Reader
    2. Enable TypeWriter Tool in Adobe Reader
    3. Usage Rights Enable
  • ReaderEnable with FileMonitor Support
  • FCrackZip 1.0 Windows Version
    破解zip密码的免费工具,别人的开源项目,我只是把它编译下,能在windows下运行。免费
  • PDF Bookmark Extractor
    抽取PDF 书签的小工具,免费
  • Pdf Cropper
    去掉PDF多余的白边,需要GhostScript的支持。免费
  • PDF Digital Signer
    Portable PDF Digital Signatures,便携的PDF签名软件,免费
  • PDF N-UP Maker
    制作N_UP和Booklet的小工具,免费(Free)。
  • PDF PageDivide
    PDF页面分割工具,比如把一张A3页面的PDF分割成2张同样大小的A4,适用于常扫描图书的人。
  • PDF Timestamp Signer
    支持Timestamps的PDF数字签名软件。
  • PDF2PPT
    免费的PDF转PPT软件,需要Adobe Acrobat和Powerpoint。
  • PDF2PPT-Acrobat Free
    另外一款免费的PDF转PPT软件,不需要 Adobe Acrobat但需要Powerpoint。
  • PDFCrack
    一个开源的软件,用于获取PDF的密码,但不能去除PDF密码,如果要去除密码需要下面这款。
  • PdfCrypt
    PDF加密和解密软件,支持Standard 40-bit,128-bit RC4和AES128,不支持AES192,如果只有Master Password加密,不知道密码也可以去除。如果有User Password,必须提供User Password,免费(Free)
  • pdflock
    原来金山的高人开发的一个第三方PDF加密插件,只适用于Adobe Acrobat(Reader)5.0以下版本,一些老图书也许需要,怕大家不好找,就收藏了。
  • PdfMerge
    支持书签合并的PDF合并软件
  • Pdfrotate
    把PDF页面旋转90,180,270度,这个同样适合扫描图书的朋友。
  • pdfselect
    PDF Split, PDF 页面调整(PDF Rearrange,PDF ReOrder),PDF 提取(PDF Extract),PDF 页面顺序翻转等。
  • Portable Xps Viewer for XP and Windows 2003
    这个是针对XPS Viewer在XP SP3下安装困难制作的一个便携包,需要的去试试吧。

http://blog.blogchina.com/upload/2004-11-02/20041102075509729672.rar

PDF要使用完整路径名

目前只支持把pdf转为单页的BMP文档,今后会根据反馈适当增加新的功能。

最近在学习Delphi,感觉Fastreport是个想当不错的报表工具,所以想把自己的查询和研究心得整理一下,供大家参考,我会针对fastreport出个系列专题(现在看来自己说大话了)。

一下资料来自网上和自己的整理,如有侵权,请来信告知

我使用方法二进行安装,Delphi 6.0 安装成功;
设计中文报表时注意报表页面字符集和字体的选择。
1) 3.03P 的安装文件(以下分别为Delphi 5,6,7安装文件下载地址,你也可以到2ccc.com或playicq.com下载)

http://www.delphifans.com/SoftView/SoftView_592.html

http://www.delphifans.com/SoftView/SoftView_591.html

http://www.delphifans.com/SoftView/SoftView_590.html

2) 3.07En 文件

http://www.delphifans.com/SoftView/SoftView_888.html
3) 3.07 汉化资源文件

ftp://new1:dr65rrrrr@61.152.102.114:2100/datanew/2004122817001829339.rar

http://www.playicq.com:81/datanew/2004122817001829339.rar
4) 修改frxPDFFile.pas文件,使其支持中文PDF的输出(详见文章《让Fastreport3.x支持中文PDF的输出》)。

(以下内容来自fastreport v3.07汉化说明)
仅能用于FastReport.v3.07 !!!

安装方法一:
 1.首先安装Fast report3.07 版(可到www.delphifans.com下载)。
 1.将汉化包解压缩到Fast report 安装目录的res目录下。
如:C:\Program Files\FastReports\FastReport 3\Res\ (Res目录就是放置各种语言包的地方)。
 2.在关闭delphi的情况下运行:开始-程序-FastReports-FastReport 3-Recompile Wizard。
 3.在Recompile Wizard中点击contiune,在下一窗口中选择语言"简体中文",其他选项作相应选择,点击Compile按钮,等待重新编译结束。关闭Recompile Wizard。
 4.打开delphi ,试用fast report3,全部中文界面,OK。重新编译以前做的使用了Fast Report的程序。OK。

安装方法二:
1. 先安装FastReport3.03;
2. 用FastReport3.07覆盖安装目录;
3. 将中文包Chinese目录拷贝到安装目录的Res目录下;
4. 运行multilang.exe文件,选择Chinese,Builder后生成frxMultiLang.pas文件;
5. 拷贝frxMultiLang.pas文件到Source目录;
6. 运行安装目录下的recompile.exe即完成中文版FastReport3.07安装!

转自大富翁论坛,至于如何重新编译可以参考《Fastreport 3.07 企业版的安装及中文化》

Q:FastReport 3.x导出PDF乱码怎么解决?(中文乱码,英文没问题).
A:用下面这代码替换 frxPDFFile.pas 中原来的代码就可以了
已在enterprise 3.07下测试通过;
注意事项:字体内嵌的复选框不可选。

procedure TfrxPDFFont.SaveToStream(Stream: TStream);
var
  s: String;
  b: TBitmap;
  pm: ^OUTLINETEXTMETRIC;
  FontName: String;
  i: Cardinal;
  pfont: PChar;
  FirstChar, LastChar : Integer;
  MemStream: TMemoryStream;
  MemStream1: TMemoryStream;
  pwidths: PABC;
  Charset: TFontCharSet;

  // support DBCS font name encoding
  function EncodeFontName(AFontName: String): string;
  var
    s: string;
    Index, Len: Integer;
  begin
    // Add Begin by ijia 2004.12.20
    // 修正在简体系统下繁体字体名的问题
    // 只提供 MingLiU, PMingLiU –> 细明体, 新细明体的修正
    s:=UpperCase(AFontName);
    if Copy(s, 1, 7)=’MINGLIU’ then
      AFontName:=’细明体’;
   
    if Copy(s, 1, 8)=’PMINGLIU’ then
      AFontName:=’新细明体’;
    // Add end
    s := ”;
    Len := Length(AFontName);
    Index := 0;
    while Index < Len do
    begin
      Index := Index + 1;
      if Byte(AFontName[Index]) > $7F then
        s := s + ‘#’ + IntToHex(Byte(AFontName[Index]), 2)
      else
        s := s + AFontname[Index];
    end;
    Result := s;
  end;

begin
  inherited SaveToStream(Stream);
  b := TBitmap.Create;
  b.Canvas.Font.Assign(Font);
  b.Canvas.Font.Size := 750;
  i := GetOutlineTextMetrics(b.Canvas.Handle, 0, nil);
  GetMem(pm, i);
  GetOutlineTextMetrics(b.Canvas.Handle, i, pm);
  FirstChar := Ord(pm.otmTextMetrics.tmFirstChar);
  LastChar := Ord(pm.otmTextMetrics.tmLastChar);
  FontName := StringReplace(Font.Name, ‘ ‘, ‘#20′, [rfReplaceAll]);
  s := ”;
  if fsBold in Font.Style then
    s := s + ‘Bold’;
  if fsItalic in Font.Style then
    s := s + ‘Italic’;
  if s <> ” then
    FontName := FontName + ‘,’ + s;

  Charset := pm.otmTextMetrics.tmCharSet;
  // Add by ijia 2004.12.20
  //if Charset = CHINESEBIG5_CHARSET then
  if Charset in [CHINESEBIG5_CHARSET, GB2312_CHARSET] then
    FontName := EncodeFontName(FontName)
  else
    FontName := Parent.PTool.PrepareString(FontName);

  Parent.XRefAdd(Stream);
  WriteLn(Stream, IntToStr(Index + Parent.FStartFonts) + ‘ 0 obj’);
  WriteLn(Stream, ‘<<’);
  WriteLn(Stream, ‘/Type /Font’);
  WriteLn(Stream, ‘/Name /F’ + IntToStr(Index – 1));
  WriteLn(Stream, ‘/BaseFont /’ + EncodeFontName(FontName));

  // Add by ijia 2004.12.20
  //if Charset <> CHINESEBIG5_CHARSET then
  if not (Charset in [CHINESEBIG5_CHARSET, GB2312_CHARSET]) then
    WriteLn(Stream, ‘/Subtype /TrueType’)
  else
    WriteLn(Stream, ‘/Subtype /Type0′);

  case Charset of
    SYMBOL_CHARSET, ANSI_CHARSET:
      WriteLn(Stream, ‘/Encoding /WinAnsiEncoding’);

    RUSSIAN_CHARSET: {1251}
    begin
      WriteLn(Stream, ‘/Encoding <</Type/Encoding /BaseEncoding /WinAnsiEncoding’);
      Write(Stream, ‘/Differences [129 /afii10052');
      Write(Stream, '/quotesinglbase/afii10100/quotedblbase/ellipsis/dagger/daggerdbl/Euro/perthousand/afii10058/guilsinglleft/afii10059/afii10061/afii10060/afii10145/afii10099/quoteleft');
      Write(Stream, '/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/space/trademark/afii10106/guilsinglright/afii10107/afii10109/afii10108/afii10193/space/afii10062');
      Write(Stream, '/afii10110/afii10057/currency/afii10050/brokenbar/section/afii10023/copyright/afii10053/guillemotleft/logicalnot/hyphen/registered/afii10056/degree/plusminus');
      Write(Stream, '/afii10055/afii10103/afii10098/mu/paragraph/periodcentered/afii10071/afii61352/afii10101/guillemotright/afii10105/afii10054/afii10102/afii10104/afii10017/afii10018');
      Write(Stream, '/afii10019/afii10020/afii10021/afii10022/afii10024/afii10025/afii10026/afii10027/afii10028/afii10029/afii10030/afii10031/afii10032/afii10033/afii10034/afii10035');
      Write(Stream, '/afii10036/afii10037/afii10038/afii10039/afii10040/afii10041/afii10042/afii10043/afii10044/afii10045/afii10046/afii10047/afii10048/afii10049/afii10065/afii10066');
      Write(Stream, '/afii10067/afii10068/afii10069/afii10070/afii10072/afii10073/afii10074/afii10075/afii10076/afii10077/afii10078/afii10079/afii10080/afii10081/afii10082/afii10083');
      WriteLn(Stream, '/afii10084/afii10085/afii10086/afii10087/afii10088/afii10089/afii10090/afii10091/afii10092/afii10093/afii10094/afii10095/afii10096/afii10097/space]‘);
      WriteLn(Stream, ‘>>’);
    end;

    EASTEUROPE_CHARSET: {1250}
    begin
      WriteLn(Stream, ‘/Encoding <</Type/Encoding /BaseEncoding /WinAnsiEncoding’);
      Write(Stream, ‘/Differences [128 /Euro 140 /Sacute /Tcaron /Zcaron /Zacute');
      Write(Stream, ' 156 /sacute /tcaron /zcaron /zacute 161 /caron /breve /Lslash');
      Write(Stream, ' 165 /Aogonek 170 /Scedilla 175 /Zdotaccent 178 /ogonek /lslash');
      Write(Stream, ' 185 /aogonek /scedilla 188 /Lcaron /hungarumlaut /lcaron /zdotaccent /Racute');
      Write(Stream, ' 195 /Abreve 197 /Lacute /Cacute 200 /Ccaron 202 /Eogonek 204 /Ecaron 207 /Dcaron /Dslash');
      Write(Stream, ' 209 /Nacute /Ncaron /Oacute 213 /Ohungarumlaut 216 /Rcaron /Uring 219 /Uhungarumlaut');
      Write(Stream, ' 222 /Tcedilla 224 /racute 227 /abreve 229 /lacute /cacute /ccedilla /ccaron');
      Write(Stream, ' 234 /eogonek 236 /ecaron 239 /dcaron /dmacron /nacute /ncaron 245 /ohungarumlaut');
      Write(Stream, ' 248 /rcaron /uring 251 /uhungarumlaut 254 /tcedilla /dotaccent]‘);
      WriteLn(Stream, ‘>>’);
    end;

    TURKISH_CHARSET,
    GREEK_CHARSET,
    HEBREW_CHARSET,
    ARABIC_CHARSET,
    VIETNAMESE_CHARSET:
    begin
      WriteLn(Stream, ‘/Encoding <</Type/Encoding /BaseEncoding /WinAnsiEncoding’);
      Write(Stream, ‘/Differences [128 /Euro 142 /Zcaron 158 /zcaron]‘);
      WriteLn(Stream, ‘>>’);
    end;

    CHINESEBIG5_CHARSET: {136}
    begin
      WriteLn(Stream, ‘/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]‘);
      WriteLn(Stream, ‘/Encoding /ETenms-B5-H’);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);

      WriteLn(Stream, IntToStr(Index + 1 + Parent.FStartFonts) + ‘ 0 obj’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Type /Font’);
      WriteLn(Stream, ‘/Subtype’);
      WriteLn(Stream, ‘/CIDFontType2′);
      WriteLn(Stream, ‘/BaseFont /’+ EncodeFontName(FontName));
      WriteLn(Stream, ‘/WinCharSet 136′);
      WriteLn(Stream, ‘/FontDescriptor ‘ + IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 R’);
      WriteLn(Stream, ‘/CIDSystemInfo’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Registry(Adobe)’);
      WriteLn(Stream, ‘/Ordering(CNS1)’);
      WriteLn(Stream, ‘/Supplement 0′);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘/DW 1000′);
      WriteLn(Stream, ‘/W [1 95 500]‘);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);

      Parent.XRefAdd(Stream);

      WriteLn(Stream, IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 obj’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Type /FontDescriptor’);
      if Parent.FEmbedded then
         WriteLn(Stream, ‘/FontFile2 ‘ + IntToStr(Index + 4 + Parent.FStartFonts) + ‘ 0 R’);
      WriteLn(Stream, ‘/FontName /’ + EncodeFontName(FontName));
      WriteLn(Stream, ‘/Flags 7′);
      WriteLn(Stream, ‘/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]‘);
      WriteLn(Stream, ‘/Style << /Panose <010502020300000000000000> >>’);
      WriteLn(Stream, ‘/Ascent ‘ + IntToStr(pm^.otmAscent));
      WriteLn(Stream, ‘/Descent ‘ + IntToStr(pm^.otmDescent));
      WriteLn(Stream, ‘/CapHeight ‘ + IntToStr(pm^.otmTextMetrics.tmHeight));
      WriteLn(Stream, ‘/StemV ‘ + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
      WriteLn(Stream, ‘/ItalicAngle ‘ + IntToStr(pm^.otmItalicAngle));
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);
    end;
   
    // Add begin by ijia 2004.12.20
    GB2312_CHARSET: {134}
    begin
      WriteLn(Stream, ‘/DescendantFonts [' + IntToStr(Index + 1 + Parent.FStartFonts) + ' 0 R]‘);
      WriteLn(Stream, ‘/Encoding /GB-EUC-H’);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);

      WriteLn(Stream, IntToStr(Index + 1 + Parent.FStartFonts) + ‘ 0 obj’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Type /Font’);
      WriteLn(Stream, ‘/Subtype’);
      WriteLn(Stream, ‘/CIDFontType2′);
      WriteLn(Stream, ‘/BaseFont /’+ EncodeFontName(FontName));
      WriteLn(Stream, ‘/WinCharSet 134′);
      WriteLn(Stream, ‘/FontDescriptor ‘ + IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 R’);
      WriteLn(Stream, ‘/CIDSystemInfo’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Registry(Adobe)’);
      WriteLn(Stream, ‘/Ordering(GB1)’);
      WriteLn(Stream, ‘/Supplement 2′);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘/DW 1000′);
      WriteLn(Stream, ‘/W [ 1 95 500 814 939 500 7712 [ 500 ] 7716 [ 500 ] ]’);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);

      Parent.XRefAdd(Stream);

      WriteLn(Stream, IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 obj’);
      WriteLn(Stream, ‘<<’);
      WriteLn(Stream, ‘/Type /FontDescriptor’);
      if Parent.FEmbedded then
         WriteLn(Stream, ‘/FontFile2 ‘ + IntToStr(Index + 4 + Parent.FStartFonts) + ‘ 0 R’);
      WriteLn(Stream, ‘/FontName /’ + EncodeFontName(FontName));
      WriteLn(Stream, ‘/Flags 6′);
     
      WriteLn(Stream, ‘/FontBBox [-25 -254 1000 880]‘);
      WriteLn(Stream, ‘/Style << /Panose <010502020400000000000000> >>’);
      WriteLn(Stream, ‘/Ascent 880′);
      WriteLn(Stream, ‘/Descent -120′);
      WriteLn(Stream, ‘/CapHeight 880′);
      WriteLn(Stream, ‘/StemV 93′);
      WriteLn(Stream, ‘/ItalicAngle 0′);
      WriteLn(Stream, ‘>>’);
      WriteLn(Stream, ‘endobj’);
    end;
    // Add end
  end;

  // Add by ijia 2004.12.20
  //if Charset <> CHINESEBIG5_CHARSET then
  if not (Charset in [CHINESEBIG5_CHARSET, GB2312_CHARSET]) then
  begin
    WriteLn(Stream, ‘/FontDescriptor ‘ + IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 R’);
    WriteLn(Stream, ‘/FirstChar ‘ + IntToStr(FirstChar));
    WriteLn(Stream, ‘/LastChar ‘ + IntToStr(LastChar));
    GetMem(pwidths, SizeOf(ABCArray));
    Write(Stream, ‘/Widths [');
    GetCharABCWidths(b.Canvas.Handle, FirstChar, LastChar, pwidths^);
    for i := 0 to (LastChar - FirstChar) do
      Write(Stream, IntToStr(pwidths^[i].abcA + Integer(pwidths^[i].abcB) + pwidths^[i].abcC) + ‘ ‘);
    WriteLn(Stream, ‘]’);
    FreeMem(pwidths);
    WriteLn(Stream, ‘>>’);
    WriteLn(Stream, ‘endobj’);
    Parent.XRefAdd(Stream);
    WriteLn(Stream, IntToStr(Index + 2 + Parent.FStartFonts) + ‘ 0 obj’);
    WriteLn(Stream, ‘<<’);
    WriteLn(Stream, ‘/Type /FontDescriptor’);
    if Parent.FEmbedded then
      WriteLn(Stream, ‘/FontFile2 ‘ + IntToStr(Index + 4 + Parent.FStartFonts) + ‘ 0 R’);
    WriteLn(Stream, ‘/FontBBox [' + IntToStr(pm^.otmrcFontBox.Left) + ' '+ IntToStr(pm^.otmrcFontBox.Bottom) + ' '+ IntToStr(pm^.otmrcFontBox.Right) + ' '+ IntToStr(pm^.otmrcFontBox.Top) + ' ]‘);
    WriteLn(Stream, ‘/FontName /’ + FontName);
    WriteLn(Stream, ‘/Flags 32′);
    WriteLn(Stream, ‘/StemV ‘ + IntToStr(50 + Round(sqr(pm^.otmTextMetrics.tmWeight / 65))));
    WriteLn(Stream, ‘/CapHeight ‘ + IntToStr(pm^.otmTextMetrics.tmHeight));
    WriteLn(Stream, ‘/Ascent ‘ + IntToStr(pm^.otmAscent));
    WriteLn(Stream, ‘/Descent ‘ + IntToStr(pm^.otmDescent));
    WriteLn(Stream, ‘/ItalicAngle ‘ + IntToStr(pm^.otmItalicAngle));
    WriteLn(Stream, ‘>>’);
    WriteLn(Stream, ‘endobj’);
  end;

  if Parent.FEmbedded then
  begin
    Parent.XRefAdd(Stream);
    WriteLn(Stream, IntToStr(Index + 4 + Parent.FStartFonts) + ‘ 0 obj’);
    i := GetFontData(b.Canvas.Handle, 0, 0, nil, 1);
    GetMem(pfont, i);
    i := GetFontData(b.Canvas.Handle, 0, 0, pfont, i);
    MemStream := TMemoryStream.Create;
    MemStream.Write(pfont^, i);

    MemStream1 := TMemoryStream.Create;
    frxDeflateStream(MemStream, MemStream1, gzMax);
    WriteLn(Stream, ‘<< /Length ‘ + IntToStr(MemStream1.Size) + ‘ /Filter /FlateDecode /Length1 ‘ + IntToStr(MemStream.Size) + ‘ >>’);
    WriteLn(Stream, ’stream’);
    Stream.CopyFrom(MemStream1, 0);
    MemStream1.Free;

    MemStream.Free;
    FreeMem(pfont);
    WriteLn(Stream, ”);
    WriteLn(Stream, ‘endstream’);
    WriteLn(Stream, ‘endobj’);
  end;
  FreeMem(pm);
  b.Free;
end;