1

我正在尝试在我正在编写的 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 时相比,它们使我的文件大小增加了 600k 以上字体(使文件很小,只有几 k)。

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

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

另外,即使有 600k 的体积,我用 libharu 制作的文件也将汉字显示为块。我在 libharu 文档页面上读到 libharu 仅支持一个和两个字节的 utf8 序列,其中包括除中文、日文和韩文之外的大部分内容。那么这是否意味着我正在嵌入verdana.ttf,其中大部分是中文、日文和韩文字形,我什至无法访问它们?

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

4

1 回答 1

0

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

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

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

于 2021-02-12T15:38:23.570 回答