Объединение PDF-файлов в Ghostscript со списком UNC-путей Python

#python #python-3.7

Вопрос:

Я пытаюсь создать многостраничный PDF-файл с помощью Ghostscript, объединив список одностраничных PDF-файлов из их UNC-путей к файлам (работает в Python 3.7). Вот функция:

 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"\someDirsubDirTToolsGhostscript_ToolsGS_Installgs9.54.0bingswin64c",
            '-sDEVICE=pdfwrite',
            '-dNOPAUSE',
            "-sOUTPUTFILE="   out_PDF,
            pdfPathsAsStr
            ]

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

pdf_dir = r"\someDirsubDirTToolsGhostscript_ToolsGS_TestingIndividualPages"
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:
\someDirsubDirTToolsGhostscript_ToolsGS_TestingIndividualPagesPDF_1.pdf \someDirsubDirTToolsGhostscript_ToolsGS_TestingIndividualPagesPDF_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:nnExecution stack:n   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_pushnDictionary stack:n   --dict:732/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--nCurrent allocation mode is localnLast OS error: No such file or directoryn', None)

GPL Ghostscript 9.54.0: Unrecoverable error, exit code 1
 

Я искал несколько мест для помощи с UNC-путями в Ghostscript, но не могу найти большой помощи. Я попробовал несколько вариантов pdfPathsAsStr внутренней функции, но безуспешно.

Что я делаю не так?

Комментарии:

1. Посмотрите на сообщение об ошибке Ghostscript; неопределенное имя файла в (\\\\someDir\subDir….). Где-то там вы, по-видимому, увеличиваете обратную косую черту в четыре раза, вам нужно выяснить, где это происходит. Наиболее вероятный виновник для меня выглядит как os.path.join, но на самом деле вам следует просто распечатывать строку на каждом шаге, чтобы выяснить это. Это не вопрос постскриптума или Ghostscript.

2. Спасибо @KenS, чтобы быть уверенным, следует ли передавать сетевые пути к файлам, например, как «\someDirsubDirTToolsGhostscript_ToolsGS_TestingIndividualPagesPDF_1.pdf»?

3. Я добавил несколько инструкций для печати и включил их вывод выше. @KenS, вы уверены, что это не проблема с Ghostscript? Заранее спасибо

4. Да, я уверен, что Ghostscript не добавит к пути, с которым он поставляется. Если там написано, что у вас там несколько обратных косых черт, то я бы поверил в это. Как говорит K J ниже, я всегда использую косые черты в Windows с Ghostscript; он полностью доволен » / » в качестве разделителя путей, он работает на большинстве платформ и позволяет избежать путаницы с побегами. Что касается сетевых путей, ну, GS просто использует win32 API, поэтому, если ваш сетевой путь работает с Windows, он должен быть в порядке.

Ответ №1:

Следующая команда вне python выполняется для меня без проблем.

 gswin64c -sDEVICE=pdfwrite -o"\adventshareMerged.pdf" "\adventsharecover.pdf" "\adventsharePDF 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" свою исполняемую команду