处理多个文件时 Ghostscript 出现致命错误

Posted

技术标签:

【中文标题】处理多个文件时 Ghostscript 出现致命错误【英文标题】:Fatal error in Ghostscript when processing multiple files 【发布时间】:2019-12-12 00:10:09 【问题描述】:

Python 3.7.5

操作系统:Windows Server 2016

Ghostscript 版本:9.5

我正在尝试使用 Ghostscript 对目录中的多个 PDF 进行文本提取。该目录目前包含 2 个 PDF:1234.pdf 和 5678.pdf。

import os
import sys

def pdf2txt(directory,file):
    import locale
    import ghostscript
    args=[file,"-dBATCH","-dNOPAUSE","-dNOPROMPT","-sDEVICE=txtwrite","-sOutputFile="+directory+"\\output\\"+file+"-%d.txt",directory+"\\"+file]
    encoding=locale.getpreferredencoding()
    args=[a.encode(encoding) for a in args]
    print (args)
    ghostscript.Ghostscript(*args)

directory=sys.argv[1]

files=os.listdir(directory)
for file in files:
    print("Trying "+directory+"\\"+file)
    pdf2txt(directory,file)

我遇到的问题是第一个 PDF 可以毫无问题地处理,但尝试处理第二个 PDF 总是会导致 Python 出错。我注意到即使从 Python 控制台进行文本提取时也会出现此错误。我可以提取第二个文件的唯一方法是退出 Python 并重新启动它。

我已重命名这些文件,以便首先处理第二个 PDF。该 PDF 可以毫无问题地处理,而之前成功处理的第二个 PDF 现在会引发致命错误。我尝试将我的 args 列表和编码变量重置为空,调用 ghostscript 中不存在的方法,例如 .quit() 或 .exit()。我确实看到一个帖子提到退出方法在 init 中被注释掉了,确实如此。我删除了评论,但没有成功。

C:\Users\bob\Documents>python exporter.py c:\users\bob\Desktop\PDFs
Trying c:\users\bob\Desktop\PDFs\1234.pdf
[b'1234.pdf', b'-dBATCH', b'-dNOPAUSE', b'-dNOPROMPT', b'-sDEVICE=txtwrite', b'-sOutputFile=c:\\users\\bob\\Desktop\\PDFs\\output\\1234.pdf-%d.txt', b'c:\\users\\bob\\Desktop\\PDFs\\1234.pdf']
GPL Ghostscript 9.50 (2019-10-15)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Processing pages 1 through 22.
Page 1
Page 2
Page 3
Page 4
Trying c:\users\bob\Desktop\PDFs\5678.pdf
[b'5678.pdf', b'-dBATCH', b'-dNOPAUSE', b'-dNOPROMPT', b'-sDEVICE=txtwrite', b'-sOutputFile=c:\\users\\bob\\Desktop\\PDFs\\output\\5678.pdf-%d.txt', b'c:\\users\\bob\\Desktop\\PDFs\\5678.pdf']
GPL Ghostscript 9.50 (2019-10-15)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Traceback (most recent call last):
  File "exporter.py", line 18, in <module>
    pdf2txt(directory,file)
  File "exporter.py", line 11, in pdf2txt
    ghostscript.Ghostscript(*args)
  File "C:\Program Files\Python37\lib\site-packages\ghostscript\__init__.py", line 174, in Ghostscript
    stderr=kw.get('stderr', None))
  File "C:\Program Files\Python37\lib\site-packages\ghostscript\__init__.py", line 74, in __init__
    rc = gs.init_with_args(instance, args)
  File "C:\Program Files\Python37\lib\site-packages\ghostscript\_gsprint.py", line 273, in init_with_args
    raise GhostscriptError(rc)
ghostscript._gsprint.GhostscriptError: Fatal

【问题讨论】:

【参考方案1】:

我今天遇到了同样的问题,发现 ghostscript.Ghostscript 应该在 with 块中调用。另外,在创建ghostscript.Ghostscript 的新实例之前,我必须调用ghostscript.cleanup()

试试这个:

import os
import sys

def pdf2txt(directory,file):
    import locale
    import ghostscript
    args=[file,"-dBATCH","-dNOPAUSE","-dNOPROMPT","-sDEVICE=txtwrite","-sOutputFile="+directory+"\\output\\"+file+"-%d.txt",directory+"\\"+file]
    encoding=locale.getpreferredencoding()
    args=[a.encode(encoding) for a in args]
    print (args)
    with ghostscript.Ghostscript(*args) as g:
        ghostscript.cleanup()

directory=sys.argv[1]

files=os.listdir(directory)
for file in files:
    print("Trying "+directory+"\\"+file)
    pdf2txt(directory,file)

【讨论】:

以上是关于处理多个文件时 Ghostscript 出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript将多个eps文件连接成一个大eps文件

错误处理和时间函数

ghostscript.net 可以将 PDF 文件分成多个部分吗?

如何使用 Python Ghostscript 的高级接口将一个 .pdf 文件转换为多个 .png 文件?

Ghostscript 批处理文件 - 执行并退出

Django:为啥当我在 django 中通过 popen 使用 Ghostscript 时会出现“找不到文件”错误