Печать PDF файлов из командной строки Windows

Я пытаюсь распечатать все pdf файлы в текущем каталоге. Когда я называю это bash script в cmd (singlepdf.sh): '"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"' /t Gemeinde_348_BioID_842_alt.pdf все работает нормально.

При вызове multiplepdfs.sh с этим контентом:

declare -a pdfs=(*.pdf)

for pdf in ${pdfs[@]}; do
  echo -e "\nprinting **$pdf** with AcroRd32.exe...\n"
  '"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"' /t $pdf
  sleep 3
done

Эхо показывает, что файлы правильно адресуются в цикле, но затем я получаю сообщение об ошибке "C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe": No such file or directory

Может ли кто-нибудь помочь в решении этой проблемы?

Edit: BTW, у меня установлен msys mingw

Ответ 1

Я знаю, что это старый вопрос, но недавно я столкнулся с той же проблемой, и ни один из ответов не помог мне:

  • Не удалось найти старую версию Foxit Reader
  • Как сказал @pilkch, 2Printer добавляет страницу отчета
  • Adobe Reader открывает графический интерфейс

После поиска немного больше я нашел это: http://www.columbia.edu/~em36/pdftoprinter.html.

Это простой exe, который вы вызываете с именем файла, и он печатает на принтер по умолчанию (или тот, который вы укажете). С сайта:

PDFtoPrinter - это программа для печати файлов PDF из командной строки Windows. Программа предназначена в основном для командной строки Windows, а также для использования с эмулятором vDos DOS.

Чтобы распечатать файл PDF на принтере Windows по умолчанию, используйте эту команду:

PDFtoPrinter.exe filename.pdf

Чтобы распечатать на определенном принтере, добавьте имя принтера в кавычках:

PDFtoPrinter.exe filename.pdf "Name of Printer"

Если вы хотите печатать на сетевом принтере, используйте имя, которое появляется в диалоговых окнах печати Windows, например, так (обратите внимание на две обратные косые черты в начале имени и одну обратную косую черту после имени сервера):

PDFtoPrinter.exe filename.pdf "\\SERVER\PrinterName"

Ответ 2

У меня было две проблемы с использованием Acrobat Reader для этой задачи.

  • API командной строки официально не поддерживается, поэтому он может быть изменен или удален без предупреждения.
  • Отправьте команду печати, чтобы Reader загрузил графический интерфейс, по-видимому, не смог предотвратить его. Мне нужно, чтобы процесс был прозрачным для пользователя.

Я наткнулся на этот блог, который предлагает использовать Foxit Reader. Foxit Reader свободен, API почти идентичен Acrobat Reader, но он действительно документирован и не загружает графический интерфейс для заданий на печать.

Слово предупреждения, не просто щелкните процесс установки, не обращая внимания, оно также пытается установить несвязанное программное обеспечение. Почему производители программного обеспечения все еще делают это?

Ответ 3

Первый ответ - хотел наконец вернуть полезное сообщество...

Хотелось добавить это в ответы для людей, которые все еще ищут простое решение. Я использую бесплатный продукт от Foxit Software - FoxItReader.
Вот ссылка на версию, которая работает с бесшумными печатными версиями, функция бесшумной печати все еще не работает. FoxitReader623.815_Setup

FOR %%f IN (*.pdf) DO ("C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe" /t %%f "SPST-SMPICK" %%f & del %%f) 

Я просто создал команду для циклического перемещения по каталогу и для каждого файла pdf (FOR %% f IN *.pdf), чтобы открыть читатель молча (/t), получите следующий PDF (%% f) и отправьте его на очереди печати (SPST-SMPICK), а затем удалите каждый PDF после отправки его в очередь печати (del %% f). Shashank показал пример перемещения файлов в другой каталог, если это то, что вам нужно сделать

FOR %%X in ("%dir1%*.pdf") DO (move "%%~dpnX.pdf" p/)

Ответ 4

Сообщается вам сообщение об ошибке.

Попробуйте просто

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" /t "$pdf"

Когда вы вставляете строку в одиночные кавычки, это делает все внутри допустимой строки, включая символы ". Удалив одинарные кавычки, оболочка будет обрабатывать dbl-кавычки как строки "обертки".

Я бы также обернул переменную filename в dbl-кавычки, чтобы вы могли легко обрабатывать файлы с пробелами в своих именах, т.е.

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" /t "$pdf"

IHTH

Ответ 5

Похоже, вам не хватает имени принтера, драйвера и порта - в этом порядке. Ваша последняя команда должна напоминать:

AcroRd32.exe /t <file.pdf> <printer_name> <printer_driver> <printer_port>

Например:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /t "C:\Folder\File.pdf" "Brother MFC-7820N USB Printer" "Brother MFC-7820N USB Printer" "IP_192.168.10.110"

Примечание. Чтобы найти информацию о принтере, щелкните правой кнопкой мыши принтер и выберите свойства. В моем случае, указанном выше, имя принтера и имя драйвера совпадают, но ваша информация может отличаться.

Ответ 6

У меня была аналогичная проблема с печатью нескольких файлов PDF в строке и нашла только обходное решение с помощью программного обеспечения 2Printer. Пример командной строки для печати PDF файлов:

2Printer.exe -s "C:\In\*.PDF" -prn "HP LasetJet 1100"

Бесплатно для некоммерческого использования http://doc2prn.com/

Ответ 7

Использование Acrobat Reader не является хорошим решением, особенно атрибуты командной строки не задокументированы. Кроме того, окно Acrobat Reader остается открытым после процесса печати. PDF файлы хорошо известны драйверам принтера, поэтому вы можете найти лучшие инструменты, такие как 2Printer.exe или RawFilePrinter.exe. На мой взгляд, RawFilePrinter имеет лучшую поддержку и понятный процесс лицензирования (вы платите пожертвование один раз, и вы можете распространять RawFilePrinter во многих проектах, которые вам нравятся - даже новые версии работают с ранее приобретенной лицензией)

RawFilePrinter.exe -p "c:\Users\Me\Desktop\mypdffile.pdf" "Canon Printer" 
IF %ERRORLEVEL% 1(
    echo "Error!"
)

Последняя версия для загрузки: http://bigdotsoftware.pl/index.php/rawfileprinter

Ответ 8

@ECHO off set "dir1=C:\TicketDownload" 
FOR %%X in ("%dir1%*.pdf") DO ( "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe" /t "%%~dpnX.pdf" "Microsoft XPS Document Writer" ) 
FOR %%X in ("%dir1%*.pdf") DO (move "%%~dpnX.pdf" p/)

Попробуйте это. Возможно, у вас есть другая версия Reader, поэтому проблема.

Ответ 9

Сегодня я искал именно это решение и попробовал PDFtoPrinter, с которым у меня возникла проблема (PDF файлы, которые я пробовал печатать, предполагали, что они использовали неверный формат бумаги, из-за которого зависало задание на печать, и ничего больше не печаталось до разрешения). Пытаясь найти альтернативу, я вспомнил GhostScript и связанные с ним утилиты. Я нашел GSView и связанную с ним программу GSPrint (ссылка https://www.ghostscript.com/). И то, и другое требует GhostScript (https://www.ghostscript.com/), но когда все компоненты установлены, GSPrint работал безупречно, и мне удалось создать запланированное задание, которое автоматически печатало PDF файлы в одночасье.

Ответ 10

Вот еще одно решение:

1) Загрузить SumatraPDF (портативная версия) - https://www.sumatrapdfreader.org/download-free-pdf-viewer.html

2) Создайте проект библиотеки классов, разархивируйте SumatraPDF.exe в корневой каталог проекта и разблокируйте его.

3) В свойствах проекта перейдите на вкладку Resoruces и добавьте исполняемый файл в виде файла.

4) Добавьте следующий класс в свою библиотеку:

public class SumatraWrapper : IDisposable
{
    private readonly FileInfo _tempFileForExe = null;
    private readonly FileInfo _exe = null;

    public SumatraWrapper()
    {
        _exe = ExtractExe();
    }

    public SumatraWrapper(FileInfo tempFileForExe)
        : this()
    {
        _tempFileForExe = tempFileForExe ?? throw new ArgumentNullException(nameof(tempFileForExe));
    }

    private FileInfo ExtractExe()
    {
        string tempfile = 
            _tempFileForExe != null ? 
            _tempFileForExe.FullName : 
            Path.GetTempFileName() + ".exe";

        FileInfo exe = new FileInfo(tempfile);
        byte[] bytes = Properties.Resources.SumatraPDF;

        using (FileStream fs = exe.OpenWrite())
        {
            fs.Write(bytes, 0, bytes.Length);
        }

        return exe;
    }

    public bool Print(FileInfo file, string printerName)
    {
        string arguments = $"-print-to \"{printerName}\" \"{file.FullName}\"";
        ProcessStartInfo processStartInfo = new ProcessStartInfo(_exe.FullName, arguments)
        {
            CreateNoWindow = true
        };
        using (Process process = Process.Start(processStartInfo))
        {
            process.WaitForExit();
            return process.ExitCode == 0;
        }
    }

    #region IDisposable Support
    private bool disposedValue = false; // To detect redundant calls

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // TODO: dispose managed state (managed objects).
            }

            // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
            // TODO: set large fields to null.
            try
            {
                File.Delete(_exe.FullName);
            }
            catch
            {

            }

            disposedValue = true;
        }
    }

    // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
    // ~PdfToPrinterWrapper() {
    //   // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
    //   Dispose(false);
    // }

    // This code added to correctly implement the disposable pattern.
    public void Dispose()
    {
        // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
        Dispose(true);
        // TODO: uncomment the following line if the finalizer is overridden above.
        // GC.SuppressFinalize(this);
    }
    #endregion
}

5) Наслаждайтесь печатью PDF файлов из своего кода.

Используйте как это:

FileInfo file = new FileInfo(@"c:\Sandbox\dummy file.pdf");
SumatraWrapper pdfToPrinter =
    new SumatraWrapper();
pdfToPrinter.Print(file, "My Printer");

Ответ 11

Еще одно решение "из коробки"

FOR %X in ("*.pdf") DO (C:\Windows\System32\print.exe /d:"\\printername" "%X.pdf")