Pdf覆盖不起作用

时间:2014-05-10 18:19:42

标签: python pdf pypdf

我一直在寻找这个问题的解决方案:我有两个面向横向的带有图像的A3 pdf,我希望以这样的方式覆盖它们:生成的pdf包含两个图像合并为一个,就好像其中一个是一个水印,但具有相同的密度。想想它就像在一张A3纸上打印两个不同的pdf一样,我希望得到这种效果。

换句话说 - 只想出一种方法来表达它 - 我想覆盖两个pdf,对于上层,使所有“白色”区域透明。

基本上,我只是按照这个问题的任何解决方案中的步骤:

overlay one pdf or ps file on top of another

pdftk在我的情况下不起作用。生成的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 个答案:

答案 0 :(得分:1)

pdf中的

白色可能是两种基本情况的结果:要么是在那里没有被绘制的结果,要么是使用有效的白色在那里绘制的东西。可以使用那些页面合并方法为第一类型的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,即 fill )。参看this answer以供参考。

因此,颜色设置1 1 1 rg(即将填充颜色设置为RGB 100%,100%,100%)和特殊图形状态操作q保存图形状态)此处不允许进行操作。因此,根据PDF查看器,在显示该页面时可能会发生不同的事情,例如,填充操作可能会被完全忽略,或者只是颜色设置操作可能是,并且可能会使用当前的填充颜色(黑色?)。人们不能指望像Adobe Reader那样处理此错误的所有PDF查看器。

也许lucidchart已经解决了这个问题并且更新就足够了。否则你应该让lucidchart开始正确地制作他们的PDF图表。