起因也记录一下,在考虑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的基础上,怎么补充