PNG изображения в один PDF в Python

У меня есть список изображений.png. Мне нужно преобразовать их все в один pdf, 9 изображений на страницу, но не размещать их один за другим вертикально, а заполнять всю ширину и только потом переходить к следующей строке. Количество картинок может быть разным каждый раз (12, ... 15)

Я пробовал fpdf

from fpdf import FPDF

list_of_images = [1.png, 2.png, ... 15.png]
w = 70
h = 60
pdf = FPDF(orientation = 'L')
for image in list_of_images:
    pdf.image(image, w=sizew, h=sizeh)
pdf.output("Memory_usage.pdf", "F")

а также wkhtmltopdf

template = Template('''<!doctype html>
<html>
<body>
        <div style="display: flex; flex-direction: row">
        {% for image in images %}
            <img src="{{ image }}" />
        {% endfor %}
        </div>
</body>
</html>''')
list_of_images = [1.png, 2.png, ... 15.png]
html = template.render(images=list_of_pict)
with open("my_new_file.html", "wb") as fh:
    fh.write(html)

p = subprocess.Popen(['wkhtmltopdf', '-', 'Memory_usage.pdf'], stdin=subprocess.PIPE, universal_newlines=True)
p.communicate(html)
p.wait()

но оба они помещают каждую картинку одну под другой

3 ответа

Просто поместите каждое изображение в требуемые координаты, используя FPDF:

pdf.image(image, x=50, y=100, w=sizew, h=sizeh)

Дополнительная информация о документации FPDF: изображение

Это код, который преобразует список изображений в PDF. Вы также можете использовать цикл for вместо image_1, image_2 и т. д., как показано ниже.

      from PIL import Image

image_1 = Image.open(r'C:\Users\Ron\Desktop\Test\view_1.png')
image_2 = Image.open(r'C:\Users\Ron\Desktop\Test\view_2.png')
image_3 = Image.open(r'C:\Users\Ron\Desktop\Test\view_3.png')
image_4 = Image.open(r'C:\Users\Ron\Desktop\Test\view_4.png')

im_1 = image_1.convert('RGB')
im_2 = image_2.convert('RGB')
im_3 = image_3.convert('RGB')
im_4 = image_4.convert('RGB')

image_list = [im_2, im_3, im_4]

im_1.save(r'C:\Users\Ron\Desktop\Test\my_images.pdf', save_all=True, append_images=image_list)

отказ от ответственности: я являюсь автором библиотеки, используемой в этом ответе

borbимеет систему компоновки, которая может вам помочь. Вы можете использовать a, если хотите добавить содержимое на страницу, однако по умолчанию для объектов изображения они всегда помещаются на следующую строку.

Вы можете использовать объект для объединения объектов в группу (а затем добавить этотInlineFlowвозражать против чего-либо, напримерPageLayout)

      from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import PageLayout, SingleColumnLayout
from borb.pdf import InlineFlow
from borb.pdf import Image
from borb.pdf import PDF

from pathlib import Path

# create a new Document
d: Document = Document()

# add a new Page
p: Page = Page()
d.add_page(p)

# create a PageLayout to handle content-coordinates/margin/padding
l: PageLayout = SingleColumnLayout(p)

# build an InlineFlow (which will attempt to flow items that are added to it)
f: InlineFlow = InlineFlow()

# add all Images to the InlineFlow
for img_path in [Path("a"), Path("b"), Path("c")]:
    f.add(Image(img_path))

# add the InlineFlow object to the PageLayout
l.add(f)

# store the PDF
with open("output.pdf", "wb") as fh:
    PDF.dumps(fh, d)

Другие вопросы по тегам