【问题标题】:Multiple pngs/pdfs per page using python使用python每页多个png/pdf
【发布时间】:2020-03-21 08:10:41
【问题描述】:

我有一组已保存为 .png 和 .pdf 的图像。我想知道是否有办法将 png 或 pdf 组合在一起,这样我每页可以有多个。我知道如何使用 PdfFileMerger() 将多个 pdf 合并在一起,但这只会在每页中放置一个项目。有没有办法做到这一点?我有 pdf 和 png,所以我可以使用任何一个。

我基本上想做这样的事情:

取image1.png, 图像2.png, image3.png 和 image4.png 并创建类似:

输出文件1:

-----------------------------
              |
              |
image1.png    | image2.png
              |
              |
-----------------------------
              |
              |
image3.png    | image4.png
              |
              |
-----------------------------

非常感谢!

【问题讨论】:

  • 为什么不阅读图像并按照您想要的方式重新绘制它们?
  • 我不知道该怎么做。我搜索了一段时间试图找到一些运气不佳的东西
  • matplotlib 有 imread 和 imshow 函数
  • 啊,我明白了。我假设它类似于您在绘图时绘制子图?
  • 是的,你可以做 2x2 子图并以这种方式排列你的图像..可能有更直接的方法,但我知道这肯定会工作

标签: python pdf png


【解决方案1】:

您可以使用PIL/pillow创建大的空图像,然后将小图像放在该图像的不同位置。

from PIL import Image

# get images    
img1 = Image.open('image1.png')
img2 = Image.open('image2.png')
img3 = Image.open('image3.png')
img4 = Image.open('image4.png')

# get width and height
w1, h1 = img1.size
w2, h2 = img2.size
w3, h3 = img3.size
w4, h4 = img4.size

# to calculate size of new image 
w = max(w1, w2, w3, w4)
h = max(h1, h2, h3, h4)

# create big empty image with place for images
new_image = Image.new('RGB', (w*2, h*2))

# put images on new_image
new_image.paste(img1, (0, 0))
new_image.paste(img2, (w, 0))
new_image.paste(img3, (0, h))
new_image.paste(img4, (w, h))

# save it
new_image.save('new.png')

顺便说一句:你可以把它写成for-loop(s)。


与没有 Python 的程序 ImageMagick 相同。

但是您可以在 Python 中通过os.system('convert ...') 使用这些命令

$ convert image1.png image2.png +append row1.png
$ convert image3.png image4.png +append row2.png
$ convert row1.png row2.png -append new.png

+append 加入行,-append 加入列。

即使在一个命令中也可以做到这一点:Stitching Image Set Together

$ convert image1.png image2.png image3.png image4.png +append -crop 2x1@ -append new.png

如果你使用new.pdf 而不是new.png 那么它可以创建PDF


Python 模块Wand 使用ImageMagick。代码类似于pillow

from wand.image import Image

img1 = Image(filename='image1.png')
img2 = Image(filename='image2.png')
img3 = Image(filename='image3.png')
img4 = Image(filename='image4.png')

w1, h1 = img1.size
w2, h2 = img2.size
w3, h3 = img3.size
w4, h4 = img4.size

w = max(w1, w2, w3, w4)
h = max(h1, h2, h3, h4)

new_image = Image(width=w*2, height=h*2)

new_image.composite(image=img1, left=0, top=0)
new_image.composite(image=img2, left=w, top=0)
new_image.composite(image=img3, left=0, top=h)
new_image.composite(image=img4, left=w, top=h)

new_image.save(filename='new.png')

cv2numpy 为例,但它适用于图像大小相同的情况。如果它们不同,则它们需要空行和空列具有相同的大小。

import cv2
import numpy as np

img1 = cv2.imread('image1.png')
img2 = cv2.imread('image2.png')
img3 = cv2.imread('image3.png')
img4 = cv2.imread('image4.png')

row1 = np.concatenate((img1, img2), axis=1)
row2 = np.concatenate((img3, img4), axis=1)
new_image = np.concatenate((row1, row2))

# or
row1 = np.hstack((img1, img2))
row2 = np.hstack((img3, img4))
new_image = np.vstack((row1, row2))

cv2.imwrite('new.png', new_image)

matplotlibnumpy 类似

import matplotlib.image
import numpy as np

img1 = matplotlib.image.imread('image1.png')
img2 = matplotlib.image.imread('image2.png')
img3 = matplotlib.image.imread('image3.png')
img4 = matplotlib.image.imread('image4.png')

row1 = np.concatenate((img1, img2), axis=1)
row2 = np.concatenate((img3, img4), axis=1)
new_image = np.concatenate((row1, row2))

# or
row1 = np.hstack((img1, img2))
row2 = np.hstack((img3, img4))
new_image = np.vstack((row1, row2))

matplotlib.image.imsave('new.png', new_image)

imageionumpy 类似

import imageio
import numpy as np

img1 = imageio.imread('image1.png')
img2 = imageio.imread('image2.png')
img3 = imageio.imread('image3.png')
img4 = imageio.imread('image4.png')

row1 = np.concatenate((img1, img2), axis=1)
row2 = np.concatenate((img3, img4), axis=1)
new_image = np.concatenate((row1, row2))

# or
row1 = np.hstack((img1, img2))
row2 = np.hstack((img3, img4))
new_image = np.vstack((row1, row2))

imageio.imwrite('new.png', new_image)

【讨论】:

  • 我会试试这个!谢谢!
  • 我用 ImageMagick 添加了示例
  • 我添加了 numpycv2matplotlibimageio 的示例
  • 如果你在convert中使用new.pdf而不是new.png,那么它可以创建PDF
  • 这太完美了!谢谢!
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 2021-12-01
  • 2016-03-11
  • 2010-10-27
  • 2012-06-14
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多