起因也記錄一下,在考慮mmwave idea的時候,想着找一些雷達的書補充基礎知識。我電的雷達原理找不到高清的電子書,真的找不到。參考網上建議找了Radar Handbook這本書。
書打開了開始看,媽的里面的內容adobe acrobat復制粘貼不了,emmm,都是。
開始了兩天的PDF學習之路。
1.如何查看pdf.
第一層:在PDF閱讀器里面,我能看到pdf的字體是aa,bb, encoding是cc,dd之類的。
第二層:PDF用文本編輯器打開,能看到更具體的文件格式,但是里面內容被壓縮了,導致有點問題,我自己觀察到的就是obj的數量不准確之類的。
第三層:PDF文件先進行解壓縮,再用文本編輯器打開,就可以了。
解壓縮的軟件,下載之后要從命令行才能進行解壓操作,這個有點意外。
以上知識來自luoyunhai。
2.PDF顯示內容,存儲內容,編碼之間的關系
PDF繪制的是字符的圖案(glyph),但是存儲時,可以存儲自定義的CID序列,比如<1E2S3R4R>代表一個雙字節的字符的CID。
有了字體(包含一個glyph庫)和CID序列后,就可以繪制PDF。這里有兩種形式,1)定義一個CID到GID(glyph在庫里的ID)的map,叫做CMAP,把CID轉化為GID再使用。2)使用和GID相同的CID,感覺上1)是沒必要的方法。
但是!這樣的pdf還是只讓看不讓摸,如果想用copy/paste操作來獲取里面的內容,並沒有什么有意義的內容,CID只代表了字符在字體的glyph庫里面的位置,和本身的意義無關了。所以這里一般需要
TOUNICODE CMAP,記錄CID到UNICODE的映射,有了這個東西,復制粘貼的時候就知道返回給你什么UNICODE了。以上知識來自於luoyunhai和這里,這里。
OK,結合一和二定位到問題,在PDF源文件里面搜索,沒有TOUNICODE這個obj,關於obj的定義參考luoyunhai。
思路:
為PDF添加上TOUNICODE obj。
待解決:
1.如何提取一份可用的TOUNICODE,TOUNICODE是否對每個字體一樣,是否和編碼方式有關,畢竟我win下面生成的PDF是winansi編碼,radar handbook是identity-H編碼。
2.怎么把TOUNICODE加上去,按luoyunhai的思路似乎是在后面加量式的修改,但是還不知道怎么改。
3.如何把以上代碼完成自動化。
stackoverflow里面的這個例子似乎符合我的需求。但是是java環境,pdfbox是java的一個庫。
但是我連它的運行環境都不知道,而且pdfbox,pdfdebnugger又是什么。而且很sb的要對每一個字符寫一下。
emmm,現在看來,還是要全部都加在后面,假如對原有obj進行改動,xref會變得很厲害。
手動進行了初步實驗,效果很差,同樣文件foxit和chrome還能打開,adobe直接說文件出錯(懷疑可能用了tounicode cmap的subset。
debug1, 改變新字體的時候弄錯順序了,導致顯示錯誤,修改后adobe仍然報錯,foxit和chrome效果和原來一樣
debug2, cmap有一個/length屬性,這個/length我還沒有修改到對應值,
拿原始數據驗證之后,/length 的大小是stream [start]...[end]endstream之間的長度。
xref里面obj的順序是按照編號來的
debug2, startxref的數值忘記改了
FANCY!
原文:Tracking radar
未添加cmap:
添加cmap后: 4RACKING RADAR. 中間空格是一個有問題的字符。
可以看到,小寫字母被映射到對應的大寫字母,而大寫字母被映射到其它字符,空格被映射到不知道哪里。
這貌似需要一個手動修改的過程,怎么這么傻逼呢,關鍵我不知道怎么補充一個cmap,在已經用了一個cmap的基礎上,怎么補充