Тихая печать PDF с Adobe Acrobat - PullRequest
       4

Тихая печать PDF с Adobe Acrobat

16 голосов
/ 02 февраля 2011

У меня 2 проблемы при попытке напечатать pdf-файл в C # с использованием Adobe Acrobat. Я печатаю PDF-файлы с помощью Process.Start ().

Первая проблема заключается в том, что я не могу запустить Adobe Acrobat без указания полного пути к исполняемому файлу. Я предполагаю, что это не добавляет его к вашему пути при установке. Существует ли простой способ запуска новейшей версии acrobat на компьютере без указания полных имен путей? Я беспокоюсь, что клиент собирается сделать обновление и сломать мой код, который запускает это. Я также обеспокоен их установкой на компьютерах с различными версиями Windows (пути установки отличаются в 64-битной среде и 32-битной).

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

Я пытаюсь запустить Adobe Acrobat из командной строки со следующим синтаксисом:

C: \ Program Files (x86) \ Adobe \ Reader 10.0 \ Reader> AcroRd32.exe / t "Label.pdf" "HP4000" "HP LaserJet 4100 Series PCL6" "out.pdf"

Он печатается нормально, но все еще оставляет окно акробата вверх. Есть ли какое-либо иное решение, кроме как выйти и убить процесс программно?

Ответы [ 9 ]

25 голосов
/ 02 февраля 2011

Я остановился на Adobe Acrobat и пошел с FoxIt Reader (Free pdf reader), чтобы распечатать PDF-файл. Это код, который я использую для печати через FoxIt в C #:

Process pdfProcess = new Process();
pdfProcess.StartInfo.FileName = @"C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe";
pdfProcess.StartInfo.Arguments = string.Format(@"-p {0}", fileNameToSave);
pdfProcess.Start();

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

Foxit Reader.exe -t "pdf filename" "имя принтера"

Обновление:

Очевидно, в более ранних версиях acrobat также не было проблемы, описанной выше. Если вы используете более старую версию (4.x или что-то подобное), это не демонстрирует эту проблему.

Некоторые принтеры также поддерживают собственную печать PDF, поэтому можно отправлять необработанные данные PDF на принтер, и он может их распечатать. См. https://support.microsoft.com/en-us/kb/322091 для отправки необработанных данных на принтер.

Обновление 2

В более поздних версиях нашего программного обеспечения мы использовали платный продукт:

http://www.pdfprinting.net/

9 голосов
/ 05 марта 2015

Мне очень понравился ответ Ника, поэтому я перевел его на c #. Это работает!

using System.Diagnostics;

namespace Whatever
{
static class pdfPrint
{
    public static void pdfTest(string pdfFileName)
    {
       string processFilename = Microsoft.Win32.Registry.LocalMachine
            .OpenSubKey("Software")
            .OpenSubKey("Microsoft")
            .OpenSubKey("Windows")
            .OpenSubKey("CurrentVersion")
            .OpenSubKey("App Paths")
            .OpenSubKey("AcroRd32.exe")
            .GetValue(String.Empty).ToString();

        ProcessStartInfo info = new ProcessStartInfo();
        info.Verb = "print";
        info.FileName = processFilename;
        info.Arguments = String.Format("/p /h {0}", pdfFileName);
        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden; 
        //(It won't be hidden anyway... thanks Adobe!)
        info.UseShellExecute = false;

        Process p = Process.Start(info);
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        int counter = 0;
        while (!p.HasExited)
        {
            System.Threading.Thread.Sleep(1000);
            counter += 1;
            if (counter == 5) break;
        }
        if (!p.HasExited)
        {
            p.CloseMainWindow();
            p.Kill();
        }
    }
}

}

8 голосов
/ 19 августа 2014

В Acrobat Reader 8.1.3 и Acrobat Pro 11.0.06 проверено следующее:

  1. Находит исполняемый файл Acrobat по умолчанию в системе
  2. Отправляет файл на локальный принтер
  3. Закрывает Acrobat независимо от версии

string applicationPath;

var printApplicationRegistryPaths = new[]
{
    @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe",
    @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRD32.exe"
};

foreach (var printApplicationRegistryPath in printApplicationRegistryPaths)
{
    using (var regKeyAppRoot = Registry.LocalMachine.OpenSubKey(printApplicationRegistryPath))
    {
        if (regKeyAppRoot == null)
        {
            continue;
        }

        applicationPath = (string)regKeyAppRoot.GetValue(null); 

        if (!string.IsNullOrEmpty(applicationPath))
        {
            return applicationPath;
        }
    }
}

// Print to Acrobat
const string flagNoSplashScreen = "/s";
const string flagOpenMinimized = "/h";

var flagPrintFileToPrinter = string.Format("/t \"{0}\" \"{1}\"", printFileName, printerName); 

var args = string.Format("{0} {1} {2}", flagNoSplashScreen, flagOpenMinimized, flagPrintFileToPrinter);

var startInfo = new ProcessStartInfo
{
    FileName = printApplicationPath, 
    Arguments = args, 
    CreateNoWindow = true, 
    ErrorDialog = false, 
    UseShellExecute = false, 
    WindowStyle = ProcessWindowStyle.Hidden
};

var process = Process.Start(startInfo);

// Close Acrobat regardless of version
if (process != null)
{
    process.WaitForInputIdle();
    process.CloseMainWindow();
}
5 голосов
/ 29 января 2016

Я попробовал и Adobe Reader, и Foxit без удачи. Текущие версии обоих очень любят открывать окна и оставлять процессы запущенными. Закончилось использованием Sumatra PDF , что очень ненавязчиво. Вот код, который я использую. По завершении печати никаких следов окон и процесса не происходит.

    public static void SumatraPrint(string pdfFile, string printer)
    {
        var exePath = Registry.LocalMachine.OpenSubKey(
            @"SOFTWARE\Microsoft\Windows\CurrentVersion" +
            @"\App Paths\SumatraPDF.exe").GetValue("").ToString();

        var args = $"-print-to \"{printer}\" {pdfFile}";

        var process = Process.Start(exePath, args);
        process.WaitForExit();
    }
4 голосов
/ 01 декабря 2013

получил другое решение ... его комбинацию других фрагментов из stackOverflow.Когда я вызываю CloseMainWindow, а затем вызываю Kill .. Adobe закрывается

    Dim info As New ProcessStartInfo()
    info.Verb = "print"
    info.FileName = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows").OpenSubKey("CurrentVersion").OpenSubKey("App Paths").OpenSubKey("AcroRd32.exe").GetValue(String.Empty).ToString()
    info.Arguments = String.Format("/p /h {0}", "c:\log\test.pdf")
    info.CreateNoWindow = True
    info.WindowStyle = ProcessWindowStyle.Hidden
    info.UseShellExecute = False

    Dim p As Process = Process.Start(info)
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

    Dim counter As Integer = 0
    Do Until p.HasExited
        System.Threading.Thread.Sleep(1000)
        counter += 1
        If counter = 5 Then
            Exit Do
        End If
    Loop
    If p.HasExited = False Then
        p.CloseMainWindow()
        p.Kill()
    End If
3 голосов
/ 17 ноября 2011

Если вы используете Acrobat Reader 4.0, вы можете сделать следующее: «C: \ Program Files \ Adobe \ Acrobat 4.0 \ Reader \ Acrord32.exe» / t / s «U: \ PDF_MS \ SM003067K08.pdf» Planning_H2, НОесли файл PDF был создан в более новой версии Acrobat, открывается невидимое окно

3 голосов
/ 02 февраля 2011

Задача 1

Возможно, вы сможете обойти реестр.В HKEY_CLASSES_ROOT\.pdf\PersistentHandler\(Default) вы должны найти CLSID, который указывает на значение, найденное в одном из двух мест.Либо папка CLSID того же ключа, либо (для 64-разрядных систем) на один шаг вниз по Wow6432Node\CLSID, а затем по этому ключу CLSID.

Внутри этого ключа вы можете найти LocalServer32 и найдите строковое значение по умолчанию, указывающее на текущий путь к исполняемому файлу.

Я не на все 100%, но кажется правдоподобным (хотя вам придется проверять в нескольких средах, чтобы подтвердить, чтофактически находит искомый процесс).

(Вот документы по задействованным ключам реестра относительно PersistentHandlers )

Проблема2

Возможно, с использованием CreateNoWindow процесса StartInfo.

Process p = new Process();
p.StartInfo.FileName = @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe";
p.StartInfo.Arguments = "/t \"Label.pdf\" \"HP4000\" \"HP LaserJet 4100 Series PCL6\" \"out.pdf\"";
p.CreateNoWindow = true;
p.Start();
p.WaitForExit();

(однако, это только предположение, но я уверен, что небольшое тестирование покажет, что оно работает/ не работает)

0 голосов
/ 17 октября 2018

Для задачи 2

Использование параметра / h откроет Acrobat или Adobe Reader в свернутом окне.

Пример: C:\Program Files (x86)\Adobe\Reader 10.0\Reader>AcroRd32.exe **/h** /t "Label.pdf" "HP4000" "HP LaserJet 4100 Series PCL6" "out.pdf"

Сопутствующая документация: https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/Acrobat_SDK_developer_faq.pdf#page=24

0 голосов
/ 15 июня 2016

Вы уже пробовали что-то отличное от Acrobat Reader, поэтому я советую забыть о приложениях с графическим интерфейсом и использовать сторонний инструмент командной строки, например RawFilePrinter.exe

private static void ExecuteRawFilePrinter() {
    Process process = new Process();
    process.StartInfo.FileName = "c:\\Program Files (x86)\\RawFilePrinter\\RawFilePrinter.exe";
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    process.StartInfo.Arguments = string.Format("-p \"c:\\Users\\Me\\Desktop\\mypdffile.pdf\" \"Canon Printer\"");

    process.Start();
    process.WaitForExit();
    if (process.ExitCode == 0) {
            //ok
    } else {
            //error
    }
}

Последняя версия для скачивания: http://effisoft.pl/rawfileprinter

...