You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PIL导出DIN A4尺寸PDF出现尺寸异常问题求助

解决PIL生成A4 PDF尺寸不一致及打印拉伸问题

问题根源

  • 像素转换未取整:cm_to_px函数返回浮点数,而图像尺寸必须为整数,会导致实际页面像素尺寸出现偏差
  • 图像粘贴坐标固定:代码中(img_w, img_h)是固定值,所有图像都粘贴到同一位置,引发重叠,这就是Adobe Acrobat仅显示部分图像的原因
  • PDF元数据与像素尺寸不匹配:仅设置resolution=300不足以让所有阅读器正确识别页面物理尺寸

解决方案

1. 修正厘米转像素函数

必须返回整数像素值,避免尺寸计算误差:

def cm_to_px(centimeters):
    # 四舍五入到最近整数,保证像素尺寸精准
    return round((300 * centimeters) / 2.54)

300DPI下A4的标准像素尺寸为(2480, 3507),也可以直接使用该固定值跳过转换:

A4_PX_SIZE = (2480, 3507)  # 300DPI对应的A4像素尺寸

2. 修复图像粘贴坐标逻辑

根据行列索引计算每个图像的粘贴位置,避免重叠:
假设已知单张图像尺寸为(img_width, img_height),代码调整如下:

page = Image.new('1', A4_PX_SIZE, 1)

for y_idx in range(vertical_per_page):
    for x_idx in range(horizontal_per_page):
        # 计算当前图像的左上角坐标
        x_pos = x_idx * img_width
        y_pos = y_idx * img_height
        # 检查是否超出页面范围,防止图像溢出
        if x_pos + img_width > A4_PX_SIZE[0] or y_pos + img_height > A4_PX_SIZE[1]:
            continue
        page.paste(image, (x_pos, y_pos))

3. 规范PDF保存参数

使用PIL保存PDF时,补充必要参数提升兼容性:

page.save('file.pdf', format='PDF', resolution=300, save_all=True)

如果单页PDF仍存在兼容性问题,可尝试用matplotlib的PdfPages生成,兼容性更好:

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np

# 将PIL图像转为numpy数组
img_array = np.array(page)

with PdfPages('file.pdf') as pdf:
    # 设置A4页面尺寸(单位:英寸,21/2.54≈8.27,29.7/2.54≈11.69)
    fig = plt.figure(figsize=(8.27, 11.69), dpi=300)
    plt.imshow(img_array, cmap='gray')
    plt.axis('off')
    # 去除边距,保证图像填满页面
    pdf.savefig(fig, bbox_inches='tight', pad_inches=0)
    plt.close()

验证方法

生成PDF后,通过Adobe Acrobat查看文档属性:

  • 确认页面尺寸为210×297mm
  • 确认分辨率为300DPI
    打印前先在阅读器中预览,检查图像无拉伸、截断问题

内容的提问来源于stack exchange,提问作者GabiKleebi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:50:24