python ghostscript 没有关闭输出文件

python ghostscript not closing output file

我正在尝试将一页或多页的 PDF 文件转换为每一页的图像。这很像 the question found here。事实上,我正在尝试使用来自@Idan Yacobi 的 post 中的代码来完成此操作。他的代码如下所示:

import ghostscript

def pdf2jpeg(pdf_input_path, jpeg_output_path):
    args = ["pdf2jpeg", # actual value doesn't matter
            "-dNOPAUSE",
            "-sDEVICE=jpeg",
            "-r144",
            "-sOutputFile=" + jpeg_output_path,
            pdf_input_path]
    ghostscript.Ghostscript(*args)

当我 运行 代码时,我从 python 得到以下输出: ##### 238647312 c_void_p(238647312L)

当我查看应该创建新 .jpg 图像的文件夹时,那里有一个新名称的文件。但是,当我尝试打开文件时,图像预览显示 "Windows Photo Viewer can't open this picture because the picture is being edited in another program."

似乎由于某种原因,Ghostscript 打开了文件并写入了文件,但完成后没有关闭它。有什么办法可以强制它发生吗?或者,我还缺少其他东西吗?

我已经尝试将上面的最后一行更改为下面的代码,以便在完成后明确关闭 ghostscript。

GS = ghostscript.Ghostscript(*args)
GS.exit()

我在批处理大量 pdf 时遇到了同样的问题,我相信我已经将问题与 Ghostscript 的 python 绑定问题隔离开来,因为正如您所说,图像文件未正确 closed。为了绕过这个,我不得不去使用 os 系统调用。因此,根据您的示例,函数和调用将替换为:

os.system("gs -dNOPAUSE -sDEVICE=jpeg -r144 -sOutputFile=" + jpeg_output_path + ' ' + pdf_input_path)

您可能需要将 "gs" 更改为 "gswin32c" 或 "gswin64c",具体取决于您的操作系统。这可能不是 most 优雅的解决方案,但它解决了我这边的问题。

我的解决方法实际上只是安装图像打印机,然后 Python 使用图像打印机打印 PDF,从而创建所需的 jpeg 图像。这是我使用的代码:

import win32api
def pdf_to_jpg(pdf_path):
    """
    Turn pdf into jpg image(s) using jpg printer
    :param pdf_path:  Path of the PDF file to be converted
    """

    # print pdf to jpg using jpg printer
    tempprinter = "ImagePrinter Pro"
    printer = '"%s"' % tempprinter
    win32api.ShellExecute(0, "printto", pdf_path, printer, ".", 0)

我在图像文件保持打开状态时遇到了同样的问题,但是当我查看 ghostscript init.py 文件(位于以下目录中:PythonDirectory\Lib\site-packages\ghostscript__init__.py),exit 方法有一行注释。

gs.exit(self._instance) 行默认被注释,但当您取消注释该行时,图像文件将被关闭。

def exit(self):
    global __instance__
    if self._initialized:
        print '#####', self._instance.value, __instance__
        if __instance__:
            gs.exit(self._instance) # uncomment this line
            self._instance = None
        self._initialized = False

我在 运行 进入受密码保护的 PDF 时遇到了同样的问题 - ghostscript 会崩溃并且不会关闭 PDF,从而阻止我删除 PDF。

Kishan 的解决方案已经为我应用,因此对我的问题没有帮助。

我通过导入 GhostscriptError 并在 try/finally 块之前实例化一个空的 Ghostscript 来修复它,如下所示:

from ghostscript import GhostscriptError
from ghostscript import Ghostscript

...
# in my decryptPDF function
GS = Ghostscript()
try:
    GS = Ghostscript(*args)
finally:
    GS.exit()

...
# in my function that runs decryptPDF function
try:
    if PDFencrypted(append_file_path):
        decryptPDF(append_file_path)
except GhostscriptError:
    remove(append_file_path)
    # more code to log and handle the skipped file
    ... 

对于那些偶然遇到同样问题的人。我查看了 python ghostscript init 文件并发现了 ghostscript.cleanup() function/def.

因此,我可以通过将这个简单的 one-liner 添加到我的脚本末尾 [或循环末尾] 来解决问题。

ghostscript.cleanup()

希望它能帮助别人,因为它让我很沮丧。