AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.01.2006, 16:27   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Печать самих файлов PDF
AXAPTA 2.5 SP3

Есть набор файлов PDF. Мне необходимо организовать печать этих файлов в определенном порядке. На первый взгляд, показалось все просто:

PHP код:
#WinAPI
while (...)
{
        
fileName = (имя очередного файла PDF);
        
WinApi::shellExecute(fileName,
                             
'',
                             
fileFolder,                             // Директория, где лежит файл
                             #ShellExePrint);

В принципе, это работает. Но! Acrobat просто не успевает корректно обрабатывать все поступающие файлы. Не успел он обработать и послать на печать один файл PDF, как ему уже подсовывают другой.

В результате, очередь на печать формируется практически в произвольном порядке.

"По хорошему", надо бы каждый раз дожидаться окончания печати одного файла и только после этого посылать на печать другой. Но Acrobat просто не закрывает свое окно по окончании печати (Acrobat 5.0 - разные "подверсии" - 5.0.1, 5.0.5). Т.е. даже зная номер процесса я не могу отследить факт окончания этого процесса, поскольку он так и не завершился.

Пока вышел из положения поставив секундную задержку

sleep(1000);

Т.е. я предполагаю, что 1 секунды должно хватить Acrobat для полной обработки одного PDF-файла. В общем, вроде бы хватает. Но ведь понятно, что дело случая. Если вдруг на загрузку файла понадобиться более 1 секунды, то опять порядок следования будет нарушен.

Есть ли какой-нибудь корректный способ отследить факт завершения печати PDF-файла? Может быть есть другие способы решения поставленной задачи?

AXAPTA 2.5 SP3
За это сообщение автора поблагодарили: DSPIC (5).
Старый 11.01.2006, 16:38   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Владимир Максимов
В принципе, это работает. Но! Acrobat просто не успевает корректно обрабатывать все поступающие файлы. Не успел он обработать и послать на печать один файл PDF, как ему уже подсовывают другой.
1. У shell есть параметр - дожидаться завершения. Вроде.
2. создайте bat-файл и подсовывайте shell'у его.
__________________
полезное на axForum, github, vk, coub.
Старый 11.01.2006, 17:01   #3  
shuhard is offline
shuhard
Участник
1C
 
31 / 15 (1) ++
Регистрация: 15.07.2005
виноват - ввод ссылок не освоил, решал через wmi , shell не годиться
//http://www.sql.ru/forum/actualthread.aspx?bid=4&tid=113360&pg=2&hl=wmi
Старый 12.01.2006, 09:37   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
База знаний ERP : Axapta / Как Запустить Приложение

Последний раз редактировалось belugin; 12.01.2006 в 09:48.
Старый 12.01.2006, 14:03   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как мне кажется, уважаемые гуру пропустили главную проблему при работе с Acrobat.

Acrobat сам НЕ ЗАКРЫВАЕТСЯ.

Это главная проблема. Бессмысленно ждать завершения этого процесса, поскольку он автоматически НИКОГДА НЕ ЗАКРОЕТСЯ.

Попробуйте дать из командной строки Windows команду вроде

AcroRd32.exe /p /h "C:\Program Files\Adobe\Acrobat 5.0\Help\ENU\acrobat.pdf"

Ключ /p - это отправка на печать, а ключ /h - это скрытый режим работы. Эту команду я взял не "с потолка", а из реестра Windows. Посмотрел, какая команда там записана при печати файлов через ShellExecute.

Наблюдается 2 глюка:
  1. Окно Acrobat открывается, несмотря на явное указание ключа /h
  2. После окончания печати, окно Acrobat остается открытым. Т.е. процесс НЕ ЗАВЕРШЕН

Это значит, что при использовании API-функций в режиме ожидания завершения процесса я просто "подвешиваю" AXAPTA. Ну, или придется ЯВНО указать время ожидания, что эквивалетно использованию функции sleep()

Ну, и у меня при запуске через приведенную по ссылке belugin функцию требует указания полного пути доступа к файлу AcroRd32.exe, что плохо как само по себе, так и с точки зрения того, что нужно ЯВНО указать имя запускающего файла. А это может быть и не AcroRd32.exe, а, например, acrobat.exe

Впрочем, это мелочи.

Таким образом, получается, что оценивать факт выполнения печати по тому, запущен Acrobat или нет просто не получается. Он не закрывается!

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

Даже через WMI это кажется не тривиальной задачей. А если учесть тот факт, что WMI - это потенциальная "дыра" в безопасности и некоторые продвинутые пользователи его просто отключают, то остается искать нужные API-функции.

В любом случае, дело это не быстрое. Пока сделал такую заплатку:

PHP код:
while (...) 

        
WinApi::shellExecute(...); 
        if (
Box::okCancel("После окончания печати (имя файла pdf)"+
                                
" нажмите кнопку \"Ok\" для продолжения печати"+
                                    
" или кнопку \"Отмена\" для прерывания печати",
                
DialogButton::Ok,
                
"Печать следующего файла",
                
"Печать следующего файл") == DialogButton::Cancel)
        {
            break;
        }


Т.е. пользователь сам контролирует время задержки. Конечно решение "не очень". Но пока я буду искать решение через API-функции, думаю, сойдет...
Старый 08.02.2006, 17:36   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Эх, неблагодарная это работа оказалась.

Написал я класс для чтения очереди на печать. Стал он контролировать факт попадания очередного задания в очередь принтера. Но тут выяснилось, что слишком медленная сеть.

Полный процесс от закачки файлов PDF с сетевого ресурса до попадания в очередь всех необходимых документов занимает около 10 минут. Пользователей это никак не устраивает.

Вот и пришлось вернуться к старой схеме, когда документы печатаются как попало, зато нет задержки в AXAPTA. Т.е. код AXAPTA не ожидает принтера. Не ждет эти самые 10 минут.

В общем, не пропадать же добру.

Класс "заточен" под конкретную проблему, поэтому как универсальное решение не пригоден, но в нем есть полноценный код считывания очереди на печать принтера по умолчанию. Можно использовать как основу, если у кого опять встанет подобная задача.
Вложения
Тип файла: xpo RTG_PrintSpooler.xpo (23.1 Кб, 731 просмотров)
За это сообщение автора поблагодарили: mazzy (18), Serge Kotov (2), Logger (2).
Старый 06.09.2007, 19:29   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Спасибо, это то что я искал.
Старый 05.05.2014, 14:36   #8  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Закрытие Acrobat при печати pdf
Добрый день.

Столкнулся с проблемой "висящего" в процессах Acrobat'а при программной отправке на печать pdf-файлов. Ниже пример реализации печати с последующим закрытием Acrobat'а. Может кому-нибудь пригодится.

X++:
static void TestPrintPdf(Args _args)
{
    System.Diagnostics.Process              printJob;
    System.Diagnostics.ProcessStartInfo     startInfo;
    FileName                                fileName = @"C:\Test.pdf";
    ;

    try
    {
        printJob = new System.Diagnostics.Process();
        startInfo = new System.Diagnostics.ProcessStartInfo();

        startInfo.set_FileName(fileName);
        startInfo.set_UseShellExecute(true);
        startInfo.set_CreateNoWindow(true);
        startInfo.set_WindowStyle(System.Diagnostics.ProcessWindowStyle::Hidden);
        startInfo.set_Verb("print");

        printJob.set_StartInfo(startInfo);
        printJob.Start();

        if (!printJob.get_HasExited())
        {
            if (!printJob.WaitForExit(5000))
                printJob.Kill();
        }

        if (printJob)
        {
            printJob.Close();
            printJob.Dispose();
        }
    }
    catch
    {
        if (printJob)
        {
            printJob.Close();
            printJob.Dispose();
        }
    }
}
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 05.05.2014 в 14:51.
За это сообщение автора поблагодарили: Logger (3), Veter (1), kpoxa (1).
Старый 07.12.2015, 15:44   #9  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Тоже столкнулись в такой проблемой. Стали использовать вот такой механизм
X++:
WinAPI::shellExecute('Foxit_Reader.exe'
                            , strFmt('/s /h /t "%1" "%2" "%3" "%4"'
                                    , _URL
                                    , printJobSettings.deviceName()
                                    , printJobSettings.printerDriverName()
                                    , printJobSettings.printerPortName()
                                    , true)
                            );
Ждем что из этого получится
Старый 17.08.2017, 10:34   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Привет.
А никто не пробовал для печати акробатовских файлов задействовать winWord из пакета Office 2013 ?
Вроде бы он это умеет. Думаю там будет проще решить проблемы с зависанием печатающей программы. С вордом таких проблем нет.
Но есть сомнения, напечатает ли word документ также как Акробат или будут искажения.
Теги
axapta, download, pdf, print management, очередь печати, печать, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
печать на AOS offenmeier DAX: Программирование 10 05.03.2013 16:55
Печать (сохранение) отчета в PDF konfet DAX: Программирование 41 12.12.2012 10:13
Печать в PDF и отправка по почте…DAX 4 Daiver DAX: Функционал 2 07.05.2010 13:51
create Pdf invoice report DmitrySincerity DAX: Программирование 1 25.03.2009 17:27
Печать в PDF GeorgeVk DAX: Прочие вопросы 3 06.08.2004 17:09
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:30.