Ema112 Ответов: 2

Как печатать в PDF файл молча в ASP.NET с помощью C#?


Я получаю исключение при попытке печатать бесшумно PDF в asp.net с C#. Иногда я получаю ошибку при открытии PDF-файла. процесс не может найти указанный файл. Кроме того, я тоже не хочу, чтобы pdf-файл открывался.

Код выглядит следующим образом:
private void print()
    {
        ProcessStartInfo infoPrintPdf = new ProcessStartInfo();
        string pathPdf = @"E:\eSAFE\FileStore\PDF\Account Statement_76876876878_040111_000018473018_20160620172958468.pdf";
        infoPrintPdf.FileName = pathPdf;
        // The printer name is hardcoded here, but normally I get this from a combobox with all printers
        string printerName = @"\\10.15.0.8\NTP Printer 001 SecondFloor";
        //string printerName = "HP LaserJet Professional P1606dn";
        string driverName = "hp1100sd.dll";
        string portName = "10.15.0.23";
        infoPrintPdf.FileName = @"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe";
        infoPrintPdf.Arguments = string.Format("/t {0} \"{1}\" \"{2}\" \"{3}\"",
            pathPdf, printerName, driverName, portName);
        infoPrintPdf.CreateNoWindow = true;
        infoPrintPdf.UseShellExecute = false;
        infoPrintPdf.WindowStyle = ProcessWindowStyle.Hidden;
        Process printPdf = new Process();
        printPdf.StartInfo = infoPrintPdf;
        printPdf.Start();

        // This time depends on the printer, but has to be long enough to
        // let the printer start printing
        System.Threading.Thread.Sleep(10000);

        if (!printPdf.CloseMainWindow())              // CloseMainWindow never seems to succeed
            printPdf.Kill(); printPdf.WaitForExit();  // Kill AcroRd32.exe

        printPdf.Close();  // Close the process and release resources

    }


Что я уже пробовал:

Код выглядит следующим образом:
private void print()
    {
        ProcessStartInfo infoPrintPdf = new ProcessStartInfo();
        string pathPdf = @"E:\eSAFE\FileStore\PDF\Account Statement_76876876878_040111_000018473018_20160620172958468.pdf";
        infoPrintPdf.FileName = pathPdf;
        // The printer name is hardcoded here, but normally I get this from a combobox with all printers
        string printerName = @"\\10.15.0.8\NTP Printer 001 SecondFloor";
        //string printerName = "HP LaserJet Professional P1606dn";
        string driverName = "hp1100sd.dll";
        string portName = "10.15.0.23";
        infoPrintPdf.FileName = @"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe";
        infoPrintPdf.Arguments = string.Format("/t {0} \"{1}\" \"{2}\" \"{3}\"",
            pathPdf, printerName, driverName, portName);
        infoPrintPdf.CreateNoWindow = true;
        infoPrintPdf.UseShellExecute = false;
        infoPrintPdf.WindowStyle = ProcessWindowStyle.Hidden;
        Process printPdf = new Process();
        printPdf.StartInfo = infoPrintPdf;
        printPdf.Start();

        // This time depends on the printer, but has to be long enough to
        // let the printer start printing
        System.Threading.Thread.Sleep(10000);

        if (!printPdf.CloseMainWindow())              // CloseMainWindow never seems to succeed
            printPdf.Kill(); printPdf.WaitForExit();  // Kill AcroRd32.exe

        printPdf.Close();  // Close the process and release resources

    }

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Либо файл отсутствует в этом каталоге, либо программа не имеет достаточных разрешений для доступа к файлу.

Sergey Alexandrovich Kryukov

..и что еще более важно, получить доступ к принтеру (который может существовать, а может и не существовать).
См. Решение 1.
—СА

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Просто понял, что он помечен ASP.NET. :P

Ema112

Проблема возникает, когда длина имени файла больше. Я имею в виду, если имя файла pdf-xyz.pdf (никаких проблем), но если, скажем, возникает проблема Account Statement_dsdsd_1.pdf.

2 Ответов

Рейтинг:
17

Sergey Alexandrovich Kryukov

Вы не можете ничего делать молча в веб-приложении по довольно очевидным причинам. Представьте себе на секунду, что вы нашли какой-то трюк, чтобы использовать принтер клиента молча, что, во-первых, означает использование принтера (который может существовать или даже не существовать) без согласия пользователя; а затем представьте, что пользователь понял, почему это происходит. Я сомневаюсь, что пользователь будет использовать ваш сайт снова.

Даже в настольном приложении ничто не должно печататься бесшумно: 1) принтер принадлежит пользователю, а не вашему приложению; 2) печать всегда должна быть редким событием; поскольку вычислительная техника прокладывает свой путь в общество, люди печатают меньше и экономят бумагу и тонер; сознательное принуждение пользователя к печати является своего рода преступлением.

Более того, PDF не является веб-контентом; он не является частью стандарта W3. Не смущайтесь тем фактом, что браузер часто показывает PDF как веб-страницу; это все нестандартная функция. Поэтому для PDF лучшая стратегия-просто предоставить PDF-файл в обычном HTML-якоре. Пользователь лучше знает, что с ним делать. Печать этого ресурса - это работа для программного обеспечения PDF, которого у вас нет и которым вы не управляете; только пользователь управляет этим материалом.

—СА


rahul234

Ok. Print идет нормально, без каких-либо интервалов между именем файла PDF.Можно ли сохранить всплывающее окно adobe reader при запуске процесса печати?

Sergey Alexandrovich Kryukov

Нет, не имеет.
См. также Решение 2. Это все равно не имеет смысла, независимо от размера файла интервала...
—СА

Рейтинг:
1

Dave Kreskowiak

Вы, кажется, упускаете концепцию. Это работает и отлично печатается на вашей машине разработки. При развертывании этого веб-приложения на рабочем веб-сервере оно не будет работать как ASP.NET код работает полностью на стороне сервера, никогда на клиенте, и не будет иметь доступа к каким-либо принтерам, подключенным к клиентской машине.

Если у вас нет принтера, подключенного к веб-серверу (я серьезно сомневаюсь в этом и рекомендую не делать этого), вы не можете ничего печатать с помощью этого кода.


Sergey Alexandrovich Kryukov

5! - СА