夜雨聆风学习资料网

ARTICLE · 1133974

多张A4纸图片如何生成一个PDF文件?| 一起来看

多张A4纸图片如何生成一个PDF文件?| 一起来看
这个问题我们丢到DS中看有什么答案:
方案一:PS自带能力

最简单、最推荐用 Photoshop 自带的 “PDF 演示文稿” 功能,把多张图合成一个多页 PDF。关键是:输出时选 “多页文档”,不要选“演示文稿”。

在弹出的PDF演示文稿面板中选择浏览,添加你所需写入到PDF中的图片即可。然后依次选择多页面文档和存储即可。

那么成本就是电脑需要安装一个PS软件。

注意

  • 不要直接“文件 > 存储为 PDF”,那只会把当前一张图保存成单页 PDF。

  • 如果生成后页面大小不是 A4,通常是图片分辨率不对。A4 在 300 dpi 下必须是 2480 × 3508 像素,并且分辨率标记为 300 dpi。

  • 如果图片尺寸不统一,先回 PS 里统一成 A4 画布,再合并,否则 PDF 页面会大小不一。

那么在没有这个软件的时候,替代方案又有哪些呢?

方案二:系统自带转换能力

照片合理命名和排序后,选中所有照片,在MacOS中右键的快速操作就有创建PDF选项:

点击后就会在当前目录下快速生成一个PDF文件。

方案三:利用Typora的导出能力

安装Typora,然后粘贴图片进去即可,比如我的markdown文件中为:

一共添加了五张图片。编辑好这个文本文件后,使用typora软件打开,然后选择导出-PDF:

但这样导出的会有问题,A4图片会截断,比如:

那么,如何处理呢?很简单,可以先导出HTML,然后浏览器打开,然后打印,选择缩放,到合适的缩放效果即可。

方案四:利用豆包

很简单,提示词:

在目录下创建一个文件夹。用来做图片生成 PDF 文件,图片都是 A4 纸。生成一个程序,我调用来处理生成

然后就会给你生成一个程序,调用执行即可,比如我这里是:

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""img_to_pdf.py —— 多张图片合并生成一个 PDF,每页 A4(210×297mm),图片拉伸铺满整页。用法:    python img_to_pdf.py [图片文件或文件夹 ...] [-o 输出.pdf] [--dpi 300] [--recursive] [--quiet]示例:    python img_to_pdf.py a.jpg b.png c.webp    python img_to_pdf.py ./photo_folder -o result.pdf    python img_to_pdf.py folder1/ folder2/ --recursive -o 合并.pdf说明:    - 不传 -o 时,输出到当前工作目录,默认文件名为 <第一张图片名>.pdf(多输入时为 merged.pdf)。    - 排序按文件名自然排序(1, 2, 10 …),支持传入文件夹后自动收集其中的图片。    - 支持格式:jpg / jpeg / png / bmp / tiff / webp / gif(取首帧)。"""import argparseimport osimport reimport sysfrom pathlib import Pathfrom PIL import Image# A4 物理尺寸 210×297mm @300DPI = 2480×3508 pxDEFAULT_DPI = 300A4_WIDTH = 2480A4_HEIGHT = 3508SUPPORTED_EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff", ".webp", ".gif"}def natural_key(name: str):    """把文件名拆成 (文本段, 数字段) 序列,实现 1,2,10 的自然排序。"""    parts = re.split(r"(\d+)", name)    return [int(part) if part.isdigit() else part.lower() for part in parts]def collect_images(paths, recursive):    """把输入参数(文件或文件夹)解析成按自然序排列的图片文件列表。"""    files = []    for p in paths:        path = Path(p)        if not path.exists():            print(f"[警告] 路径不存在,已跳过:{p}")            continue        if path.is_file():            if path.suffix.lower() in SUPPORTED_EXTS:                files.append(path)            else:                print(f"[警告] 非图片格式,已跳过:{p}")            continue        # 是文件夹        pattern = "**/*" if recursive else "*"        found = [            f for f in path.glob(pattern)            if f.is_file() and f.suffix.lower() in SUPPORTED_EXTS        ]        # 文件夹内按自然序        found.sort(key=lambda f: natural_key(f.name))        files.extend(found)    if not files:        print("[错误] 没有找到任何可用的图片文件。")        sys.exit(1)    # 全局按自然序去重(保持稳定)    seen = set()    ordered = []    for f in files:        rp = f.resolve()        if rp not in seen:            seen.add(rp)            ordered.append(f)    return ordereddef build_a4_page(img: Image.Image, dpi: int) -> Image.Image:    """拉伸铺满 A4:转 RGB 后缩放到 A4 像素尺寸。"""    target = (int(A4_WIDTH * dpi / DEFAULT_DPI),              int(A4_HEIGHT * dpi / DEFAULT_DPI))    return img.convert("RGB").resize(target, Image.LANCZOS)def main():    parser = argparse.ArgumentParser(        description="多张图片合并生成一个 PDF,每页 A4,图片拉伸铺满整页。")    parser.add_argument("inputs", nargs="+", help="图片文件或文件夹路径")    parser.add_argument("-o", "--output", help="输出 PDF 路径(默认自动生成)")    parser.add_argument("--dpi", type=int, default=DEFAULT_DPI,                        help="PDF 分辨率(默认 300,建议 150–300)")    parser.add_argument("-r", "--recursive", action="store_true",                        help="递归收集子文件夹中的图片")    parser.add_argument("-q", "--quiet", action="store_true", help="静默输出")    args = parser.parse_args()    if args.dpi <= 0:        print("[错误] --dpi 必须为正数。")        sys.exit(1)    images = collect_images(args.inputs, args.recursive)    if not args.output:        # 多输入默认 merged.pdf,单输入默认同名 .pdf        if len(images) == 1:            default = Path.cwd() / (images[0].stem + ".pdf")        else:            default = Path.cwd() / "merged.pdf"        args.output = str(default)    out_path = Path(args.output)    if out_path.suffix.lower() != ".pdf":        out_path = out_path.with_suffix(".pdf")    if out_path.parent and not out_path.parent.exists():        out_path.parent.mkdir(parents=True, exist_ok=True)    if not args.quiet:        print(f"共 {len(images)} 张图片,开始处理…")    pages = []    try:        for i, img_path in enumerate(images, 1):            with Image.open(img_path) as img:                page = build_a4_page(img, args.dpi)                pages.append(page)            if not args.quiet:                print(f"  [{i}/{len(images)}] {img_path.name}")        if not args.quiet:            print("正在写入 PDF…")        first, rest = pages[0], pages[1:]        first.save(            str(out_path),            format="PDF",            save_all=True,            append_images=rest,            resolution=args.dpi,            title=out_path.stem,            author="img_to_pdf",        )    except Exception as exc:  # noqa: BLE001        print(f"[错误] 处理失败:{exc}")        sys.exit(1)    finally:        for page in pages:            page.close()    if not args.quiet:        print(f"完成:{out_path}({len(images)} 页)")if __name__ == "__main__":    main()
你还有哪些可用的好方法,评论区一起交流。

相关学习资料