【问题标题】:Merge PDFs in Ghostscript with Python list of UNC Paths将 Ghostscript 中的 PDF 与 UNC 路径的 Python 列表合并
【发布时间】:2021-10-15 18:08:01
【问题描述】:

我正在尝试使用 Ghostscript 通过组合来自其 UNC 文件路径的单页 PDF 列表(在 Python 3.7 中工作)来构建多页 PDF。 这是函数:

import subprocess
import os

def ghostscript_merge_pdfs(in_PDF_list, out_PDF):
    """some doc string"""
    # pdfPathsAsStr = '"' + ' "'.join(f'{pdf}"' for pdf in in_PDF_list)
    pdfPathsAsStr = ' '.join(pdf for pdf in in_PDF_list)

    print("The 'pdfPathsAsStr' variable is:")
    print(pdfPathsAsStr + "\n")

    args = [r"\\someDir\subDir\T\Tools\Ghostscript_Tools\GS_Install\gs9.54.0\bin\gswin64c",
            '-sDEVICE=pdfwrite',
            '-dNOPAUSE',
            "-sOUTPUTFILE=" + out_PDF,
            pdfPathsAsStr
            ]

    p = subprocess.Popen(args, stdout=subprocess.PIPE)
    print("\nCompleted: \n" + str(p.communicate()))

pdf_dir = r"\\someDir\subDir\T\Tools\Ghostscript_Tools\GS_Testing\IndividualPages"
out_pdf_path = os.path.join(pdf_dir, "Combo_PDF.pdf")

pdfs_list = [os.path.join(pdf_dir, "PDF_1.pdf"), os.path.join(pdf_dir, "PDF_2.pdf")]

ghostscript_merge_pdfs(pdfs_list, out_pdf_path)

脚本输出以下内容(请注意,pdfPathsAsStr 中的斜线不重复):

The 'pdfPathsAsStr' variable is:
\\someDir\subDir\T\Tools\Ghostscript_Tools\GS_Testing\IndividualPages\PDF_1.pdf \\someDir\subDir\T\Tools\Ghostscript_Tools\GS_Testing\IndividualPages\PDF_2.pdf


Completed: 
(b'GPL Ghostscript 9.54.0 (2021-03-30)\nCopyright (C) 2021 Artifex Software, Inc.  All rights reserved.\nThis software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:\nsee the file COPYING for details.\nError: /undefinedfilename in (\\\\\\\\someDir\\\\subDir\\\\T\\\\Tools\\\\Ghostscript_Tools\\\\GS_Testing\\\\IndividualPages\\\\PDF_1.pdf \\\\\\\\someDir\\\\subDir\\\\T\\\\Tools\\\\Ghostscript_Tools\\\\GS_Testing\\\\IndividualPages\\\\PDF_2.pdf)\nOperand stack:\n\nExecution stack:\n   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push\nDictionary stack:\n   --dict:732/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--\nCurrent allocation mode is local\nLast OS error: No such file or directory\n', None)

GPL Ghostscript 9.54.0: Unrecoverable error, exit code 1

我在 Ghostscript 中寻找了一些关于 UNC 路径的帮助,但找不到太多帮助。我在函数内部尝试了pdfPathsAsStr 的几种变体,但没有成功。

我做错了什么?

【问题讨论】:

  • 查看Ghostscript错误信息; (\\\\\\\\someDir\\\\subDir....) 中未定义的文件名。在那里的某个地方,你显然将反斜杠翻了两番,你需要找出发生在哪里。对我来说最可能的罪魁祸首是 os.path.join 但实际上,您应该在每一步打印出字符串以找出答案。这不是 PostScript 或 Ghostscript 问题。
  • 感谢@KenS,可以肯定的是,是否应该传递网络文件路径,例如“\\someDir\subDir\T\Tools\Ghostscript_Tools\GS_Testing\IndividualPages\PDF_1.pdf”?
  • 我添加了一些打印语句,并将它们的输出包含在上面。 @KenS,您确定这不是 Ghostscript 问题吗?提前致谢
  • 是的,我敢肯定,Ghostscript 不会添加到它提供的路径中。如果它说你那里有多个反斜杠,那么我会相信它。正如 K J 下面所说,我总是在 Windows 上使用 Ghostscript 使用正斜杠;它对 '/' 作为路径分隔符非常满意,它适用于大多数平台并避免与转义混淆。至于网络路径,好吧 GS 只是使用 win32 API,所以如果你的网络路径适用于 Windows 应该没问题。

标签: python python-3.7


【解决方案1】:

以下命令在python之外对我来说运行没问题。

gswin64c -sDEVICE=pdfwrite -o"\\advent\share\Merged.pdf" "\\advent\share\cover.pdf" "\\advent\share\PDF files in a folder.pdf"

显示远程 windows 文件夹对于 Ghostscript 输入或输出不是问题。

你的问题是python处理windows路径的方式,可以通过反转文件夹名称来最小化,这样只有服务器名称需要windows中的\\前缀。

gswin64c -sDEVICE=pdfwrite -o"\\advent/share/Merged.pdf" "\\advent/share/cover.pdf" "\\advent/share/PDF files in a folder.pdf"

因此,在 python 中,在需要时使用 \\\\ 作为服务器前缀,但在路径中使用 / 以使生活更轻松(是的,我知道这不是最佳实践,但寿命很短,而且键盘的 rsi 较少)。

要测试 cmd 从 python 得到什么,只需运行 cmd /k echo "\\\\blah/blah" 作为您的可执行命令

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多