从头开始生成PDF,字形如何映射到字符代码?

从头开始生成PDF,字形如何映射到字符代码?,pdf,unicode,postscript,typesetting,Pdf,Unicode,Postscript,Typesetting,我想通过我的原始程序生成一个可移植文档格式(PDF)。 我将试验一个原始的排版程序,在开发过程中,我希望尽量避免使用外部工具和字体。 因此,最好避免使用XeTeX、LuaTeX和其他引擎。 我想在我的程序或库中内部存储字形信息。 但是PDF中应该在哪里指定字符代码,以便查看器程序知道何时复制或搜索这些字符? 要生成glyph,我最简单的方法是在本地库中保存与字符对应的光栅图像或Bézier曲线参数。 根据调查,这似乎是完全可能的。 我不喜欢为了我现在的目的而去刻字、结扎或其他美学上的优点,或者至

我想通过我的原始程序生成一个可移植文档格式(PDF)。 我将试验一个原始的排版程序,在开发过程中,我希望尽量避免使用外部工具和字体。 因此,最好避免使用XeTeX、LuaTeX和其他引擎。 我想在我的程序或库中内部存储字形信息。 但是PDF中应该在哪里指定字符代码,以便查看器程序知道何时复制或搜索这些字符?

要生成glyph,我最简单的方法是在本地库中保存与字符对应的光栅图像或Bézier曲线参数。 根据调查,这似乎是完全可能的。 我不喜欢为了我现在的目的而去刻字、结扎或其他美学上的优点,或者至少可以在以后处理

最初,我想我可以生成一个Postscript,并使用Ghostscript将其转换为PDF。 但有人指出Postscript不支持Unicode,我肯定会使用Unicode。 然后,我的选项被简化为从头开始直接生成PDF

我的困惑是,尽管我的暴力方法可能会正确呈现,但我猜生成的PDF将导致查看者无法复制或搜索,因为我不会指定任何字符代码

在PDF参考文件p.122中,我们看到有几个不同的对象。 似乎相关的是文本对象、路径对象和图像对象

是否可以将图像对象与其字符代码关联? 我记得,有一些扫描过的PDF,例如谷歌图书扫描的自由预览部分,你可以在其中正确复制字符串。 指定的方法或字段是什么? 然而,我认为在PDF参考后面的各种表中,没有适合Unicode代码的槽

类似地,还不清楚如何将路径对象与其字符代码相关联。 如果能做到这一点,设想中的项目将是最简单的,因为我只是提取了一些开源字体的贝塞尔曲线参数(我相信可以做到),然后自己将其转换为允许的PDF格式

如果图像对象和路径对象都不可能保存字符代码,那么我得出结论,文本对象(显然)更适合与字符代码一起表示glyph。 也许更正确的方法是在PDF中嵌入在运行时合成的自定义字体。 这在第364页第2节中口头和简要地提到。5.8,“嵌入式字体程序”。 这看起来确实相当困难,需要大量的研究。 我想你推荐一些嵌入字体的教程,它们不容易找到。 事实上,我发现示例性PDF文件本身已经很少了,因为它们中的大多数似乎都是LZ压缩的二进制文件(我猜)。 事实上,我试图用非计算机现代字体编译一个“Hello world”PDF,并用文本编辑器打开,我看到的只是空白、控制字符和类似Mojibake的字符串

总之,我如何(如果可能的话)通过文本对象、图像对象或路径对象来表示glyph,以便可以知道字符代码?
为了具体起见,您能否生成一个PDF,以便:显示一个圆,但当您复制该圆时,您复制了字符“a”?曲线和字符代码之间的关联是字体。有几个表参与了映射。字体有一个
编码
向量,该向量由字符代码索引并生成字形名称。要从文档中复制,还必须有一个映射到unicode代码点的
ToUnicode
向量

如果您学习PostScript Type 3字体的一个简单示例,这将对理解PDF字体非常有益。我有一个短的


要回答粗体问题,如果将
gridcal.ps
转换为pdf,复制
moon
字形将导致字符
1
,因为它在编码向量中处于
1
的ascii位置。Ghostscript可以识别其他一些标志符号,尤其是
太阳
火星
维纳斯
,这会生成到Unicode字符的映射。这是非常聪明的,但可能还不够广泛(事实上,
moon
mercury
jupiter
saturn
都不被识别)。

正如我所说,Postscript可能不支持Unicode(或者是吗?)。是否有一些PDF示例中定义了字体以便我学习?PostScript可以处理Unicode所需的大部分内容。但它本机缺少宽字符串。它可以用来将utf8解码为代码点,但PostScript是在一个稍微不同的生态系统中发展起来的,我认为更常见的是为特定文档定义自定义8位编码(基于使用的实际字符)。因此,我的postscript字体没有ToUnicode向量,但除此之外,它拥有PDF版本所需的所有数据。我不敢相信,但从PDF版本复制适用于某些字形:☼. 鬼脚本不知怎的识别出一些字形名称♀ 并为它们创建ToUnicode条目。♂ (复制自)无法指定UTF-8编码,因为UTF-8是可变长度方案。字体中的字符代码(与CIDFont相反)正好是1字节。您可以创建映射到UTF-8的ASCII集的编码,但不能在简单字体中使用2字节代码。为了使用超过1字节的字符代码(PDF格式),必须使用CIDFont。这是一项更复杂的任务。如果您使用的是PostScript,您可以利用它是一种编程语言的优势,使用代码将字符代码映射到多种字体和简单的1字节代码,但在PDF.NB中不可以,您也不能将ToUnicode CMap添加到PostScript字体中!有一个