PDFLib (8.0.2)中文路径处理使用UTF8

来源:互联网 发布:网络机柜安装规范 编辑:程序博客网 时间:2024/06/05 02:20

在PDFLib中,打开一个PDF文档,会调用PDF_begin_document,文件名称是以Unicode编码的,由于工程是多字节编码,打算转成UTF8 

定义:int PDF_begin_document(PDF *p, const char *filename, int len, const char *optlist)

C++ Java int begin_document(String filename, String optlist)

参数说明
filename (名称字符串,但只在 Windows 上支持 Unicode 文件名)将生成 PDF 输出文件的绝对或相对文件名。如果 filename 为空,则将在内存中生成 PDF 文档,而不创建文件,因而只能从客户端通过 PDF_get_buffer( ) 函数来获取生成的 PDF 数据。特殊文件名 »–« 可用来在 stdout 通道上生成 PDF。在 Windows 上,可以使用 UNC 路径或映射网络驱动器。
len (仅用于 C 语言绑定)UTF-16 字符串的 filename 长度(以字节为单位)。如果 len=0,则必须提供以 null 终结的字符串。optlist 选项列表,根据表 2.3 指定文档选项。PDF_end_document( ) 中指定的选项优先于PDF_begin_document( ) 中指定的相同选项。可以使用下列选项:
附件、autoxmp、compatibility、destination、errorpolicy、flush、groups、hypertext-encoding、
inmemory、labels、lang、linearize、master- password、metadata、moddate、openmode、
optimize、pagelayout、pdfa、pdfx、permissions、recordsize、search、tagged、tempdirname、

temp-filenames、uri、user-password、viewer-preferences。

多字节转UTF8 网上很多 例如:

void ConvertGBKToUtf8(std::string& amp, std::string strGBK){ int len=MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK.c_str(), -1, NULL,0); unsigned short * wszUtf8 = new unsigned short[len+1]; memset(wszUtf8, 0, len * 2 + 2); MultiByteToWideChar(CP_ACP, 0, (LPCSTR)strGBK.c_str(), -1, (LPWSTR)wszUtf8, len); len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL); char *szUtf8=new char[len + 1]; memset(szUtf8, 0, len + 1); WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL); //strGBK = szUtf8; amp=szUtf8;delete[] szUtf8; delete[] wszUtf8; }


研究发现,UTF8前面需要加BOM(Byte Order Mark,就是字节序标记)

UTF- 8编码的文件中,BOM占三个字节。字节标记序为 EF BB BF

上面转换来的string 还要在前面加上3个字节,为了简单,两个字符串拼接起来,这样就可以处理中文的

char Bom[4]={0xEF,0xBB,0xBF,0};filenameBom=Bom;filenameBom=filenameBom+filename;PDF_begin_document(p,filenameBom.c_str(),0, ""); 


0 0
原创粉丝点击