重复多个图像到 PDF 的转换:使用 Python 代码轻松实现自动化

上一篇文章如何将多个图像转换为 PDF?今天,我们将更进一步:如果您从特定文件夹中的子文件夹(A)创建了一个多图像 PDF 文件,而该特定文件夹的另一个子文件夹(B)中还有其他图像,该怎么办?如果一个特定文件夹中混合了已创建 PDF 文件的文件夹和未创建 PDF 文件的文件夹,而您想将每个文件夹转换为 PDF 文件,该怎么办?写下来后就比较难解释了,请看下面的内容,就明白我的意思了。

여러 이미지 PDF 변환 포스트 그림

代码说明:用 Python 进行多图像 PDF 转换

在该代码中, 枕头报告实验室 使用库将多个图像自动转换为 PDF。在图像处理和 PDF 创建过程中,您可以浏览目录结构,将多个图像单独转换为 PDF。

여러 이미지 PDF 변환 포스트 그림

1. 加载所需的 Python 库

导入 os
从 PIL 导入图像
从 reportlab.pdfgen 导入 canvas
从 reportlab.lib.pagesizes 导入 portrait

第一步是加载必要的库,在本例中是加载 奥斯,PIL"(《世界人权宣言》) 图片报告实验室"(《世界人权宣言》) 帆布肖像 使用页面大小选项。

  • os:浏览目录中的文件并创建路径。
  • 枕头 (PIL)说明:打开并处理图像文件。
  • 报告实验室PDF:创建 PDF 文件并插入图像。

2. 编写一个图像处理函数

def process_images(c, dir_path):
    img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
    if img_list:
        for img_name in img_list[1:]:
            img_path = os.path.join(dir_path, img_name)
            img = Image.open(img_path)
            img_width, img_height = img.size
            c.setPageSize((img_width, img_height))
            c.showPage()
            c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)

该功能是处理图像文件并将其转换为 PDF 的关键部分。

  1. 图像列表从给定目录中只获取".png "文件,并对其进行排序。
  • os.listdir(dir_path)将获取目录中的所有文件、 if img_name.endswith(".png") 该条件只选择 PNG 文件。
  • 打开图像文件:创建图像路径后 图像.open()打开图像。
  • 设置页面大小: setPageSize()来设置页面大小以适应图像大小。
  • 添加图像: drawInlineImage()将图像插入 PDF 页面。
  • showPage():完成页面并准备新页面。

    此过程可将每个 PNG 文件转换成一个 PDF 页面。

    3. 处理目录内的子目录

    def process_subdirs(main_dir, output_dir):
        for subdir in os.listdir(main_dir):
            subdir_path = os.path.join(main_dir, subdir)
            if os.path.isdir(subdir_path):
                for second_subdir in os.listdir(subdir_path):
                    second_subdir_path = os.path.join(subdir_path, second_subdir)
                    如果 os.path.isdir(second_subdir_path):
                        pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
                        if not os.path.exists(pdf_path):
                            os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
                            c = canvas.Canvas(pdf_path, pagesize=None)
                            process_images(c, second_subdir_path)
                            c.save()
                            print(f "Generated PDF file: {pdf_path}")

    该函数负责处理给定主目录下的所有子目录,为每个目录生成一个 PDF 文件。

    1. os.listdir():获取主目录和子目录下的文件列表。
    • os.path.isdir() 条件来检查它是否是一个目录。
    • 创建 PDF 文件路径: os.path.join()来创建 PDF 文件的路径,并且只有在 PDF 文件不存在的情况下才会创建该文件。
    • 创建和保存 PDF 文件方法是创建一个画布对象、 process_images() 函数来处理图像并保存 PDF 文件。
    • os.makedirs()创建一个文件夹来存储 PDF 文件(如果还不存在)。

      该功能会遍历目录结构,并自动将每个子目录中的 PNG 文件转换为 PDF。

      4. 调用主函数

      main_dir = "C:\Users\user\Documents\Book"
      output_dir = "C:\Users\user\Documents\Book_pdf"
      process_subdirs(main_dir, output_dir)

      最后,在指定路径上运行 PDF 转换任务。

      1. 主目录主目录的路径,包括图像。
      2. 输出目录:保存 PDF 文件的路径。
      3. process_subdirs() 函数,该函数用于转换主目录中的所有图像并将其保存为 PDF 文件。

      完整的 Python 代码

      导入 os
      从 PIL 导入图像
      从 reportlab.pdfgen 导入 canvas
      从 reportlab.lib.pagesizes 导入 portrait
      
      def process_images(c, dir_path):
          img_list = sorted([img_name for img_name in os.listdir(dir_path) if img_name.endswith(".png")])
          if img_list:
              for img_name in img_list[1:]:
                  img_path = os.path.join(dir_path, img_name)
                  img = Image.open(img_path)
                  img_width, img_height = img.size
                  c.setPageSize((img_width, img_height))
                  c.showPage()
                  c.drawInlineImage(img_path, 0, 0, width=img_width, height=img_height)
      
      def process_subdirs(main_dir, output_dir):
          for subdir in os.listdir(main_dir):
              subdir_path = os.path.join(main_dir, subdir)
              if os.path.isdir(subdir_path):
                  for second_subdir in os.listdir(subdir_path):
                      second_subdir_path = os.path.join(subdir_path, second_subdir)
                      如果 os.path.isdir(second_subdir_path):
                          pdf_path = os.path.join(output_dir, subdir, f"{second_subdir}.pdf")
                          if not os.path.exists(pdf_path):  # 仅在未创建 PDF 文件时运行
                              os.makedirs(os.path.dirname(pdf_path), exist_ok=True)
                              c = canvas.Canvas(pdf_path, pagesize=None)
                              process_images(c, second_subdir_path)
                              c.save()
                              print(f "Generated PDF file: {pdf_path}")
      
      # 起始点
      main_dir = "C:\Users\user\Documents\\Book"
      output_dir = "C:\Users\user\Documents\Book_pdf"
      process_subdirs(main_dir, output_dir)

      该代码可自动查找多个目录中的 PNG 图像文件并将其转换为 PDF。现在,您也可以使用 Python 高效地处理多个图像到 PDF 的转换任务了!

      # 其他说明

      我要用 Python 代码来解释我想做的事情,这可能会增加难度,所以我要写一些额外的细节。例如,假设文件夹 A 下有 1、2、3......个子文件夹,文件夹 B 下也有同样的 1、2、3......个子文件夹。文件夹 A 中的每个子文件夹都包含 png 图像文件,因此在完成上述操作后,您将在单个 pdf 文件中看到文件夹 B 中的多个图像,每个图像的文件夹名称相同。

      但是,如果我们想不删除文件夹 A 中的图片(pdf 文件已在文件夹 B 中创建),我们就需要编写 Python 代码,以便在执行上述操作时跳过创建 pdf 文件的文件夹 A 的子文件夹。在上面的完整代码中,您可以看到 "#仅在未创建 PDF 文件时运行'就可以了。现在你应该可以轻松地将每个文件夹中的多个图像转换为 PDF 了。

      类似文章