PDF格式解析:使用CID、CMAP定义字符映射

bash 复制代码
/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
10 beginbfchar
<0003> <0020>
<0004> <0021>
<0005> <0022>
<002B> <0048>
<0047> <0064>
<0048> <0065>
<004F> <006C>
<0052> <006F>
<0055> <0072>
<005A> <0077>
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end

这段代码是PDF文件中的一个CMAP(Character Map)定义片段。CMAP是PDF中用于将字符代码映射到字形(Glyphs)的重要部分,特别是当处理非标准字符集或特殊字体编码时。

这段代码做了以下几件事情:

  1. 初始化CMAP

    复制代码
    /CIDInit /ProcSet findresource begin
    12 dict begin
    begincmap

    这里首先通过findresource找到名为CIDInit的资源,并开始定义一个包含12个条目的字典,然后开始一个新的CMAP定义。

  2. 定义CID系统信息

    复制代码
    /CIDSystemInfo <</Registry (Adobe) /Ordering (UCS) /Supplement 0>> def

    这里定义了CID系统的信息,包括注册机构(Adobe)、排序方式(UCS,即统一字符集)和补充码(0)。

  3. 定义CMAP名称

    复制代码
    /CMapName /Adobe-Identity-UCS def

    这行代码定义了CMAP的名称,这里是Adobe-Identity-UCS

  4. 定义CMAP类型

    复制代码
    /CMapType 2 def

    CMAP类型2通常表示这是一个基于字符代码到CID的直接映射的CMAP。

  5. 定义字符空间范围

    复制代码
    1 begincodespacerange
    <0000> <FFFF>
    endcodespacerange

    这里定义了字符代码的范围,从0000FFFF,即覆盖了整个16位字符代码空间。

  6. 定义字符到CID的映射

    复制代码
    10 beginbfchar
    <0003> <0020>
    <0004> <0021>
    ...
    <005A> <0077>
    endbfchar

    这部分定义了10个字符代码到CID的直接映射。例如,字符代码0003映射到CID0020,字符代码0004映射到CID0021,以此类推。

  7. 结束CMAP定义

    复制代码
    endcmap
    CMapName currentdict /CMap defineresource pop end end

    这部分代码结束了CMAP的定义,并将它定义为一个资源。defineresource操作定义了这个资源,pop操作移除了资源定义栈顶的元素,最后的end操作结束了初始的字典和CIDInit资源的定义。

这个CMAP定义片段可能是为了支持某种特定的字体或字符集,它确保当PDF阅读器解析到这些特定的字符代码时,能够正确地映射到相应的字形,从而正确显示文本内容。

bash 复制代码
endcmap CMapName currentdict /CMap defineresource pop

在PDF文件的上下文中,CMapName currentdict /CMap defineresource pop 这行代码的作用是定义一个新的资源,并将之前定义的CMAP对象与该资源名关联起来。下面是对这行代码的详细解释:

  1. CMapName

    这是一个之前已经定义过的名字,代表CMAP对象的名称。在你提供的代码片段中,CMapName 被定义为 /Adobe-Identity-UCS

  2. currentdict

    这是一个PDF指令,它引用当前字典。在你的代码片段中,这个当前字典应该是通过 12 dict begin 开始的那个包含12个条目的字典。

  3. /CMap

    这是当前字典中要添加的键的名称。这个键将指向你定义的CMAP对象。

  4. defineresource

    这是一个PDF操作符,用于在PDF文件中定义一个资源。资源可以是字体、颜色空间、CMAP等,它们可以被PDF页面或其他对象引用。在这个情况下,它用于定义一个新的CMAP资源。

  5. pop

    这个操作符用于从栈中移除顶部的元素。在这里,它通常用于移除defineresource操作后留在栈上的资源对象句柄。

综上所述,这行代码的作用是将之前定义的CMAP对象(通过其名称CMapName引用)添加到一个资源字典中,并将其标记为一个名为/CMap的资源。这样,PDF阅读器在处理文本时就可以引用这个CMAP资源,以正确地将字符代码映射到字形。

在完整的PDF文件中,这样的资源定义通常出现在对象的定义部分,并且之后可能会被页面内容或其他对象引用,以确保文本的正确渲染。

相关推荐
新老农3 小时前
php数据导出pdf,然后pdf转图片,再推送钉钉群
pdf·php·钉钉
琉璃℡初雪5 小时前
vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件
vue.js·pdf·excel
一个懒鬼9 小时前
Edge浏览器打开PDF文件显示空白(每次需要等上一会)
windows·pdf
Lauren_Lu18 小时前
pdf 不是扫描件,但却无法搜索关键词【问题尝试解决未果记录】
pdf
Python猫1 天前
付费专栏·Python潮流周刊电子书合集(epub、pdf、markdown)下载
python·计算机·pdf·电子书·资料
JackieZhengChina1 天前
用python清除PDF文件中的水印(Adobe Acrobat 无法删除)
pdf
geovindu1 天前
vue3: pdf.js 3.4.120 using javascript
开发语言·javascript·vue.js·pdf
TextIn智能文档云平台2 天前
PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!
图像处理·人工智能·算法·自然语言处理·pdf·ocr
old_power2 天前
【Python】PDF文件处理(PyPDF2、borb、fitz)
python·pdf
belldeep2 天前
vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例
javascript·pdf·pdfjs-dist·pdf.worker