emf文件在linux使用inkscape, libemf2svg libuemf poi读取中文乱码问题分析

       emf使用unicode保存其中文字,规范中说明使用utf16le,在linux上使用inkscape打开文件时发现文字乱码,图像正确,文件在window上画图打开正确,使用libemf2svg转换为svg后,svg里面也是乱码,使用libuemf(图1)读取内容时也是乱码,猜测字体或者编码问题,libuemf代码中发现如果使用unicode的话,先转utf8,设断点查看内存,对应的内容无论使用utf8 utf16 gbk解码都不对,查看emf规范,发现text对象存在flag(图2 图3 图4)字段,关于ETO_GLYPH_INDEX标志微软官网说明是ETO_GLYPH_INDEX: This bit indicates that the codes for characters in an output text string are indexes of the character glyphs in a TrueType font. Glyph indexes are font-specific, so to display the correct characters on playback, the font that is used MUST be
identical to the font used to generate the indexes.说明文字中使用的index而不是文字对应的编码,这个是window系统特有,linux上的inkscape和libuemf没有ETO_GLYPH_INDEX这个的实现,所以在转码时把index当作utf16进行解码,因此出现乱码

11ef54f7f2df4385a04b6a2285a0f847.png

图1

707d387f66174acfba5fd271d87fea15.png

图2
 

8d27ad2c88b740358e671aacfcec8635.png

图3

a90ae946ab7c4b539b664a4b67b74bfc.png

图4

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Linux下可以使用libemfEMF文件转换成PNG格式。libemf是一个开源的EMF文件解析库,它提供了一个API,可以在Linux系统下读取和解析EMF文件,并将其转换为其他格式。用户可以使用libemf库来开发自己的EMF文件转换工具或者将其集成到其他应用程序中。同时,libemf库也支持在Windows和Mac OS X系统中使用。 以下是一个使用libemf库将EMF文件转换成PNG格式的简单示例程序: ```c++ #include <stdio.h> #include <emf/emf.h> #include <cairo/cairo.h> #include <cairo/cairo-image.h> int main(int argc, char** argv) { if(argc < 2) { printf("Usage: %s <emf_file> <png_file>\n", argv[0]); return 1; } const char* emf_file = argv[1]; const char* png_file = argc > 2 ? argv[2] : "output.png"; emf_t* emf = emf_open(emf_file); if(!emf) { printf("Failed to open EMF file: %s\n", emf_file); return 1; } int page_count = emf_get_page_count(emf); printf("EMF file has %d pages\n", page_count); for(int i = 0; i < page_count; i++) { emf_page_t* page = emf_get_page(emf, i); if(!page) { printf("Failed to get page %d\n", i); break; } cairo_surface_t* surface = cairo_image_surface_create_for_data(page->data, CAIRO_FORMAT_ARGB32, page->width, page->height, page->stride); cairo_surface_write_to_png(surface, png_file); cairo_surface_destroy(surface); emf_destroy_page(page); } emf_close(emf); return 0; } ``` 这个程序会读取命令行参数中指定的EMF文件,并将其转换为PNG格式进行保存。要编译这个程序,需要使用libemf库和cairo库,命令行如下: ``` gcc -o emf2png emf2png.c -lemf `pkg-config --cflags --libs cairo` ``` 其中,`emf2png.c`是上述代码保存的文件名,`-lemf`参数告诉编译器链接libemf库,`pkg-config --cflags --libs cairo`命令告诉编译器链接cairo库。 运行程序时,需要将EMF文件名和PNG文件名作为命令行参数传入,例如: ``` ./emf2png example.emf output.png ``` 这个程序会将EMF文件内容转换为PNG格式,并保存到指定的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值