Получение свойств документа PDF




Принцип обмена данными из 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. spenser123

    жаль что нет бесплатных варинтов работы с PDF и формами PDF для заполнения, обязательное наличие платной версии Acrobat сводит на нет пользу…

    Reply
  2. Isonic

    Тем не менее, это не сторонний программный продукт, а непосредственно сам Adobe.

    Reply
  3. gradi

    А вносить изменения в документ эта компонента позволяет?

    Reply
  4. Isonic

    (3)

    Да, эта компонента позволяет создавать и редактировать PDF документ.

    Reply
  5. AlX0id

    (1)

    жаль что нет бесплатных варинтов работы с PDF и формами PDF для заполнения

    libreoffice — не?

    Reply
  6. spenser123

    (2)с этим не поспоришь, продукт качественный, но цена при установке на сервер где 1000 и более пользователей, просто заоблачная

    Reply
  7. spenser123

    (5) если правильно понял это тот же open office, с ним не нашел варианта заполнения напрямую из макета, только через временные файлы туда сюда гонять и в части pdf — заполнения форм и переменных там тоже не нашел, только текстовки подменять и сохранять как пдф.

    Reply
  8. AlX0id

    А, если в программной части — то только через какие-нить pdftk думаю, есть возможность.. https://www.pdflabs.com/tools/pdftk-server/ например

    Reply
  9. Mic

    что нужно установить, чтобы в программе создался объект AcroExch.PDDoc??

    Reply
  10. Isonic

    (9)

    Для возможности создания объекта AcroExch.PDDoc необходимо установить «Acrobat Pro DC» (на оф. сайте доступна пробная (бесплатная) версия на 30 дней).

    Reply
  11. Mic

    т.е. сом объект можно создать только при установке платной версии Адоба или триальной?

    Reply
  12. Isonic

    (11)Да, все верно.

    В бесплатной версии Acrobat Reader com объект «AcroExch.PDDoc» отсутствует

    Reply
  13. Isonic

    (11)Что Вы хотите получить из PDF файла? Просто есть другой вариант получения данных, правда набор данных будет ограничен

    Reply
  14. DAL

    Зачем Акробат для PDF?

    Можно и через офис

    MSWord = Новый COMОбъект(«Word.Application»);
    MSWord.Visible = Ложь;
    MSWord.Documents.Open(ИмяФайла);
    Документ = MSWord.Application.Documents(1);
    Документ.SaveAs(ИмяФайлаПДФ, 17);
    MSWord.Application.Quit();
    
    Reply
  15. Isonic

    (14)

    скажи, а как с помощью «Word.Application» получить из pdf файла (который тебе пользователь загрузил, прислал …..)

    — количество страниц ?

    — формат бумаги ?

    — автор создания? и тд и тп

    Reply
  16. DAL

    (15)

    Зачем для чтения word?

    http://forum.infostart.ru/forum9/topic102380/

    Reply
  17. Isonic

    а руками пробовал открыть файл pdf в ворде? что у тебя получается?

    Reply
  18. Mic

    нужно выводить 2 страницы из pdf файла на форму для просмотра и пакетная печать pdf файлов из 1С.

    Reply
  19. Isonic

    (17)

    это не решает моих вопросов =)

    И вообще разные задачи — распознать, создать, просто получить инфу о файле.

    PS: PDF бывает разный — например с рисунками, чертежами и таблицами.

    Reply
  20. DAL

    (16) С какой целью?

    Я для работы с pdf пользуюсь ActiveX Adobe PDF Reader

    Reply
  21. Mic

    желательно страницы выводить раздельно

    Reply
  22. DAL
  23. DAL
  24. Isonic

    (21)Ты ж сам прислал код с открытием pdf в word. Я не знаю зачем ты это прислал, это фигня полная

    ActiveX Adobe PDF Reader — чтение файла, просмотр файла.

    Acrobat Pro DC — чтение файла, создание файла, получения/изменение свойств файла

    Чувствуешь разницу?

    Reply
  25. Isonic

    (22)данная статья не про чтение файла, а про просмотр свойств

    Reply
  26. DAL

    (25)

    Тогда быстрее xpdf.

    Формируешь текстовик и парсишь. Экономия времени на открытие COM-объекта

    http://www.foolabs.com/xpdf/download.html

    Reply
  27. Isonic

    (26) сторонние продукты конечно удобнее, если заказчик не против (что бывает не часто)

    Reply
  28. DAL

    (27)

    в состав пакета входит консольная утилита pdfinfo.

    Делаешь pdfinfo.exe НашФайл.pdf > ТекстовыйФайл.txt

    Потом парсишь.

    Утилита бесплатная. Никаких сторонних продуктов.

    Reply
  29. Isonic

    (28)

    Потом парсишь

    ты опять за свое…

    как ты таким способом определишь формат бумаги?!

    Reply
  30. DAL

    (29)

    В комплект входят консольные утилиты, позволяющие:

    Получить информацию из заголовка и описание метаданных файла PDF. распаковки PDF, извлечения изображений, шрифтов, преобразования в форматы png, ppm, ps, txt, html.

    The ‘Info’ dictionary contains the following values:

    title

    subject

    keywords

    author

    creator

    producer

    creation date

    modification date

    In addition, the following information is printed:

    tagged (yes/no)

    form (AcroForm / XFA / none)

    page count

    encrypted flag (yes/no)

    print and copy permissions (if encrypted)

    page size and rotation

    file size

    linearized (yes/no)

    PDF version

    metadata (only if requested)

    Reply
  31. Isonic

    (30)спасибо. Есть еще утилита Exiftool — она еще мощнее, так как работает с разными файлам (видео, аудио и тд и тп)

    Reply
  32. DAL

    (29)

    Ну в данном случае это комплект консольных утилит. Каждая размером 1 мб., т.е. можно кинуть в хранилище. Заточены только под работу с PDF.

    Это на тему «как быстро и безболезненно, не покупая доп софта решить проблему».

    Reply
  33. romankoav

    Получить количество страниц просто: считываете файл pdf как текст, далее проходя по строкам ищите вхождение «/Count». Как находите, смотрите следующие цифры после — это и будет количество страниц. Смотреть до конца строки или следующего «/». Проверялось на файлах формата 1.2 и 1.5

    Reply
  34. Isonic

    (33) делал я так, не все файлы можно разобрать на текстовые строки.

    Итог — метод Count не сработает и мы не получим результата

    Reply
  35. romankoav

    (34) Это как — не все? Пример?

    Reply
  36. romankoav

    Сейчас проанализировал 1000 первых попавшихся файлов — в некоторых слово /Count не нашлось. Файлы формата 1.4

    Reply
  37. brr

    (36) В 1.5 тоже нет

    Reply
  38. Isonic

    я проверял метод (который предлагался в (33)) на более чем 10 000 файлов, и из 10 файлов 3-4 определял количество листов, а в остальных нет. Поэтому, имхо, это неверный подход.

    Таким способом хорошо WORD файлы определять, но для него в 1С есть отдельная компонента. Так что….

    Reply

Leave a Comment

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