python ghostscript没有关闭输出文件

时间:2017-06-09 02:53:27

标签: python pdf jpeg ghostscript

我正在尝试将包含一个或多个页面的PDF文件转换为每个页面的图像。这非常像the question found here。事实上,我正在尝试使用@Idan Yacobi中的代码来完成此任务。他的代码看起来像这样:

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无法打开此图片,因为图片正在另一个程序中进行编辑。”

似乎由于某种原因,Ghostscript打开了该文件并写入了该文件,但在完成后没有关闭它。有什么方法可以强迫这种情况发生吗?或者,我错过了别的什么?

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

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

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,图像文件保持打开状态,但当我查看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

答案 1 :(得分:2)

我在批量处理大量pdf时遇到了同样的问题,我相信我已经将问题与Ghostscript的python绑定问题分开了,就像你说的那样,图像文件不正确关闭。为了绕过这个,我不得不去使用os系统调用。所以举个例子,函数和调用将替换为:

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

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

答案 2 :(得分:0)

我的工作实际上只是安装一台图像打印机,让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)

答案 3 :(得分:0)

运行受密码保护的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
    ...