【问题标题】:Extract pdfs from a directory and output images to a different directory with pdf2image使用 pdf2image 从目录中提取 pdf 并将图像输出到不同的目录
【发布时间】:2021-01-01 18:54:18
【问题描述】:

我正在尝试读取某个目录中的一些 pdf,并将其页面的图像输出到不同的目录中。

(我正在寻求了解这段代码的工作原理,我希望有一种更简洁的方法来为我的图像文件指定输出目录。)

我所做的工作,但我认为它只是在我的保存目录和我的 pdf 目录之间来回跳动。

这感觉不是一个干净的方法。有没有更好的选择,可以保留现有代码并完成我添加的行的作用?

import os
from pdf2image import convert_from_path

pdf_dir = r"mydirectorypathwithPDFs"
save_dir = 'mydirectorypathforimages'

os.chdir(pdf_dir)

for pdf_file in os.listdir(pdf_dir):
    os.chdir(pdf_dir) #I added this, change back to the pdf directory
    if pdf_file.endswith(".pdf"):
        pages = convert_from_path(pdf_file, 300)
        pdf_file = pdf_file[:-4]
        for page in pages:
            os.chdir(save_dir) #I added this, change to the save directory
            page.save("%s-page%d.jpg" % (pdf_file,pages.index(page)), "JPEG")

我稍微修改的代码是由@photek1944 创建的,在这里可以找到:https://stackoverflow.com/a/53463015/10216912

【问题讨论】:

  • 我认为这没有问题。不干净是什么意思?如果你不想切换目录,那么你可以保存到绝对路径,或者使用相对路径,那么你不需要任何os命令
  • 嗨,谢谢 Max,是的,我想这就是我想要提前指定输入和输出路径
  • 我不明白你为什么要同时使用chdir(pdf_dir)listdir(pdf_dir)。如果您使用chdir(pdf_dir),那么您可以使用listdir() 而不使用参数。或者如果你使用listdir(pdf_dir),那么你就不需要chdir(pdf_dir)
  • 如果您不想反复来回更改工作目录,请使用绝对路径而不是相对路径。
  • 谢谢大家,有人能告诉我如何使用绝对路径吗?我认为这是我的挂断,我只是不知道如何有效地做到这一点。

标签: python pdf directory chdir


【解决方案1】:

这可能超出了您所要求的范围,但是任何时候有人希望简化涉及os 的代码来操作路径和文件,我总是喜欢推荐Python 的pathlib 模块because it is awesome。以下是我个人将如何实施您的程序:

from pathlib import Path
from pdf2image import convert_from_path

# Use forward slashes here, even if you're on Windows.
pdf_dir = Path('my/directory/path/with/PDFs')
save_dir = Path('my/directory/path/for/images')

for pdf_file in pdf_dir.glob('*.pdf'):
    pages = convert_from_path(pdf_file, 300)
    for num, page in enumerate(pages, start=1):
        page.save(save_dir / f'{pdf_file.stem}-page{num}.jpg', 'JPEG')

pathlib 自动处理提供正确的分隔符(Windows 上的\ 和其他任何地方的/),它允许您使用/ 作为运算符添加到路径中,并且它使搜索文件夹特别方便使用glob 方法。它还公开了 name (blah.pdf)、stem (blah) 和 extension (.pdf) 等属性,以便更轻松地访问路径和文件名的各个部分。

我还使用f-string 来获得更易读的格式,并使用enumerate 来跟踪页码。 (我已将其设置为从1 开始;我相信您的原始代码会将第一页编号为0。)

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2012-02-07
    • 2021-08-08
    • 2023-04-02
    • 1970-01-01
    • 2017-07-27
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多