以前我曾在 Dev-C++ 下编译过 libHaru 的 Demo,Dev-C++ 当然是很好的 C/C++ IDE,只是其携带的 mingw gcc g++ 没有更新过。最新的 mingw gcc g++ 稳定版最好的当然就直接从官方网站 http://www.mingw.org/ 下载和安装。
1. 下载安装 mingw (
http://www.mingw.org/)
下载地址:
http://sourceforge.net/projects/mingw/files/
下载得到一个文件 MinGW-5.1.6.exe, 把这个文件放到某个目录 (例如 e:\mingw_download), 双击 MinGW-5.1.6.exe, 选 核心文件 和 gcc/g++ , 下载并安装。
下载时间不长,大概15分钟。安装缺省是在 C:\mingw
2. 设置 C:\mingw\bin 路径
把 C:\mingw\bin 加入到 环境变量 的 系统变量 的 Path
完成后,打开一个命令行窗口, 输入: gcc --version 和 g++ --version
如果有版本信息显示,就说明安装和配置均完成。
3.下载 zlib 和 libpng 源文件
zlib 下载地址:
http://www.zlib.net/zlib-1.2.3.tar.gz
下载后,解压到 e:\zlib
libpng 下载地址:
http://sourceforge.net/projects/libpng/files/00-libpng-stable/1.2.41/libpng-1.2.41.tar.gz/download
下载后解压,把里面的目录 libpng-1.2.37-src (藏的很深啊:解压目录\src\libpng\1.2.37) 挖出来,放到 e:\ 并改目录名为 libpng (就是源文件放于 e:\libpng)
4. 编译 zlib 和 libpng
(4.1) 编译 zlib
打开命令行窗口,到 e:\zlib 目录下,输入以下命令:
copy win32\makefile.gcc makefile.gcc
mingw32-make -f makefile.gcc
完成后在该目录就新生成一个 libz.a 文件。
把 libz.a 文件复制到 C:\mingw\lib
把 zlib.h 和 zconf.h 两文件复制到 C:\mingw\include
(4.2) 编译 libpng
打开命令行窗口,到 e:\libpng 目录下,输入以下命令:
copy scripts\makefile.gcc
mingw32-make -f makefile.gcc
完成后在该目录新生成一个 libpng.a 文件。
把 libpng.a 文件复制到 C:\mingw\lib
把 png.h 和 pngconf.h 两文件复制到 C:\mingw\include
5. 下载 libHaru 源文件和编译
(5.1) 下载 libHaru 源文件
下载地址:
http://libharu.org/wiki/Downloads
最新源文件:
http://libharu.org/files/libharu-2.1.0.tar.gz
下载后把得到的 libharu-2.1.0.tar.gz 文件解压,把里面的 libharu-2.1.0 目录复制到 e:\ 并改目录名为 libharu (就是把 libharu 的源文件放于 e:\libharu)
(5.2) 编译 libHaru
打开一个命令行,到 e:\libharu 目录下,输入以下命令:
copy script\makefile.mingw
mingw32-make -f makefile.mingw
完成后在该目录新生成一个 libhpdf.a 文件。
把 libhpdf.a 文件复制到 C:\mingw\lib
把 include\hpdf.h 和 include\hpdf_conf.h 两文件复制到 C:\mingw\include
把 win32\include\hpdf_config.h 文件复制到 C:\mingw\include
注意了:必须要复制这个 hpdf_config.h 文件,否知会出错,如下:
(5.3) 编译 Demo
在源文件有一个目录 demo 包含多个实例 c 文件,现在就可以编译这些样板了。
本来 makefile.mingw 已经包含了编译 demo 的选项,用以下命令来编译:
mingw32-make demo -f makefile.mingw
却出错,只编译了一个c文件就停止了,原因是其路径的设定不对。我没有修改这个 makefile.mingw 文件,而是把其中编译demo的配置,放到一个 批处理(.bat)文件,如下:
gcc -o demo/encoding_list.exe -Iinclude -O2 -Wall -mno-cygwin demo/encoding_list.c -Lwin32/mingw -L. -lhpdf -lpng -lz
gcc -o demo/font_demo.exe -Iinclude -O2 -Wall -mno-cygwin demo/font_demo.c -Lwin32/mingw -L. -lhpdf -lpng -lz
gcc -o demo/text_demo.exe -Iinclude -O2 -Wall -mno-cygwin demo/text_demo.c demo/grid_sheet.c -Lwin32/mingw -L. -lhpdf -lpng -lz
运行这个批处理就可以完成编译,生成 exe 文件。运行这些 exe 就可以产生 PDF 文件。
注意了,以上的 encoding_list.exe 必须要在 demo 目录下运行,因为这个目录下的 \type1 子目录存放了所用到的字库(font),见源文件:
如果找不到字库,就出错(ERROR: error_no=1017, detail_no=2),如下:
我可是花了2天时间才知道问题所在,呵呵,惭愧。还是需要好好读书,学看源代码啊。
6. CJK 问题
这次把 libHaru 编译就是为了学习了解生成包含中文的PDF的过程和配置,最终的目的是要把 libHaru 编译为 swc 放到 Flex /AIR 里动态生成含中文的 PDF。
(6.1) demo 的示例 ttfont_demo_jp.c
该例子是生成含日文字符的PDF, 结合 libHaru 文档:
http://libharu.org/wiki/Documentation/API/Font
http://libharu.org/wiki/Documentation/Fonts
http://libharu.org/wiki/Documentation/Encodings
可以知道,其源文件中:
/* declaration for using Japanese encoding. */
HPDF_UseJPEncodings (pdf);
启用日文编码。而这一行读取字库:
detail_font = HPDF_GetFont (pdf, detail_font_name, "90msp-RKSJ-H");
而这里,就设定字符大小,和输出到 PDF:
HPDF_Page_SetFontAndSize (page, detail_font, 10);
HPDF_Page_ShowText (page, SAMP_TXT);
输出内容来自变量 SAMP_TXT.
从网上搜索到极少的使用中文字库的例子片段,其中一个例子使用繁体中文的如下:
HPDF_Font fcp950;
.......
HPDF_UseCNTEncodings(pdf);
HPDF_UseCNTFonts(pdf);
//--- Use Built-in Chinese font ---
fcp950=HPDF_GetFont (pdf, "MingLiU","ETen-B5-H");
//--- now you can export chinese text ---
而使用ttf字库的例子,如下:
font_name = malloc(10 * sizeof(font_name));
font_name = HPDF_LoadTTFontFromFile(pdf, "timeSS.ttf", HPDF_TRUE);
font = HPDF_GetFont (pdf, font_name, NULL);
HPDF_Page_BeginText (page);
/* font = HPDF_GetFont (pdf, "Times-Roman", NULL); */
HPDF_Page_SetFontAndSize (page, font, 12);