Преобразование и объединение изображений и PDF с Python - PullRequest
0 голосов
/ 05 августа 2020

Итак, я пытаюсь объединить несколько файлов (PDF и изображения), используя только Python. Пока удалось обойтись с PDF-файлами и изображениями в формате "JPG". Однако каждый раз, когда я пытаюсь преобразовать изображения «PNG» в PDF с помощью PIL, появляется сообщение об ошибке «ValueError: не удается сохранить режим RGBA».

Я знаю, что PIL может преобразовать «RGBA» в «RGB», но по какой-то причине приведенный ниже код не работает должным образом.

Есть идеи, почему?

PS: Начато обучение Python одна неделя go, если для вас очевидно, будьте добры.

PYTHON КОД

# pip instal PyPDF2

from pathlib import Path
import os
import sys
import img2pdf
from PIL import Image 
from PyPDF2 import PdfFileMerger

source_dir = sys.argv[1]

os.chdir(sys.argv[1])

print(sys.argv[1])

merger = PdfFileMerger()

for item in os.listdir(source_dir):
    
    if item.endswith('jpg'):
        print(item)
        output = "output.pdf"
        print(output)

        if os.path.isfile(output):
            expand = 1
            while True:
                expand += 1
                new_output = output.split(".pdf")[0] + str(expand) + ".pdf"
                print(new_output)
                
                if os.path.isfile(new_output):
                    continue
                else:
                    output = new_output
                    Image.open(item).save(output, "PDF", resolution=100.0)
                    break
                    
                    
        if not os.path.isfile(output):
                    print(output)
                    Image.open(item).save(output, "PDF", resolution=100.0)

for item in os.listdir(source_dir):
        
    if item.endswith('png'):
        print(item)
        saida = "saida.pdf"
        print(saida)
        if Image.open(item).mode == "RGBA":
            Image.open(item).convert("RGB")

        if os.path.isfile(saida):
            expande = 1
            while True:
                expand += 1
                new_saida = saida.split(".pdf")[0] + str(expande) + ".pdf"
                print(new_saida)
                
                if os.path.isfile(new_saida):
                    continue
                else:
                    saida = new_saida
                    Image.open(item).save(saida, "PDF", resolution=100.0)
                    break
                    
                    
        if not os.path.isfile(saida):
                    print(saida)
                    Image.open(item).save(saida, "PDF", resolution=100.0)
    
                       
for item in os.listdir(source_dir):
    
    if item.startswith('Doc.'):
        merger.merge(position=0, fileobj=item, bookmark=None, pages=None)
        
    if item.endswith('pdf'):
        merger.append(item)
                  
merger.write('tentativa.pdf')
merger.close()


filepath = source_dir + "\\"

for item in os.listdir(source_dir):
    if item.startswith('Doc'):
        docname = item
        os.rename(filepath + docname, filepath + 'delete.pdf')

for item in os.listdir(source_dir):
    
    if item.startswith('output'):
        os.remove(item)

for item in os.listdir(source_dir):
    if item.startswith('delete'):
        os.remove(item)

    if item.startswith('tentativa'):
        docname2 = item
        os.rename(filepath + docname2, filepath + docname)        
    

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Сначала вам нужно преобразовать ваш PNG из RGBA в RGB. Png имеет дополнительный альфа-канал, следовательно, RGBA. RGBA - 32 бита, а RGB - 24 бита. как упоминалось здесь

Пример кода:

from PIL import Image

PNG_FILE = 'a.png'
PDF_FILE = 'b.pdf'

rgba = Image.open(PNG_FILE)
rgb = Image.new('RGB', rgba.size, (255, 255, 255))  # white background
rgb.paste(rgba, mask=rgba.split()[3])               # paste using alpha channel as mask
rgb.save(PDF_FILE, 'PDF', resoultion=100.0)
0 голосов
/ 05 августа 2020

Вам нужно преобразовать ваш PNG из RGBA в RGB сначала, например:

from PIL import Image

PNG_FILE = 'image.png'
PDF_FILE = 'doc.pdf'

rgba = Image.open(PNG_FILE)
rgb = Image.new('RGB', rgba.size, (255, 255, 255))  # white background
rgb.paste(rgba, mask=rgba.split()[3])               # paste using alpha channel as mask
rgb.save(PDF_FILE, 'PDF', resoultion=100.0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...