将.doc文件转换为.pdf文件时如何处理文本。我试图使用Pdfbox拦截“Tj”运算符。这句话 “交换PDF的功能。同样,可以使用查看器应用程序查看生成的PDF文件,例如”
“PDF的交换功能.Agai”& “n,可以使用查看器应用程序查看生成的PDF文件,例如”。对TJ操作员的参数
[COSArray{[COSString{in}, COSInt{5}, COSString{t}, COSInt{5}, COSString{er}, COSInt{-4}, COSString{ch}, COSInt{5}, COSString{an}, COSInt{4}, COSString{g}, COSInt{5}, COSString{e }, COSInt{-2}, COSString{f}, COSInt{10}, COSString{eat}, COSInt{5}, COSString{ur}, COSInt{10}, COSString{es o}, COSInt{6}, COSString{f }, COSInt{-2}, COSString{P}, COSInt{6}, COSString{DF}, COSInt{6}, COSString{.}, COSInt{13}, COSString{ Ag}, COSInt{3}, COSString{ai}]}] and
[COSArray{[COSString{n, t}, COSInt{6}, COSString{he }, COSInt{10}, COSString{r}, COSInt{-2}, COSString{esu}, COSInt{5}, COSString{lt}, COSInt{8}, COSString{in}, COSInt{5}, COSString{g}, COSInt{5}, COSString{ P}, COSInt{4}, COSString{DF}, COSInt{6}, COSString{ f}, COSInt{-2}, COSString{il}, COSInt{5}, COSString{e }, COSInt{8}, COSString{ca}, COSInt{4}, COSString{n b}, COSInt{3}, COSString{e }, COSInt{8}, COSString{view}, COSInt{9}, COSString{ed wit}, COSInt{6}, COSString{h a}, COSInt{14}, COSString{ v}, COSInt{-3}, COSString{ie}, COSInt{12}, COSString{we}, COSInt{8}, COSString{r}, COSInt{8}, COSString{ app}, COSInt{5}, COSString{li}, COSInt{5}, COSString{ca}, COSInt{4}, COSString{t}, COSInt{5}, COSString{io}, COSInt{7}, COSString{n, s}, COSInt{6}, COSString{uc}, COSInt{5}, COSString{h as}, COSInt{7}, COSString{ }]}]
是因为.doc转换为pdf的方式吗?或者是因为 textblocks 在question的最后一个答案中引用了。COSInt
之间COSString
的重要性是什么?我真的不了解textblock,但我不认为如果我试图拦截Tj操作符应该有问题。如果我尝试从pdf文件处理pdf创建它会不会相同?
答案 0 :(得分:1)
首先:声明“.doc文件转换到PDF”是不正确的。它不是任何形式的转换;相反,文档呈现到虚拟打印机,虚拟打印机写出形成页面的PDF文本命令。对象(文本和图形)在PDF中出现的顺序不是由原始文档的内容决定的;虚拟打印机可以按任何顺序处理对象。
请勿混淆TJ
和Tj
。每Adobe's PDF Reference 1.7:
5.3.2文本显示运算符 ...
string Tj显示文本字符串。
array TJ显示一个或多个文本字符串,允许单独的字形定位。 [...]数字以文本空间为单位的千分之一表示。
Tj
显示连续文本字符串,对于TJ
,其间的COSInts是各个文本字符串之间的水平偏移。但是,这并不意味着用Tj
绘制的所有内容都是一个单独的文本字符串。 PDF生成器可以将单个较长的句子拆分为单独的Tj
指令;例如,将相同的字体和大小的文本组合在一起。
类似地,TJ
数组可能只包含单独文本片段之间的非常小的调整,以实现字符级别字距调整或跟踪;但它也可能包含更大的距离来创建自定义空间,模仿标签或叠印字符。
您引用的“文本块”是字符串操作数:
文本显示运算符的字符串操作数被解释为标识要绘制的字形的字符代码序列。
...
呈现给文本显示操作符的字符串可以是任何长度 - 甚至是每个字符串的单个字符代码 - 并且可以以任何顺序放置在页面上。将字形分组为字符串对于文本的显示没有意义。通过一次调用文本显示操作符(如 Tj )显示多个字形会产生与显示每个字形的单独调用相同的结果。
可能的问题是TJ
/ Tj
字符串的定位。通常,文本按阅读顺序呈现:从左到右,从上到下。但是页眉和页脚以及图形或表格等项目可能总是先渲染或最后渲染。此外,如果文本片段按字体/大小呈现,您可能首先找到(例如)所有罗马文本,然后是所有斜体文本,最后是所有粗体文本。
在大多数情况下,无法准确地从PDF中提取原始文本。 TJ
和Tj
[a]都只格式化文本的水平跨度(实际上它们也可以呈现垂直文本),并且不保留文本跨度之间的原始关系,因为虚拟打印机从未意识到这是开始的。
[a]还有两个文字渲染命令:'
和"
与TJ
和Tj
相同,但另外将“当前点”定位到“下一行的开头”和 反过来需要解释“前导”和“当前行的开始”的值。
另一个需要注意的是,文本操作数中的字符编码可能与您的预期不符。 PDF打印机可以自由重新排序或更改字符编码,例如字体已被子集化,或访问默认字体编码之外的特殊字符。所以你可能会得到一个字符串
[ (\251 1985\205) 6.4 (2006 A) 24 (d) 1 (o) 9.7 (b) -12.3 (e) ] TJ
(PDF参考文献1.7的第2页第一行)。八进制字符\251
(十进制169)和\205
(十进制133)是字符©
和–
;第一个也是常规的ISO-Latin1代码,但第二个不是 - 这个文本在 PDFEncoding (附录D,字符集和编码)中。编码可能因文档中的字体而异(并且您也可能使用不同的编码来复制字体)。编码也可以是完全自定义的(使用\000
表示“A”,\001
表示“d”,依此类推)或存储为与标准编码之一的差异:
7 0 obj @ 319814 % Encoding
<<
/Type /Encoding
/Differences [ 32 /space 38 /ampersand 44 /comma /hyphen /period /slash /zero /one /two /three 53 /five /six /seven /eight /nine /colon /semicolon 65 /A /B /C /D
/E /F /G /H /I 75 /K /L /M /N /O /P 82 /R /S /T /U /V /W /X 90 /Z 95 /underscore 97 /a
/b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z 133
/endash 141 /quotedblleft /quotedblright 169 /copyright ]
>>
endobj
PDF Reference 1.7本身就是一个有趣的目标。检查章节开始页面上的文本,第25页(“第1章 - 简介”),我发现了这个:
25
CHAPTER 1
1Introduction
The Adobe Portable Document Format (PDF) is the native file format of the ..
“25”是底部的页码,“第1章”是显而易见的;但为什么“1Introduction”?那是解码错误吗?进一步检查显示“1”设置为1.98磅尺寸,填充颜色为“白色”(当我在整个页面后面放置一个黑色矩形时,它实际上显示出来)。我想这只是排字机的伎俩之一:通过在相同的行上包含章节号,他可以让他的软件(Framemaker)自动从该行生成正确的“书签”文本,包括“1”。当然,页面本身不应该显示'1',所以他将它设置为小而白。