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()
希望它能帮助别人,因为它让我很沮丧。
我正在尝试将一页或多页的 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()
希望它能帮助别人,因为它让我很沮丧。