PDF有一些用黑色写的文字。当我在查看器中看到这个文档时,我无法看到与其他文本重叠的文本(INSERT)。如果我选择我可以看到该文本。您可以在文档中搜索“INSERT”文本。
我看不到任何使文字隐藏的内容。 任何人都可以解释一下是什么让观众看不到文字吗?
答案 0 :(得分:0)
此处用于隐藏部分文字的技巧称为剪辑。
PDF文档中的每个文本或图形块都可能带有一个矩形。渲染块中的对象后,页面上仅显示剪切矩形内的部分。
要查看文档中包含的所有文本,您可以使用从PDF文档中提取文本的任何实用程序,例如属于Poppler toolkit的pdftotext
。
$ pdftotext ../x.pdf - | grep INSERT
[INSERT TABLE TITLE HERE]
Source: [INSERT SOURCE TEXT HERE]
[INSERT Group
Source: [INSERT SOURCE TEXT HERE]
[INSERT TABLE TITLE HERE]
Source: [INSERT SOURCE TEXT HERE]
[INSERT
Source: [INSERT SOURCE TEXT HERE]
这表明此文档中隐藏了四个表。要检查文档结构并查看剪切矩形,您应该使用其中一个PDF API,例如iText或Poppler。
答案的其余部分基于SVG表示法而不是PDF。 PDF操作员使用低级语言,难以直接读写。对于好奇的人来说,使用PDF标记的例子将在下一节中介绍。
SVG是矢量图形的另一种格式。任何PDF文档都可以转换为SVG,保留大部分功能,将其转换为一种人类可读的形式。
以下是使用Inkscape转换为SVG的文档的一小部分。最终渲染看起来像
文件本身就是
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="744" height="1052" viewBox="0 0 744 1052" version="1.1">
<defs>
<clipPath id="clipPath37876" clipPathUnits="userSpaceOnUse">
<path style="clip-rule:evenodd" d="m 170.12,325 382.7,0 0,21.02 -382.7,0 0,-21.02 z"/>
</clipPath>
<clipPath id="clipPath44260" clipPathUnits="userSpaceOnUse">
<path style="clip-rule:evenodd" d="m 170.12,315 382.7,0 0,16.02 -382.7,0 0,-16.02 z"/>
</clipPath>
</defs>
<g clip-path="url(#clipPath37876)" id="g37874">
<text style="font-weight:bold;font-size:9px;font-family:Arial;fill:#000000;fill-opacity:1" transform="matrix(1,0,0,1,170.12,335)">
<tspan>[INSERT TABLE TITLE HERE]</tspan>
</text>
</g>
<g clip-path="url(#clipPath44260)" id="g44258">
<text style="font-weight:bold;font-size:9px;font-family:Arial;fill:#000000;fill-opacity:1" transform="matrix(1,0,0,1,170.12,325)">
<tspan>December factory</tspan>
</text>
<text style="font-weight:bold;font-size:9px;font-family:Arial;fill:#000000;fill-opacity:1" transform="matrix(1,0,0,1,248.6,325)">
<tspan>shipments</tspan>
</text>
<text style="font-weight:bold;font-size:9px;font-family:Arial;fill:#000000;fill-opacity:1" transform="matrix(1,0,0,1,296.18,325)">
<tspan>summary</tspan>
</text>
</g>
<text style="font-weight:bold;font-size:12px;font-family:Arial;fill:#db0011;fill-opacity:1" transform="matrix(1,0,0,1,170.12,443.06)">
<tspan>Valuation and risks</tspan>
</text>
</svg>
此处剪裁矩形定义为
<clipPath id="clipPath37876" clipPathUnits="userSpaceOnUse">
<path style="clip-rule:evenodd" d="m 170.12,340 382.7,0 0,21.02 -382.7,0 0,-21.02 z"/>
</clipPath>
以这样的方式定义:与此矩形关联的块中的文本完全呈现在矩形的边界之外。如果您使用170.12,340
替换矩形起点170.12,325
,则会渲染文档并显示所有文本。
以下代码使用PDF标记运算符在裁剪矩形内打印一串文本,以便文本适合内部。
stream
0 0 200 20 re
W n
q
BT
/F1_0 18 Tf
0 5 Td
([INSERT TEXT HERE]) Tj
ET
Q
endstream
请注意,我们首先定义一个剪切矩形0 0 200 20
,它宽200点,高20点。然后我们使用18磅字体从位置(0 5)
开始放置一些文本。
剪裁矩形的轮廓以蓝色显示。
现在,如果我们用0 10 200 20
替换剪切矩形,结果文本将显示为
仅显示适合剪裁矩形内部的文本部分。
通过以下PDF格式,我们可以看到新文本如何显示在剪切的文本上方。
stream
q
0 14 200 20 re
W n
q
BT
/F1 18 Tf
0 5 Td
([INSERT TEXT HERE]) Tj
ET
Q
Q
100 0 80 14 re
W n
q
BT
/F1 14 Tf
1.0 0.0 0.2 rg
1.0 0.0 0.2 RG
100 5 Td
(new text) Tj
ET
Q
endstream
此处应用于黑色文本的剪辑不适用于红色块。与前面的示例一样,黑色文本的剪切矩形的轮廓以蓝色显示。