Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C PDF内容流中的各种图示符是如何编码的?_C_Pdf_Encoding_Utf 8_Fonts - Fatal编程技术网

C PDF内容流中的各种图示符是如何编码的?

C PDF内容流中的各种图示符是如何编码的?,c,pdf,encoding,utf-8,fonts,C,Pdf,Encoding,Utf 8,Fonts,我正在开发一个输出PDF文档的程序。给定一系列UTF-8编码字符和用于呈现该字符的字体名称,我想展示构成文档实际内容的相应字形。我希望能够展示民族特征,如čorö。支持像ae或ffi这样的韧带会很好 问题是,我不知道如何指定要显示的实际glyph(例如,在内容流中) 例如,如果我想显示字符串“helloworld”,我不需要担心编码,我只需编写(helloworld)Tj。然后,PDF阅读器将使用适当的字体呈现此字符串 但是如果我想展示这条线呢 很难整天阅读PDF规范。普罗斯特·多契斯塔·尼莫·

我正在开发一个输出PDF文档的程序。给定一系列UTF-8编码字符和用于呈现该字符的字体名称,我想展示构成文档实际内容的相应字形。我希望能够展示民族特征,如čorö。支持像ae或ffi这样的韧带会很好

问题是,我不知道如何指定要显示的实际glyph(例如,在内容流中)

例如,如果我想显示字符串“helloworld”,我不需要担心编码,我只需编写
(helloworld)Tj
。然后,PDF阅读器将使用适当的字体呈现此字符串

但是如果我想展示这条线呢 很难整天阅读PDF规范。普罗斯特·多契斯塔·尼莫·奈 使用给定字体中的连字ffi、fi和ea以及捷克国家符号ě、ě和ě,我将如何继续

我正试图通过PDF规范,但这并不容易

  • 如何找出与给定字符或连字对应的“字形代码”
  • 该代码如何在PDF内容流中编码
非常感谢你的帮助


编辑:我可能高估了这个问题。计算显示“通用欧洲文档”所需的字形,我想不出这个数字怎么会超过256。如果我的假设是正确的,我可以完全重新映射字体的编码。这应该足以涵盖拉丁字母表的所有常见符号、数字、标点符号、常见符号,如
[
),但我仍然有足够的空间容纳国家符号、连字和其他高质量排版元素。(如果字形总数超过256,我可以实现优先级队列来选择使用最多的连字。)

尽管如此,我认为我不需要使用CID键控字体

我仍然在思考如何将UTF-8编码字符映射到任意字体的字形上。我有可用的字体AFM。例如,对于DejaVu字体,字符信息如下所示:

C 63 ; WX 536 ; N question ; B 67 -15 488 743 ;
C 64 ; WX 1000 ; N at ; B 65 -174 930 705 ;
C 65 ; WX 722 ; N A ; B -6 0 732 730 ;
13 0 obj << 
    /BaseFont /DejaVuSansCondensed 
    /DescendantFonts [ 4 0 R  ]
    /ToUnicode 14 0 R 
    /Type /Font 
    /Subtype /Type0 
    /Encoding /Identity-H 
>>
endobj
但映射第256个字符后,代码为
-1

C 255 ; WX 564 ; N ydieresis ; B -3 -223 563 767 ;
C -1 ; WX 722 ; N Amacron ; B -6 0 732 899 ;
C -1 ; WX 596 ; N amacron ; B 49 -15 568 746 ;

例如,如果我有序列
11100010 1000010 10101100
(欧元符号)在我的输入中,我如何知道它对应的字形名称,以便在
/Encoding
字典中映射它?

编码根据字体类型而变化。通常,有一个字体资源定义为当前字体,在该字体字典中是对基本字体的引用和描述编码的方法(通过
/Encoding
键)。如果该键不存在,编码将为“标准”,但您可以使用其他简单编码,如
/MacRoman
/WinAnsi
作为编码值,或者您可以指定标准编码和编码增量来显示差异

到目前为止很简单-只要你使用8位字符。对于许多早期的应用程序,它们会创建两种不同的字体,一种是罗马编码,另一种是将罗马字符映射到不可用的字符。为此,编码增量将包括对连字和其他典型的非编码符号的引用。这对于类型1字体非常有效,但TrueType字体部分的规范特别禁止:

非符号字体应指定MacRomanEncoding或WinAnsienceODing作为其编码项的值,且数组中没有差异

当您想使用Unicode时,情况就大不相同了。在这种情况下,您将使用CID字体(基于字符ID的字体)。在这种情况下,字体引用了一个过程,用于将字符串中的字符编码映射到字体中的字符ID(反之亦然)。我强烈建议您阅读并充分理解PDF规范中关于复合字体的第9.7节,该节描述了将UTF16BE编码为字符串以使其在PDF中正确呈现所需的所有内容。这绝对不是一件小事,因为如果遗漏了大量细节,将导致呈现为空白杂技演员的年龄

作为一名专业编写生成和使用PDF的代码的软件工程师,请允许我声明,当我被要求在代码中放入特殊情况以处理不符合规范的PDF时,我的一小部分就死在里面了。请,请,在通过预测试之前,不要考虑将您生成的任何文档发布到野外至少是飞行。这与“Acrobat渲染它,所以它必须是正常的”不同让我给你举个例子-我在野外看到了很多文件,其中包括缺少FontDescriptor字典关键元素的字体,包括
/Ascent
/Descent
/CapHeight
,等等。这些文件在Acrobat中呈现,但由于每个都是必需的,因此违反了规范。我知道如何使用Acrobatrobat处理这个问题——它有一个庞大的字体度量数据库,如果在文件中找不到它,它会查找值(见鬼,它甚至可能忽略文件中的度量)。我没有那种奢侈,所以我必须做一些(可能昂贵/无效)权宜之计

你可能想考虑使用一个库来为你做这项工作——也许ITEXT有一个足够好的教育许可方案,因为我知道了,你是一个学生。也有一些基于C的库。也许你可以想出一个方法让GoScript实现你的命令。 如果您不愿意或无法按照我的建议遵守规范或使用表面上遵守规范的库,请至少帮我填写

/Creator

BT /U0 24 Tf 72 670 Td 
(\000G\000r\000e\000e\000k\000:\000 \003\223\003\265\003\271\003\254\000 \003\303\003\277\003\305\000 \003\272\003\314\003\303\003\274\003\277\003\302) 
Tj ET
13 0 obj << 
    /BaseFont /DejaVuSansCondensed 
    /DescendantFonts [ 4 0 R  ]
    /ToUnicode 14 0 R 
    /Type /Font 
    /Subtype /Type0 
    /Encoding /Identity-H 
>>
endobj
/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 beginbfrange <0000> <FFFF> <0000> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end
4 0 obj << 
    /Subtype /CIDFontType2 
    /Type /Font 
    /BaseFont /DejaVuSansCondensed 
    /CIDSystemInfo 7 0 R 
    /FontDescriptor 8 0 R 
    /DW 1000 
    /W 9 0 R 
    /CIDToGIDMap 10 0 R 
>>