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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *