PDF覆盖不成功
我一直在寻找解决这个问题的方法:我有两个横向的A3大小的PDF文件,里面有图片,我想把它们叠加在一起,最终得到一个PDF,里面的两张图片合成在一起,就像其中一张是水印一样,但密度要保持一致。可以想象成是在一张A3纸上打印两份不同的PDF,我想要的就是这种效果。
换句话说,我刚想到一个表达方式:我想把两个PDF叠加在一起,并且让上面的那一层的所有“白色”区域变成透明。
基本上,我只是按照这个问题中的任何解决方案的步骤进行操作:
但是,pdftk在我的情况下没有奏效。生成的PDF只显示了上层的PDF,而下层的PDF却看不见。所以,我转向编程解决方案,下载了pyPdf。
网站上的代码正好是我想要的解决方案的实现:
from pyPdf import PdfFileReader,PdfFileWriter
output = PdfFileWriter()
input1 = PdfFileReader(file("b.pdf", "rb"))
page1 = input1.getPage(0)
watermark = PdfFileReader(file("a.pdf", "rb"))
page1.mergePage(watermark.getPage(0))
output.addPage(page1)
outputStream = file("c.pdf", "wb")
output.write(outputStream)
outputStream.close()
然而,结果和使用pdftk时是一样的。
我到底哪里做错了?也许这不是PDF合并、多个合并、盖章、叠加等等,而是别的什么?如果是这样的话,那它叫什么?
1 个回答
白色在PDF中可能有两种情况:一种是那里什么都没有画,另一种是用有效的白色画了东西。第一种PDF可以通过一些页面合并的方法添加背景,而第二种则不行。
你提供的示例文件 a.pdf
的页面内容流是这样的:
1 0 0 -1 0 841 cm
0.45 0 0 0.45 0 0 cm
1 0 0 1 0 0 cm
0 0 m 2646 0 l 2646 1870 l 0 1870 l h
q
1 1 1 rg f
Q
前面三行代码是为了调整接下来操作的坐标系统,让原点在左上角,坐标值向右和向下增加,每个单位是1/160英寸。
第四行代码画了一个覆盖整个页面(其实还稍微多一点)的矩形,第六行则用白色填充了这个矩形。(第五和第七行只是保存和恢复图形状态。)
所以,当你把这个PDF叠加到另一个PDF页面上时,首先会用一个白色矩形覆盖掉那个页面上所有现有的内容。
因此,你不能通过简单地把页面内容添加到背景PDF页面的内容中来给你的PDF添加背景。你需要:
- 要么先删除第4和第6行的内容(也许在 lucidchart 中有个复选框可以让你开启或关闭这个白色背景矩形)
- 要么使用不同的水印处理方法(比如反过来做,把你的PDF页面用水印PDF页面叠加,并使用透明度)。
PS:严格来说,这些内容行已经有错误:一旦你开始构建路径(在上面的示例中是用 0 0 m
,即移动到位置0, 0),你只能使用路径构建(或路径裁剪)操作,直到你最终使用路径绘制操作(在你的示例中是 f
,即填充)。有关详细信息,可以参考 这个回答。
因此,颜色设置 1 1 1 rg
(即设置填充颜色为RGB 100%, 100%, 100%)和特殊的图形状态操作 q
(保存图形状态)在这里是不允许的。因此,根据不同的PDF查看器,显示这个页面时可能会发生不同的事情,比如填充操作可能会被完全忽略,或者仅仅是颜色设置操作被忽略,而使用当前的填充颜色(黑色?)来代替。不能指望所有的PDF查看器都像Adobe Reader那样处理这个错误。
也许lucidchart已经修复了这个问题,更新一下就可以了。否则,你应该要求lucidchart开始正确制作他们的PDF图表。