210923_152627-多种方式测试多张图片合成PDF

351 阅读1分钟

PIL

图像不是很清晰

import os
from PIL import Image


def combine2pdf(neg_folder_path, pos_folder_path, pdfFilePath):
    png_files = []
    images = []
    for file in os.listdir(neg_folder_path):
        if 'png' in file:
            png_files.append(os.path.join(neg_folder_path, file))
    for file in os.listdir(pos_folder_path):
        if 'png' in file:
            png_files.append(os.path.join(pos_folder_path, file))
    for file in png_files:
        im = Image.open(file)
        # Pillow can't save RGBA images to pdf,make sure the image is RGB
        if im.mode == "RGBA":
            im = im.convert("RGB")
        images.append(im)
    images[0].save(pdfFilePath, save_all=True, quality=100, append_images=images[1:])


if __name__ == "__main__":
    batch = '20210812'
    neg_ion_path = os.path.join(batch, 'neg')
    pos_ion_path = os.path.join(batch, 'pos')
    for sample in os.listdir(neg_ion_path):
        neg_sample_path = os.path.join(neg_ion_path, sample)
        pos_sample_path = os.path.join(pos_ion_path, sample)
        sample_pdf_file = os.path.join(batch, sample + '.pdf')
        combine2pdf(neg_sample_path, pos_sample_path, sample_pdf_file)
        print("%s pdf合并完成" % sample)
    print('共%s个 success!' % len(os.listdir(neg_ion_path)))

fpdf

合成图片清晰, 但是速度很慢

import os
from PIL import Image
from fpdf import FPDF

pdf = FPDF()
sdir = "./test2/"
w, h = 0, 0
img_list = [os.path.join(sdir, x) for x in os.listdir(sdir)]
for i in range(1, len(img_list) + 1):
    fname = img_list[i - 1]
    print("fname----------", fname)

    if os.path.exists(fname):
        if i == 1:
            cover = Image.open(fname)
            w, h = cover.size
            pdf = FPDF(unit="pt", format=[w, h])
        image = fname
        pdf.add_page()
        pdf.image(image, 0, 0, w, h)
    else:
        print("File not found:", fname)
    print("processed %d" % i)
pdf.output("output2.pdf", "F")
print("done")

img2pdf

合成的PDF不够清晰

对png四通道, 需要转换为三通道

import glob
import img2pdf

with open("06_img2pdf_jpg.pdf", "wb") as f:
    f.write(img2pdf.convert(glob.glob("jpg/*.jpg")))

reportlab (推荐)

自定义图像大小, 生成速度快, 图像质量高

import os
import PIL
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape


def genpdf(filename, pagesizes):
    pdf = canvas.Canvas(filename)
    pdf.setPageSize(pagesizes)
    return pdf


def save_img_to_pdf(pdf, image, x, y, w, h):
    pdf.drawImage(image, x, y, w, h)
    pdf.showPage()


if __name__ == '__main__':
    pdf_size = (1920, 1080)
    my_pdf = genpdf('00_reportlab推荐.pdf', pdf_size)
    folder = '20210812/neg/Q_QC_MFE02_1'
    filelist = os.listdir(folder)
    for filename in filelist:
        img = PIL.Image.open(folder + '/' + filename)
        img_w, img_h = img.size  # 1024 768

        img_x = (landscape(pdf_size)[0] - img_w) / 2  # 448
        img_y = (landscape(pdf_size)[1] - img_h) / 2  # 156

        save_img_to_pdf(my_pdf, folder + '/' + filename, x=img_x, y=img_y, w=img_w, h=img_h)
    my_pdf.save()