我正在尝试计算矢量PDF中每个文本字形的精确边界框。
这包括跟踪CTM,绘制/定位PDF指令等,还要计算“字形空间”中每个特定字形的边界(使用嵌入字体中GLYF表中的信息)。
我意识到PDF FontDescriptor包含每个嵌入字体的粗略边界框,但这是字体中所有字形的合成 - 即,适合字体中所有字形的最小边界框。为了我的目的,我需要更精确的定位。
我的具体应用是从乐谱的矢量PDF中提取音乐语义。因此,一个很好的约束是我可以假设字形不是在同一个Tj / TJ运算符中绘制在一起的。每个字形都是独立绘制的。
另外,请注意我将边界框定义为“可以包含字形的所有绘制部分的最小框”。没有必要忽略ascenders / descenders / etc.这可能被认为是在其他应用程序的边界框“之外”。
这里有许多移动部件,我发现它很难调试。所以这就是我喜欢的帮助:
'&' ( 57.2799755477664, 600.7092061684704, 86.7452642315424, 677.1570718099680)
'\u02d9' ( 82.0030393188000, 633.6851606704608, 96.3090818379936, 644.6969866323168)
'\u0153' (144.7841941848000, 623.9630080194528, 158.6735558539200, 634.5581702962656)
'\u0153' (181.6778111184000, 619.0027260546528, 195.5671727875200, 629.5978883314656)
'w' (226.1671727148000, 611.3638918288608, 245.0765465300448, 622.3161944071392)
'w' (320.1063822180000, 631.2050196880608, 339.0157560332448, 642.1573222663392)
'\u0153' (414.0455917212000, 641.3239948962528, 427.9349533903200, 651.9191571730656)
'\u0153' (450.9392086548000, 636.3637129314528, 464.8285703239200, 646.9588752082656)
'\u0153' (487.9878407856000, 631.4034309666528, 501.8772024547200, 641.9985932434656)
'\u0153' (524.8814577192000, 628.9232899842528, 538.7708193883200, 639.5184522610656)
你是如何计算这些职位的? (鉴于PDF的复杂性,我意识到这一点有很多问题。)进行演练将是一个巨大的帮助,我相信它将来会对其他人有所帮助。
是否有现成的工具?
答案 0 :(得分:4)
我认为获得真正准确信息的唯一方法是实际渲染给定点大小的字形并收集结果位图的范围。
即使提取描述字形的路径也不会给你完全准确的信息,因为提示可以巧妙地(或者在某些情况下,不那么巧妙地)改变字形的呈现方式。无论如何,提取路径与渲染位图一样多,可能更多......
PDF中广泛使用三种字体:
您可以使用FreeType从PostScript和TrueType轮廓的字体渲染字形(如果您更愿意使用它,也可以让它返回路径)。
用户定义的(类型3)字体,您必须将其视为一系列PDF操作,并按文本矩阵进行缩放。所以你需要自己做。
请注意,字体可以通过两种方式组织,常规字体和CIDFonts,以及获取字符代码对应的字形数据的方法在两者之间有所不同,但我认为您已经准备好在你现有的代码。
在您的情况下,您可能有一个限制您可能会看到的字体种类的工作流程,因此您可能不需要完全实现所有这些。例如,我看到您正在使用带有TrueType轮廓的CIDFonts,但CIDToGIDMap是<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupModules<groupId>
<artifactId>module-b</artifactId>
<name>Module B</name>
<dependencies>
<!-- single dependency to the shared-dependencies pom instead of multiple dependencies -->
<dependency>
<groupId>shared-dependencies-group</groupId>
<artifactId>shared-dependencies</artifactId>
<version>1.0</version>
<scope>compile</scope>
<type>pom</type>
</dependency>
</dependencies>
,这减少了问题的范围。
为了增加复杂性,您需要考虑代表“边界框”的内容。你的字形。您是否认为前进宽度和左侧承载是边界框的一部分,或仅仅是标记的区域?
请记住,PDF可以为字体中指定的字形指定不同的宽度,并且两种字体都包含/Identity
数组,这些数组可以修改字体中定义的宽度。
如果您将左侧承载和前进宽度视为字形的一部分,但是如果/W
数组的值小于前进宽度,则可能会出现两个字形“&#39;碰撞&#39;,但实际上它们之间仍有空白区域。所有/Widths
所做的就是从提前宽度减少空白区域,以使字形比通常情况更接近。
我使用/Widths
进行了快速反击,并给出了答案:
MuPDF
为了完整起见,使用带有<span bbox="39.21884 163.68216 42.53509 163.99687" font="PlantinMTStd-Regular" size="11.935925">
<char bbox="39.21884 163.68216 42.53509 163.99687" x="39.21884" y="163.99687" c=" "/>
<span bbox="57.200607 163.69899 73.08967 165.2394" font="OpusStd" size="19.841537">
<char bbox="57.200607 163.69899 73.08967 165.2394" x="57.200607" y="165.2394" c="&"/>
<char bbox="82.003044 151.29828 90.63545 152.83868" x="82.003044" y="152.83868" c="˙"/>
<char bbox="144.7842 161.21884 153.1744 162.75925" x="144.7842" y="162.75925" c="œ"/>
<char bbox="181.67781 166.17912 190.06801 167.71953" x="181.67781" y="167.71953" c="œ"/>
<char bbox="226.16718 173.61955 236.8826 175.15996" x="226.16718" y="175.15996" c="w"/>
<char bbox="320.10638 153.77843 330.8218 155.31883" x="320.10638" y="155.31883" c="w"/>
<char bbox="414.0456 143.85785 422.4358 145.39825" x="414.0456" y="145.39825" c="œ"/>
<char bbox="450.9392 148.81815 459.3294 150.35855" x="450.9392" y="150.35855" c="œ"/>
<char bbox="487.98785 153.77843 496.37805 155.31883" x="487.98785" y="155.31883" c="œ"/>
<char bbox="524.8815 156.25856 533.27167 157.79897" x="524.8815" y="157.79897" c="œ"/>
的{{1}}设备,来自Ghostscript的信息相同:
txtwrite
看起来确实存在一个错误,但是char bbox中的urx值不正确,但是在span bbox中是正确的。
答案 1 :(得分:3)
您可能还想查看此Adobe GitHub存储库:
afdko
子目录包含许多命令行工具,可用于测试,检查和转换字体文件。我使用了此回购邮件中的tx
工具,以便从PDF sample打印一些有关mutool extract
提取的字体文件的信息:
$ mutool extract pdf_example.pdf
extracting font QNAAAA+PlantinMTStd-Regular-0013.ttf
extracting font QSAAAA+OpusStd-0018.ttf
然后:
$ tx -mtx QSAAAA+OpusStd-0018.ttf
tx: --- QSAAAA+OpusStd-0018.ttf
tx: (ttr) cmap table missing
### glyph[tag] {gname,enc,width,{left,bottom,right,top}}
glyph[0] {.notdef,-,0,{0,0,0,0}}
glyph[1] {g1,-,1640,{4,-1313,1489,2540}}
glyph[2] {g2,-,891,{0,-276,721,279}}
glyph[3] {g3,-,866,{0,-266,700,268}}
glyph[4] {g4,-,1106,{0,-276,953,276}}
也许这个,或者这个仓库中的其他28个命令行工具之一,也可能对你有用......