python - 使用python每页多个png/pdf
问题描述
我有一组保存为 .png 和 .pdf 的图像。我想知道是否有办法将 png 或 pdf 组合在一起,这样我每页可以有多个。我知道如何使用 PdfFileMerger() 将多个 pdf 合并在一起,但这只会在每页中放置一个项目。有没有办法做到这一点?我有 pdf 和 png,所以无论我需要使用哪个我都可以。
我基本上想做类似的事情:
获取 image1.png、image2.png、image3.png 和 image4.png 并创建如下内容:
输出文件1:
-----------------------------
|
|
image1.png | image2.png
|
|
-----------------------------
|
|
image3.png | image4.png
|
|
-----------------------------
我真的很感激!
解决方案
您可以使用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')
cv2
以and为例,numpy
但它适用于图像大小相同的情况。如果它们不同,那么它们需要空行和空列具有相同的大小。
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)
与matplotlib
和类似numpy
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)
与imageio
和类似numpy
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)
推荐阅读
- bash - 通过 .bash_profile 在终端中显示活动的 conda 虚拟环境
- python - 通过新创建的继承 SQLAlchemy 类设置所需的外键
- laravel - 如何使用颤振在数据库 laragon 中插入日期数据?
- facebook - 模式中的 FB.login 未打开弹出窗口
- php - 在woocommerce中显示没有折扣的产品价格
- batch-file - 使用 .bat 文件在每行输出 txt 文件的开头插入文件名
- sql - 如何在列中查找带有英文字符的名称?
- android - 二进制 XML 文件第 25 行:膨胀类 TextView 时出错
- c++ - 使用 Switch-case 语句拉取随机扑克牌等级和花色以显示用户
- python - Python:rolling.apply() 给出 TypeError