2012-12-02 50 views

回答

3

通用答案是否定的。您正在討論的ToUnicode地圖遵循PDF CMap格式,用於將字符代碼轉換爲Unicode值。你面臨兩個潛在的缺陷:

1)字體不完全相同。儘管它們的名稱可能相同,但它們可能具有不同的編碼,或者可能包含不同的字形(即使是相同的編碼)。在這種情況下從不同字體應用CMap會給你不正確的Unicode值。

2)字體可能在所有方面都是相同的,但可能會在PDF文件中進行子集(可能),並且子集可能不同。當然有些情況不會改變字體在PDF文件中的存儲方式,但是有優化的PDF編寫器會壓縮任何他們可以在子集字體中使用的東西,這可能會導致不同的字符編碼被使用並最終不同ToUnicode地圖。

+1

David PDF是由Microsoft SSRS生成的,只有一個使用的字體,如果需要,我願意手動創建一個cmap文件。 我必須從數千個PDF中提取文本,並且可以手動嘗試將char代碼映射到unicode值。我需要推薦一些可以幫助我實現這一目標的代碼。 –

+0

Microsoft SSRS的字體子集是什麼?你擁有的所有文件是由同一個應用程序生成的?如果在所有情況下使用相同的字體並且使用相同的生成應用程序,我認爲它值得嘗試將現有的ToUnicode CMap簡單地複製到另一個文件中。 –

+0

什麼是製片人?它是iTextSharp嗎? (打開文檔屬性找到答案。)如果我們知道生產者,我們知道期望什麼。例如:如果字體是子集的,那麼您的嘗試將失敗:並非所有文檔都需要相同的字符。 –

1

對於Unicode映射Adobe有特殊資源/ ToUnicode 您可以在Font資源描述的pdf文件中找到它。它看起來像

<</BaseFont /ONWALI+Sylfaen/DescendantFonts [10 0 R]/Encoding /Identity-H/Subtype /Type0/ToUnicode 11 0 R/Type /Font>> 

/ToUnicode 11 0 R是你需要在PDF文件。 11 0是資源ID

我已經創建了帶有Acrobat Pro中所有字母符號的示例pdf,以使用與報表中使用的字體相同的標準ToUnicode映射。我已經提取的資源爲文本,它看起來是這樣的:所以你必須將其解壓縮得到的文字像上面

/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 
50 beginbfchar 
<0003> <0020> 
...and so on... 
endbfchar 
endcmap CMapName currentdict /CMap defineresource pop end end 

ToUnicode資源通常壓縮。

然後,我編寫了代碼,它使用pdf(來自Misrosoft Reporting中生成的報告),併爲找到的每個字體添加/ ToUnicode資源。 PDF具有帶指針的外部參照表,並且不能將其編輯爲文本文件。所以你必須使用一些pdf引擎(我使用過PDFTron,但是itext應該足夠了)。每次需要將報告另存爲pdf時,都會執行此後處理代碼。 實際上,ToUnicode映射應該由Microsoft報告引擎填充,但它太好了,無法實現。

就是這樣。

+0

我試圖複製這與iText,迄今爲止我看到ToUnicode流嵌入在PDF和/ ToUnicode條目添加到/字體字典,但是當我打開PDF時,它仍然沒有映射字符。有什麼建議麼? – sq33G

+0

@ sq33G嘗試保存未壓縮的流以檢查映射是如何手動保存的。我想你沒有映射所有字符。您可以使用Adobe Pro來驗證PDF。 Adobe驗證會顯示映射中遺漏的字符代碼。 – oleksa

+0

太棒了!我有錯誤的CMapName - 它必須匹配字體的註冊表/排序/補充。美麗! – sq33G