2015-05-04 42 views
2

我正試圖計算矢量PDF中每個文本字形的確切邊界框。精確的PDF中字形的邊界框?

這包括跟蹤CTM,繪製/定位PDF指令等,還計算「字形空間」(使用來自嵌入字體中GLYF表的信息)中每個特定字形的邊界。

我意識到PDF FontDescriptor包含每個嵌入字體的粗略邊界框,但這是字體中所有字形的組合 - 即適合字體中所有字形的最小邊界框。爲了我的目的,我需要更精確的定位。

我的具體應用提取樂譜的矢量PDF音樂語義。因此,一個很好的約束是我可以假設字形不是在同一個Tj/TJ運算符中繪製在一起的。每個字形都是獨立繪製的。

而且,請注意,我定義邊框爲「可以包含字形的全部取材部位最小的盒子。」沒有必要忽略上行/下行/等。這可能被認爲是在其他應用程序的邊界框「外部」。

很多移動部件在這裏,我發現它很難調試。所以這裏是我最喜歡的幫助:

  1. This example PDF I've created有10個字形。設備空間中這10個字形的「基本事實」邊界框定位是什麼?我目前的代碼產生以下內容,但這是不正確的。我知道這是不正確,因爲它說的第一個字形(」 &‘)水平相交的第二(’\ u02d9" ),你可以看到當您查看PDF閱讀器PDF格式是不正確的。
'&'  (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的複雜性,我意識到這是一個很重要的問題)。這將對演練有巨大的幫助,我相信這對將來的其他人會有幫助。

  • 是否有一個工具,這是否下架?

  • +1

    恐怕** A ** PDF說明書中的描述已經相當不錯了。您可能想要提出具體問題或分享您的(整理)代碼進行分析,而不是等待某人重新制定規範。而** B **你的起始位置看起來不太遠(差異可能是由於目標座標系或選定的起始點不同),但是你從這些座標系跨出的矩形看起來很奇怪。 – mkl

    回答

    4

    我相信獲得真正準確的信息的唯一方法是實際渲染給定點大小的字形並收集得到的位圖的範圍。

    即使提取描述字形路徑不會給你完全準確的信息,因爲暗示可以巧妙地(或在某些情況下,不那麼巧妙地)改變字形呈現方式。在任何情況下提取的路徑是一樣多的工作,甚至更多,渲染位圖.....

    有廣泛的三類字體的PDF格式:

    1. 字體以PostScript概要
    2. 使用TrueType字體輪廓
    3. 用戶定義的字體。

    您可以使用FreeType來使用PostScript和TrueType輪廓渲染字體的字形(如果您願意使用它,也可以讓它返回路徑)。

    用戶定義的(類型3)字體必須視爲一系列PDF操作,由文本矩陣縮放。所以你需要自己做。

    請注意,字體可以按照2種方式組織,常規字體和CIDFonts,以及獲取與字符代碼對應的字形數據的方法在兩者之間不同,但我認爲您已經準備好在您的現有的代碼。

    在您的情況下,您有可能會限制您可能看到的字體種類的工作流程,因此您可能不需要全部實現所有這些。例如,我看到您正在使用帶有TrueType輪廓的CIDFonts,但CIDToGIDMap爲/Identity,這可以減少問題的範圍。

    爲了增加複雜性,您需要考慮代表字形的「邊界框」。你認爲前進寬度和左側軸承是包圍盒的一部分,還是隻考慮標記的區域?

    請記住,PDF可以爲字形指定不同的寬度,以符合在字體中定義的寬度,並且您的字體都包含/W數組,用於修改字體中定義的寬度。

    如果考慮到左側軸承和前進寬度作爲字形的一部分,但其數值小於提前寬度,則可能是兩個字形會「碰撞」,但實際上仍然存在它們之間有空白區域。所有/Widths所做的工作是從前進寬度減少空白,以使字形比正常情況更接近。

    我在此使用MuPDF快速的bash這給了答案:

    <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="&amp;"/> 
    
    <char bbox="82.003044 151.29828 90.63545 152.83868" x="82.003044" y="152.83868" c="&#x2d9;"/> 
    
    <char bbox="144.7842 161.21884 153.1744 162.75925" x="144.7842" y="162.75925" c="&#x153;"/> 
    
    <char bbox="181.67781 166.17912 190.06801 167.71953" x="181.67781" y="167.71953" c="&#x153;"/> 
    
    <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="&#x153;"/> 
    
    <char bbox="450.9392 148.81815 459.3294 150.35855" x="450.9392" y="150.35855" c="&#x153;"/> 
    
    <char bbox="487.98785 153.77843 496.37805 155.31883" x="487.98785" y="155.31883" c="&#x153;"/> 
    
    <char bbox="524.8815 156.25856 533.27167 157.79897" x="524.8815" y="157.79897" c="&#x153;"/> 
    

    以及物品是否完整,這裏是從Ghostscript的使用txtwrite設備相同的信息與-dTextFormat=0

    <page> 
    <span bbox="39 164 43 164" font="PlantinMTStd-Regular" size="11.9357"> 
    <char bbox="39 164 39 164" c=" "/> 
    </span> 
    <span bbox="57 165 73 165" font="OpusStd" size="19.8411"> 
    <char bbox="57 165 57 165" c="&amp;"/> 
    </span> 
    <span bbox="82 153 91 153" font="OpusStd" size="19.8411"> 
    <char bbox="82 153 82 153" c="&#x2d9;"/> 
    </span> 
    <span bbox="145 163 153 163" font="OpusStd" size="19.8411"> 
    <char bbox="145 163 145 163" c="&#x153;"/> 
    </span> 
    <span bbox="182 168 190 168" font="OpusStd" size="19.8411"> 
    <char bbox="182 168 182 168" c="&#x153;"/> 
    </span> 
    <span bbox="226 175 237 175" font="OpusStd" size="19.8411"> 
    <char bbox="226 175 226 175" c="w"/> 
    </span> 
    <span bbox="320 155 331 155" font="OpusStd" size="19.8411"> 
    <char bbox="320 155 320 155" c="w"/> 
    </span> 
    <span bbox="414 145 422 145" font="OpusStd" size="19.8411"> 
    <char bbox="414 145 414 145" c="&#x153;"/> 
    </span> 
    <span bbox="451 150 459 150" font="OpusStd" size="19.8411"> 
    <char bbox="451 150 451 150" c="&#x153;"/> 
    </span> 
    <span bbox="488 155 496 155" font="OpusStd" size="19.8411"> 
    <char bbox="488 155 488 155" c="&#x153;"/> 
    </span> 
    <span bbox="525 158 533 158" font="OpusStd" size="19.8411"> 
    <char bbox="525 158 525 158" c="&#x153;"/> 
    </span> 
    </page> 
    

    它看起來好像還有一個錯誤,但在char bbox中的urx值是不正確的,但在跨度bbox中是正確的。

    +0

    「您需要考慮代表'邊界框'的內容」 - 感謝您指出了這一點。我剛剛編輯了這個問題來澄清。 –

    3

    你可能也想看看這個的Adobe GitHub的庫:

    afdko子目錄中包含了大量的命令行工具,可以有效地用於檢測,檢查並轉換字體文件。我從這次回購的tx工具,以打印約從PDF samplemutool 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之一在這個回購命​​令行工具,也可能對你有用...