我只需要复制一些文字,包括pdf文件中的特殊字符,但是破折号( - )这样的特殊字符会被转换为 2 。
来自以下链接的PFA
http://www.fileconvoy.com/dfl.php?id=g6a3426746a10af3b9992384375c5923396bce3660
附件有pdf源文件,我要复制数据,其他是截图图片.. 需要紧急帮助。我也尝试使用Google Docs和Adobe Pro从pdf复制数据,但每次都得到类似的结果。
答案 0 :(得分:6)
简而言之:
PDF中的所有信息都表明PDF中您看到破折号的字形确实代表 2 。因此,要以不同的方式解释这些字形,您必须从根本上改变PDF中其字体中该字符的值到unicode映射,或采用光学字符识别。
详细说明:
让我们看一下PDF pg_0001.pdf内容流的那一部分,用你标记的单词
已创建:
0 -1.1065 TD
[(Fibroblast)-241.2(growth)-234.1(factor-21)-237.3(\(FGF-21\))-242.3(activity)-233.9(in)-237(High-fat)-237.9(diet)-234.9(\(HFD\))-238.3(fed)-234(ApoE)]TJ
/F6 1 Tf
6.7246 0 0 5.9768 357.3354 542.4944 Tm
(2)Tj
/F4 1 Tf
.8346 0 TD
(/)Tj
/F6 1 Tf
.3372 0 TD
(2)Tj
/F4 1 Tf
8.9663 0 0 8.9663 372.9826 538.5259 Tm
[(mice)-235.6(with)-233.5(adiponectin)-240.8(\(Acrp30\))-237.6(knockdown.)]TJ
这里的特殊字符确实由字体“强”> / F6 中的字符“2”(= 50 = 0x32)表示。
由于此处字符串中的字符到实际打印的字形的映射可能非常随意,并且可能存在正确解释的提示,但我们应该查看该字体的定义 / F6 在该页面上:
<<
/FirstChar 44
/ToUnicode 21 0 R
/Encoding 22 0 R
/FontDescriptor 23 0 R
/BaseFont /KAHBDA+AdvP7DA6
/Subtype /Type1
/LastChar 50
/Type /Font
/Widths [833 0 0 0 0 0 833]
>>
因此,您的字体通过 / ToUnicode 映射得到增强,文本提取程序应使用该映射来解释内容流中的字符。我们来看看那个映射:
/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo <<
/Registry (F6+0) /Ordering (T1UV) /Supplement 0 >> def
/CMapName /F6+0 def
/CMapType 2 def
1 begincodespacerange <2c> <32> endcodespacerange
2 beginbfchar
<2c> <002C>
<32> <0032>
endbfchar
endcmap CMapName currentdict /CMap defineresource pop end end
因此,这里的'2'= 0x32被映射到&lt; 0032&gt;。表示Unicode代码0x0032,再次为'2'。
如果 / ToUnicode 映射不存在,则文本提取程序可以使用PDF对象22中的 / Encoding 定义。但是这里再次:< / p>
22 0 obj
<<
/Type /Encoding
/Differences [44 /comma 50 /two]
>>
这里'2'= 50被映射到名为 / two 的字形,再次使该字形为 2 。
因此,除了字形绘制定义本身(理论上可以通过OCR检查)之外,PDF中的所有信息都表明破折号字形确实是 2 。
要使文本提取程序更符合您的喜好,您应该替换&lt; 32&gt;的 / ToUnicode 映射。例如&LT; 002D取代。不幸的是,映射是编码的(使用过滤器 / FlateDecode ),因此这不是简单的十六进制编辑器工作,而是需要解码等...