libharu中的utf8:确实需要嵌入字体吗?

时间:2019-06-03 08:44:51

标签: c++ utf-8 libharu

我正在尝试在编写的PDF文件中支持尽可能多的Unicode。我希望能够输出utf8字符串并使它们在PDF中正确显示。

我在libharu编码文档(https://github.com/libharu/libharu/wiki/Encodings中看到,我可以访问许多单字节代码页,如果需要中文,日文和韩文,则可以使用特殊功能访问多字节代码页。但是我的理解是,如果我想使用所有这些页面和函数来编写任意的utf8字符串,那么我必须编写一堆代码将utf8字符串分解为每个都使用特定代码页的段,然后执行无需进行任何代码页交换,在输出之前,将我的每个段从utf8反向映射到给定的代码页。与只能说“写这个utf8字符串”相比,这似乎是很多容易出错的工作。

为了能够编写utf8字符串,我正在使用以下代码:

myPdf = HPDF_New( PdfErrorHandler, NULL );
HPDF_UseUTFEncodings( myPdf );
HPDF_SetCurrentEncoder( myPdf, "UTF-8" );
const char *f = HPDF_LoadTTFontFromFile( myPdf, "path/to/verdana.ttf", HPDF_TRUE );
HPDF_Font myFont = HPDF_GetFont( myPdf, f, "UTF-8" );
... go on to use myFont to write various text strings

那行得通,我可以编写带有重音拉丁字符,西里尔字母和希腊字符的utf8字符串,并且它们可以在PDF中正确显示。

但是,由于我使用了HPDF_TRUE来将字体嵌入文件中,因此大大增加了文件的大小。实际上,我使用的是四种字体(verdana.ttf,verdanab.ttf,verdanai.ttf和verdanaz.ttf),与我使用“内置” libharu时相比,它们增加了60万以上的文件大小。字体(文件很小,只有几千个)。

(我确实尝试过使用HPDF_FALSE来不嵌入字体,但是我的文件使用随机的拉丁字符打开。)

我试图从概念上理解为什么如果我使用的像verdana这样的字体无论如何都将要出现在最终用户的系统上,为什么必须在我的PDF中嵌入字体。 (我什至不在乎它是否为verdana,任何标准的sans serif字体都可以。)我当然已经通过其他方式(例如,从Word导出)创建了许多包含希腊语,西里尔字母,中文和其他字符的PDF文件。 ,但它们很小。那么,嵌入使用utf8要求只是libharu的怪癖吗?

此外,即使有60万个批量文件,我使用libharu制作的文件仍将汉字显示为块。我在libharu文档页面上看到,libharu仅支持一字节和两字节的utf8序列,该序列包括除中文,日文和韩文之外的大多数内容。那么这是否意味着我要嵌入verdana.ttf,其中大多数是中文,日文和韩文字形,而我什至无法访问它们?

无论如何,中文,日文和韩文对于我当前的应用程序并不重要,但是对于两个字节的utf8序列,我试图了解是否有办法让我在libharu中使用它们而不必在我的文件中嵌入大字体。

1 个答案:

答案 0 :(得分:0)

对于 PDF 规范,如果您不嵌入字体,则符合标准的阅读器将尝试从用户系统加载相同的字体。

如果没有找到,那么它会回退并尝试用另一种字体显示该字符。如果替换字体在编码位置没有对应的字符,则该位置会出现不可预知的字符。

始终建议嵌入一个子集,除非您希望允许用户编辑您的文档,这对于 PDF 文档来说是一个罕见的用例。