windows c++ libharu 源码编码记录

网上找了很多文章写的不是很详细,可能我是cmake小白吧,留下此文章帮助有需要的人。

看了一篇文章 :https://www.cnblogs.com/shiyixirui/p/17794050.html

visualstudio下载社区版,勾选vc++开发,这里就不发图了,太大了当时没截图:Windows 应用和游戏开发工具 | Visual Studio使用 Microsoft 的 Visual Studio IDE,借助适用于 Windows 应用和游戏的工具进行设计、编码和优化。 立即免费下载以开始生成。icon-default.png?t=N7T8https://visualstudio.microsoft.com/zh-hans/vs/features/windows-apps-games/

cmake工具Download CMakeicon-default.png?t=N7T8https://cmake.org/download/

三个库源码

libharu下载:libHarulibHaru free PDF libraryicon-default.png?t=N7T8http://libharu.org/

libpng下载 LIBPNGicon-default.png?t=N7T8https://libpng.sourceforge.io/index.html

zlib下载:zlib Home Siteicon-default.png?t=N7T8https://www.zlib.net/

 

以上都下载好了放到同一个目录解压,源文件留着别删,程序能跑了再删。

三个解压好的源码文件夹内都新建一个build文件夹,存放cmake生成的文件

启动camke,msi安装包安装的时候选了桌面图标桌面就有,zip安装包自己到解压目录找,我装的时候没选桌面图标只能到目录找

启动它,必须按着顺序编译,第一个zlib-1.3.1

点Finish,创建文件需要时间,等几秒。

这里面发红的其实是有些目录找不到或者未配置,zlib可以不用管点Generate就好

cmake生成完成找到vs工程文件

build文件夹内找到sln文件用vs打开

Debug和Release都需要编译一次

显示以上就完成第一个源码编译,下面开始第二个源码编译

libpng-libpng16编译

点Finish后报错

点确定后,滚动条往下拖

上图爆一堆错误,只需要看最下面zlib的问题搜索ZLIB 他后面写的not found 我们指向正确的就行了

这三个指定好继续点Configure,注意红框出是两个目录,不然编译会出现找不到目录的情况camke文件生成完成后build目录找vs工程文件用vs打开它

同样的Debug和Release都要选一次生成一次,选下图片中pngfix生成

第二个真是艰难啊,搞定这个我卡了一个上午

第二个编译好了,开始第三个我们的主角

libharu-master

点Finish,报错后指定下面的目录

这里ZLIB_INCLUDE_DIR目录也是双路径

框中双目录防止找不到头文件

点Configure和Genarate提示上图框中信息就好了,打开build里面vs工程文件

同样的Debug和Release都生成一次,选hpdf生成

只要到了这里,编译就完成了,感谢其他分享编译经验的同学们!

下面附带一些知识分享,这些开源代码内带有demo,你所需要的都在这里,不用去找什么函数手册了,baidu上没有。

人家的函数说明在下载的地方有维基百科:Home · libharu/libharu Wiki · GitHublibharu - free PDF library. Contribute to libharu/libharu development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/libharu/libharu/wiki我在baidu上找半天,浪费时间。

libharu 默认计算大小的单位是磅,感谢下面链接的同学分享

libharu 使用的单位是磅_libharu 坐标单位-CSDN博客

libharu 错误编码对照表

Haru Free PDF Libraryicon-default.png?t=N7T8https://libharu.sourceforge.net/error_handling.html#User-defined_error_handler_

 后续碰到了中文乱码问题,困了我好几天,继续分享。

先讲 中文简体

    //设置CN Simple 中文简体 字符
    retStat = HPDF_UseCNSFonts(pdf);
    if (HPDF_OK != retStat)  { 	return NULL;  }
    //设置CN Simple 中文简体 编解码
    retStat = HPDF_UseCNSEncodings(pdf);
    if (HPDF_OK != retStat)  { 	return NULL;  }

 HPDF_UseCNSFonts 函数支持下面的字体,这是人家预设,可是人家源码没带这个字体,你需要下载一下字体到自己的设备上,如果找不到不好意思程序退出连pdf文件都不给你创建。

另一个函数启用解码 HPDF_UseCNSEncodings(pdf),这个函数不加载外部资源,只要上面的函数加载成功这个函数不会异常。

    pdffont=HPDF_GetFont(pdf,"SimSun","GB-EUC-H");//

 为什么这么写,SimSum是libharu自带的,格式是人家文档上写的

这段代码获取SimSum字体,编码格式GB-EUC-H,GB-EUC-H这东西是什么我找了很久

-------------------------------------------------------------------------------------------------------------------------

UniGB-UCS2-H,UniGB-UCS2-V,UniGB-UTF16-H,UniGB-UTF16-V,GB-EUC-H,GB-EUC-V,GBpc-EUC-H,GBpc-EUC-V,GBK-EUC-H,GBK-EUC-V,GBKp-EUC-H,GBKp-EUC-V,GBK2K-H,及GBK2K-V。

编码以-H结尾的,表示字体将会横向输出;以 –V结尾的,表示字体将会纵向输出。以Uni开头的是Unicode类编码,如果你的输入字符串是Unicode,则应选择此类编码。以GB开头的是CP936类编码,如果你的输入字符串是Code Page 936,则应选择此类编码 936就是gbk

原文

Acrobat 标准的简体中文字体 - - ITeye博客

 ------------------------------------------------------------------------------------------------------------------------------

只要这两条都弄好了,创建pdf文件应该是没问题了,可是我创建的pdf文件还是乱码。

我的环境是windows10 编译器qt

qt产生的代码文件存储格式默认是utf-8,而qt控制台输出默认是gbk,真尼玛奇怪,好恶心。

这就导致了我的代码上写中文文字是utf-8格式的,通过程序创建的pdf就用了utf-8格式的文字,而pdf文件用GB-EUC-H 解析,能解析出来才奇怪了。

网上很多人说用这行代码,告诉你没得用,还有qt编辑器里面改默认编码格式也是无效的

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));

我也是找ai转换了一下文字编码才发现的,你可以复制一下代码测试一下你的环境

    const char* str1="简体中文";
    char str[] = "\xce\xd2\xb5\xc4\xc4\xe3\xba\xc3\xca\xc0\xbd\xe7\x21"; // GBK编码
    std::cout <<str<<endl;
    HPDF_Page_TextOut (page1, 100, 300, str);

代码本身存储的是utf8格式,运行发现str变成了中文没有乱码,到了这里发现了问题所在,其他的就好解决了

我们把自己的代码在编辑器里面复制存储到txt编辑器内,把编辑器内的代码全删除了,保存,关闭已经打开的代码文件,修改编辑器默认编码格式,再把代码贴回去。

也可以用文本编辑器把源代码打开另存为,另存为有个选项选择编码格式,也能解决。

卡了两天,有些人说修改cmake文件加编译参数,有可能有效吧,我是没成功,其核心还是要搞明白你的操作系统默认编码,编辑器编码,生成文件的编码都有哪些,是否统一

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值