2010-10-20 136 views
3

我認爲在PDF中具有文本渲染的每個值。PDF計算字形尺寸

* Position (Text Matrix) 
* FontDescriptor with Widths Array 
* FontBBox 
* StemV/StemH 
* FontName 
* Descent 
* Ascent 
* CapHeight 
* XHeight 
* ItalicAngle 

我的問題是我不知道如何處理這些值。我經歷了PDF Spec 1.7幾次,無法找到一個公式來計算PDF中每個字形的實際像素大小。你能給我一個提示嗎?

謝謝。

+1

你想要做什麼,你的問題與iPhone,石英圖形和線性代數有關怎麼樣? – Bobrovsky 2010-10-21 00:22:49

回答

0

這些值被設計爲正確排版類型,而不是繪製字形,因此您無法從這些屬性中獲取每個字形的確切像素大小。獲得字形的精確像素尺寸的唯一方法是將字形繪製到圖像中並分析該圖像。

FontBBox(字體邊界框)是將保存每個字形的最小框。寬度數組保存有關每個字符應該相隔多遠的信息,而不是實際的字形圖像大小。一些字體會畫出一些大於這個寬度的字形。

當您在典型的文本編輯器中突出顯示文本時,突出顯示將是字體的整個高度以及每個單獨字符的寬度。通過獲取FontBBox高度以及Widths數組中每個字符的寬度,並將這些值轉換爲與當前字體的屬性(大小等)相匹配,即可實現此高光。這些信息足以使您的應用程序像典型的應用程序一樣繪製。

+0

如何將FontBBox值轉換爲設備空間值(實際像素值)? – andidol 2010-10-21 12:17:11

+0

FontBBox和Widths值在FontMatrix指定的字形空間中。通過串聯字體矩陣和文本空間來構建轉換矩陣,以將FontBBox值映射到設備空間。 – 2010-10-21 12:38:39

+0

你有一個excact公式計算FontBBox的高度+寬度陣列設備空間,我可以得到字符大小? – andidol 2010-10-21 13:50:19

3

你想做什麼?渲染PDF是一項很多工作,您還需要考慮領先,文本提升,字距調整,CTM和其他幾個因素。

+0

我想突出顯示一段文字。我用Quartz 2D方法成功解析了PDF。我想我掌握了所有的信息,現在我必須做一些數學來找出一些文字/單詞的「CGRects」。 – andidol 2010-10-21 10:05:53

2
Position:  (optional, you can avoid it) 
Text Matrix: (optional, you can avoid it) 
Widths Array: (use empty array [], PDF can read it directly from CFF (FontFile3 stream)) 
FontBBox:  font file->'CFF ' table->Top DICT INDEX->DICT-> 4 operands for 'FontBBox'  operator 
StemV:  (optional, you can avoid it) 
StemH:  (optional, you can avoid it) 
FontName:  font file->'name' table->records 
     or: font file->'CFF ' table->Top DICT INDEX->string by index 0 for 'fonts names' operator 

Descent:  font file->'hhea' table->'Descender' parameter 
Ascent:  font file->'hhea' table->'Ascender' parameter 
CapHeight: font file->'OS/2' table->'sCapHeight' parameter 
XHeight:  font file->'OS/2' table->'sxHeight' parameter 
ItalicAngle: font file->'OS/2' table->'sxHeight' parameter 

其實,你可以計算寬度數組。對於每一個字形:

Decoding array(PDF) -> Glyph name (PDF) -> Glyph index (CFF table of font file) -> table 'hmtx' -> Glyph 'hMetrics'[Glyph index] = array ('advanceWidth', 'leftSideBearing') 

我花了一週時間,去了解它...

+0

有沒有機會實現iOS的選擇和高亮文本?或者這只是基本的解釋? – 2014-11-12 19:08:25

+0

有很多關於選擇和突出顯示的信息http://stackexchange.com/search?q=select+pdf+text+ios – 2014-11-13 20:39:28

1

如果你只想突出顯示文本,它沒有必要計算的文本。您可以添加儘可能多的內容對象到頁面(矩形,圖像,線條,半透明的東西)並重新計算PDF結構。這非常簡單。問你的鼠標有關選擇座標))