使用子进程无法正常运行Python中的ghostscript

时间:2017-08-25 22:45:18

标签: python subprocess ghostscript

好的,这里是我的input.pdf文件的链接,如果有人想尝试使用subprocess.Popen使用ghostscript将这个pdf文件转换为txt文件,我已经尝试了我能想到的一切根据你的答案到目前为止。

Link to input.pdf file

再次,从命令行执行ghostscript直接工作正常,这是我通过cmd行获得的:

C:\Misc>gswin32c -dBATCH -dNOPAUSE -sPageList=1- -sDEVICE=txtwrite -sOutputFile=
    output.txt input.pdf
    GPL Ghostscript 9.21 (2017-03-16)
    Copyright (C) 2017 Artifex Software, Inc.  All rights reserved.
    This software comes with NO WARRANTY: see the file PUBLIC for details.
    Processing pages 1-.
    Page 1
    Page 2
    Page 3
    Page 4
    Page 5

然而,以下Python代码返回非零退出状态1.在subprocess.check_output()中,我已删除文件名变量并直接放入文件名路径以使更多内容简单。

import subprocess, os

#path for ghostscript executable
gs_path = 'C:\\Program Files\\gs\\gs9.21\\bin'

# dir where pdfs are located
dir_name = 'C:\\Misc'

# pdf to extract text from
file_name = os.path.join(dir_name,'input.pdf')

# output text file name
outfile_name = os.path.join(dir_name,'output.txt')

os.chdir(dir_name)


subprocess.check_output(['gswin32c',
'-dBATCH', '-dNOPAUSE', '-sPageList=1-', 'sDEVICE=txtwrite',
'-sOUTPUTFILE=C:\\Misc\\output.txt',
'C:\\Misc\\input.pdf'])

Python的完整输出是(Anaconda Python 3.5):

runfile('I:/Downloads/0.data/help_pdf.py', wdir='I:/Downloads/0.data')
Traceback (most recent call last):

  File "<ipython-input-26-0ba7dc571302>", line 1, in <module>
    runfile('I:/Downloads/0.data/help_pdf.py', wdir='I:/Downloads/0.data')

  File "C:\Custom_Programs\Anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 688, in runfile
    execfile(filename, namespace)

  File "C:\Custom_Programs\Anaconda\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "I:/Downloads/0.data/help_pdf.py", line 28, in <module>
    'C:\\Misc\\input.pdf'])

  File "C:\Custom_Programs\Anaconda\lib\subprocess.py", line 316, in check_output
    **kwargs).stdout

  File "C:\Custom_Programs\Anaconda\lib\subprocess.py", line 398, in run
    output=stdout, stderr=stderr)

CalledProcessError: Command '['gswin32c', '-dBATCH', '-dNOPAUSE', '-sPageList=1-', 'sDEVICE=txtwrite', '-sOUTPUTFILE=C:\\Misc\\output.txt', 'C:\\Misc\\input.pdf']' returned non-zero exit status 1

好像它的input.pdf文件路径有问题。

1 个答案:

答案 0 :(得分:0)

您误解了上游文档。当它告诉你:

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -dGraphicsAlphaBits=4 \
    -sOutputFile=tiger.png tiger.eps

-sOutputFile=tiger.pngtiger.eps是两个独立的参数,您需要将它们传递到不同的数组位置。

以下代码已在MacOS上使用您的input.pdf成功测试:

#!/usr/bin/env python3.5
import subprocess, sys

gs = 'gswin32c' if (sys.platform == 'win32') else 'gs'
file_name = 'input.pdf'
outfile_name = 'output.txt'

subprocess.check_output([gs,
    '-dBATCH', '-dNOPAUSE', '-sPageList=1-', '-sDEVICE=txtwrite',
    '-sOUTPUTFILE=%s' % (outfile_name,), file_name])

请注意,-sDEVICE=-开头,之前的情况并非如此。