Печать в PDF используя PDFCreator, Ghostscript, RedMon




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

38 Comments

  1. AklexK

    PDFCreator должен быть установлен на компе пользователя

    Reply
  2. CheBurator

    Не очень… вроде же пдфкреатор поддерживает сетевую установку…

    ??

    Reply
  3. AklexK

    через общий доступ не пробовали

    Reply
  4. AklexK

    Для общего доступа к принтеру необходимо установить PDFCreator в режиме сервера и получать файлы из папки сервера \servPDFs<REDMON_MACHINE><REDMON_USER>\

    Reply
  5. kudenzov

    хорошая альтернатива платному Adobe

    Reply
  6. CheBurator

    <REDMON_MACHINE> — ???

    <REDMON_USER> — ???

    Reply
  7. kudenzov

    <REDMON_MACHINE> — netbios Имя машины

    <REDMON_USER> — имяпользователя

    PDFCreator по умолчанию при серверной установке помещает файлы в данные папки, на диске сервера:

    C:PDFs<REDMON_MACHINE><REDMON_USER>\r

    сделав данную папку Shared — можете забтрать файлы после печати

    Reply
  8. ZLENKO

    Приятная особенность PDFCreator в том что можно файл сразу вкладывать как вложение в письмо типа mailto. Я так автоотсылку счетов клиентам делал одновременно с печатью счета на бумаге. Вот только закрыть доступ на редактирование PDF файла не удалось — похоже глюк.

    Reply
  9. dsa046

    Z1C, а не осталось примерчика? Сейчас примено над такой же задачей бьюсь — печать оригиналов и одновременная рассылка по почте электронных вариантов.

    Reply
  10. foxey

    А как из 8-ки напечатать в PDFCreator?

    Reply
  11. AklexK

    1. вывод на принтер PDFCreator

    2. Когда-то делал рассылку факсов и e-mail http://alkud.boom.ru/1c_faks.htm

    (работет и сейчас) — можно переделать под PDFCreator

    Reply
  12. dsa046

    AklexK , прикольная штука получилась, судя по описанию… Только для 8-ки бы исходник.

    Люди делал кто-нить рассылку через PDF на e-mail из 8-ки? Поделитесь примерчиком плиз!!!

    Reply
  13. Душелов

    (12) А поиском воспользоваться религия не позволяет?

    http://infostart.ru/blogs/605/

    http://infostart.ru/projects/3138/

    Reply
  14. minimaxpo
    Reply
  15. AklexK

    Можно вообще обойтись без PDFCreator, используя только Ghostscript,RedMon и script для RedMon

    Методика здесь

    http://club.shelek.ru/viewart.php?id=209

    Reply
  16. AklexK

    Если ОбработкаПрерыванияПользователя() вставлять, то флажок

    Неудалось = 1 надо бы поставить

    Reply
  17. d_borovikov

    Работа PDFCreator для терминальных пользователей Windows server 2003 +1C 7.7 возможна. PDFCreator установлен только на Windows server 2003 (в обычном/клиентском режиме)

    Необходимо сделать следующее:

    1. Для каждого из терминальных пользователей разрешаем права на запись/чтение в реестре по ветке HKEY_CURRENT_USER () (используем редактор реестра REGEDIT

    2. Заходим под каждым терминальным пользователем и с помощью редактора реестра REGEDIT дописываем ветку HKEY_CURRENT_USERSoftwarePDFCreatorProgram\r

    далее создаем New -> String Value = Language Value data=russian

    3. Перегружаем Windows server 2003

    …. пользуемся

    …. можно сделать заплатку для реестра и при каждом запуске терминального пользователя — добавлять эту ветку реестра. (заниматься нет времени, но задача решена)

    Reply
  18. Fomania
    minimax пишет:

    Переписал для 8.1

    Спасибо, то что нужно как раз! Только в макет документа я вставила рисунки — печать и подписи. Почему-то при печати в PDF из программы они оказываются на черном фоне вместо прозрачного. Если сначала сохранить документ в Excel, а оттуда отправить в PDFCreator (вручную, не программно), то все нормально. Почти. Печать только немного приплюснута сверху. Подскажите, как это исправить можно?

    Reply
  19. VicGuru

    Спасибо, то что искал!

    Reply
  20. Amorfus

    Использовал для массовой рассылки pdf-ин по почте. Все работает отлично.

    Reply
  21. TrinitronOTV

    ух ты, вот я наткнулся удачно, спасибо большое

    Reply
  22. kudenzov

    Вот дополнение к конфигурации оформленное на базе данного решения

    http://infostart.ru/public/19326/

    или

    http://genrep.net/1c_faks.htm

    Reply
  23. hanio

    А подскажите если задача стоит таким образом — есть файлы качественных сертификатов в PDF их надо печатать из документа реализация, это я все реализовал путем ЗапуститьПриложение() где происходит тихий запуск, печать и закрытие Adobe Reader , но тут момент что открываются они все и разом отследить момент закрытия Adobe я не знаю как. Итог — все сертификаты, а некоторые весят под 25 мегабайт толкаются в Adobe Reader, собственно съедают всю оперативку и понятное дело на принтер проталкиваются оооочень медленно. Подскажите решение какое мне тут подходит больше всего? Понятно что я сделал не через COM соединение, а будет ли выигрыш в нем? и будет ли выигрыш при использовании виртуального принтера?

    Reply
  24. bober1

    nf lf

    Reply
  25. ediks

    (23) Мне кажется, что в Вашем случае проще использовать ActiveX Acrobat reader. Кинуть на форму печати компоненту Акробата. Что типа

    ИсходныйФайл = Новый Файл(ИмяФайла);

    Если Не ИсходныйФайл.Существует() Тогда Возврат; КонецЕсли;

    ЭлементыФормы.Акробат.LoadFile(ИмяФайла);

    ЭлементыФормы.Акробат.Print();

    Reply
  26. Izolda

    Спасибо обработка очень помогла

    Reply
  27. Izolda

    Спасибо очень помогло используем PDFCreatorт.к. он бесплатный и поддерживает цифровую подпись

    Reply
  28. user1316756

    Требуется файл in.pdf преобразовать в файл out.jpg с помощью командной строки бесплатно.

    Как это сделать ? Вознаграждение 1500р

    Reply
  29. user1316756

    И сделать это нужно PDFCreator

    Reply
  30. lmnlmn
  31. user1316756

    нужен конкретный синтаксис. Из написанного непонятно.

    Reply
  32. user1316756

    пробовал такой синтаксис:

    C:Progra~1PDFCreatorpdfcreator.exe «C:in1_575.pdf» «C:Out1_575.jpg»

    в этом случае запускается Окно приложения pdfCreator, которое я видеть вовсе не хочу

    Reply
  33. lmnlmn

    (32)

    C:Progra~1PDFCreatorpdfcreator.exe «C:in1_575.pdf» «C:Out1_575.jpg»

    C:Progra~1PDFCreatorpdfcreator.exe /PrintFile=»C:in1_575.pdf» /OutputFile=»C:Out1_575.jpg»

    Еще бы неплохо добавить профиль в котором включено автосохранение (/Profile=”ProfileName”)

    Reply
  34. user1316756

    C:Progra~1PDFCreatorpdfcreator.exe /PrintFile=»C:in1_575.pdf» /OutputFile=»C:Out1_575.jpg»

    также открывает диалоговое окно. А ”ProfileName” откуда взять

    Reply
  35. lmnlmn

    (34) Зайти в настройки PDFCreator. Там можно настроить профили. Надо сделать новый, либо настроить существующий для сохранения в нужный формат. В профиле где-то указывается автосохранение, надо его включить. Имя этого профиля и указывать в ProfileName

    Reply
  36. user1316756

    При синтаксисе

    C:Progra~1PDFCreatorpdfcreator.exe /Profile=»ProfileName» /PrintFile=»C:in1_575.pdf» /OutputFile=»C:Out1_575.jpg»

    Все равно выскакивает диалоговое окно, а потом еще и открывается файл C:Out1_575.jpg, что тоже не нужно

    Reply
  37. user1316756

    Наконец при синтаксисе

    C:Progra~1PDFCreatorpdfcreator.exe /Profile=»ProfileName» /PrintFile=»C:in1_575.pdf» /OutputFile=»C:Out1_575.jpg»

    и настройках согласно прикреплениям. Все заработало, как надо. Готов выслать обещанное вознаграждение на телефон и карту(желательно СБ)

    Reply
  38. user1316756

    Спасибо !!!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *