C # Предотвращение появления окна Adobe Reader при попытке распечатать документ - PullRequest
5 голосов
/ 01 апреля 2011

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

if (RegistryManager.GetAcrobatVersion() >= 9.0f)
    printerArg = "\"" + printerName + "\"";
else
    printerArg = printerName;

Process myProc = new Process();
myProc.StartInfo.FileName = fileName;
myProc.StartInfo.Verb = "printto";
myProc.StartInfo.UseShellExecute = true;
myProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProc.StartInfo.CreateNoWindow = true;
myProc.StartInfo.Arguments = "\"" + printerName + "\"";


bool result = myProc.Start();


if (myProc.WaitForInputIdle())
{
    if (!myProc.HasExited)
    {
        myProc.WaitForExit(Convert.ToInt32(5000));
        myProc.Kill();
    }
}
myProc.Close();

Любая помощь очень ценится!

Спасибо,
Тея.

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Хотя я не могу ответить на ваш вопрос конкретно, я обнаружил, что не смог этого сделать, так как Adobe изменила Reader, я думаю, в версии 9 или 10, чтобы вы не могли закрыть диалог печати, а само окно продолжало появлятьсяв любом случае, и так как у всех моих пользователей были установлены разные версии Reader, я не мог получить что-либо постоянно работающее.Если вы хотите попробовать в любом случае, взгляните на API Reader - вам нужно добавить ссылку на правильную библиотеку COM и перейти оттуда.Больно.

В итоге я полностью отбросил Adobe, пропустив PDF через GhostScript .Ниже приводится вспомогательный класс, который я создал для выполнения этой работы.gsExePath должно быть что-то вроде C:\Program Files\gs\gs8.71\bin\gswin32c.exe.

public class GSInterface
{
    public string GhostScriptExePath { get; private set; }

    public GSInterface(string gsExePath)
    {
        this.GhostScriptExePath = gsExePath;
    }

    public virtual void CallGhostScript(string[] args)
    {
        var p = new Process();
        p.StartInfo.FileName = this.GhostScriptExePath;
        p.StartInfo.Arguments = string.Join(" ", args);
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        p.Start();
        p.WaitForExit();
    }


    public void Print(string filename, string printerName)
    {
        this.CallGhostScript(new string[] {
            "-q",
            "-sDEVICE=mswinpr2",
            "-sPAPERSIZE=a4",
            "-dNOPAUSE",
            "-dNoCancel",
            "-dBATCH",
            "-dDuplex",
            string.Format(@"-sOutputFile=""\\spool\{0}""", printerName),
            string.Format(@"""{0}""", filename)
        });
    }
}

Следующее должно печатать на принтере Windows по умолчанию:

var printerName = new System.Drawing.Printing.PrinterSettings().PrinterName;
var gs = new GSInterface(gsExePath);
gs.Print(filename, printername);
2 голосов
/ 24 июня 2011

Это может относиться только к компьютерам, на которых я работаю, или, в более широком смысле, к этой версии Adobe (10) на ПК с установленной Windows 7, но мне удавалось отменить открытие Acrobat (Pro) каждый раз, когда яраспечатать в .pdf в любом другом приложении, выполнив следующие действия:

Панель управления> (Устройства и) Принтеры> Дважды щелкните «Adobe PDF»> Нажмите «Принтер»> «Параметры печати»> Снимите флажок «Просмотреть Adobe PDF»Результаты »на вкладке« Настройки Adobe PDF ».

1 голос
/ 10 января 2012

Возможно, вам будет полезно использовать параметр / n в Adobe Reader.По крайней мере, ваша программа сохраняет фокус.Но один экземпляр читателя остается открытым.

AcroRd32.exe /n /t ...

См .: Вопросы 619158

...