某些文字在PDF

时间:2018-03-08 06:56:12

标签: pdf

PDF有一些用黑色写的文字。当我在查看器中看到这个文档时,我无法看到与其他文本重叠的文本(INSERT)。如果我选择我可以看到该文本。您可以在文档中搜索“INSERT”文本。

我看不到任何使文字隐藏的内容。 任何人都可以解释一下是什么让观众看不到文字吗?

1 个答案:

答案 0 :(得分:0)

此处用于隐藏部分文字的技巧称为剪辑

PDF文档中的每个文本或图形块都可能带有一个矩形。渲染块中的​​对象后,页面上仅显示剪切矩形内的部分。

要查看文档中包含的所有文本,您可以使用从PDF文档中提取文本的任何实用程序,例如属于Poppler toolkitpdftotext

 $ 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,例如iTextPoppler

实施例

答案的其余部分基于SVG表示法而不是PDF。 PDF操作员使用低级语言,难以直接读写。对于好奇的人来说,使用PDF标记的例子将在下一节中介绍。

SVG是矢量图形的另一种格式。任何PDF文档都可以转换为SVG,保留大部分功能,将其转换为一种人类可读的形式。

以下是使用Inkscape转换为SVG的文档的一小部分。最终渲染看起来像

enter image description here

文件本身就是

<?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,则会渲染文档并显示所有文本。

enter image description here

PDF标记运算符的示例

以下代码使用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)开始放置一些文本。

enter image description here

剪裁矩形的轮廓以蓝色显示。

现在,如果我们用0 10 200 20替换剪切矩形,结果文本将显示为

enter image description here

仅显示适合剪裁矩形内部的文本部分。

通过以下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 

此处应用于黑色文本的剪辑不适用于红色块。与前面的示例一样,黑色文本的剪切矩形的轮廓以蓝色显示。

enter image description here