среда, 22 марта 2017 г.

Пакетный экспорт документов в формат PDF, используя LibreOffice

Все действия выполнялись в ОС Windows. Наверняка для Linux есть какой-нибудь хороший способ, но мне на работе никто конфигурировать под корпоративные стандарты Linux не будет, поэтому в этой статье всё про Windows. 
Потребовалось мне по работе проводить экспорт кучи файлов в формате XSLX в формат PDF. Реально по 25 - 30 файлов за присест. И делать это надо было крайне в сжатые сроки. Пробовать всякие программулины было некогда и пришлось делать это вручную из MS Excel, благо 2010 версия это умеет. Хорошего в таком положении вещей мало, в будущем предвидится точно такие же авралы и я задумался, а какие вообще существуют способы.
Нашел я софт, который включал в себя LibreOffice, и вроде бы пакетный экспорт в PDF умел, однако он в бесплатной редакции ставит огромный рекламный блок себя на КАЖДОМ листе документа. Это не наш вариант.
Есть еще несколько подобных софтин, уже без всякого участия LibreOffice, однако либо они некорректно сам экспорт делали, то есть итоговый файл был кривой, либо пакетный экспорт был декларирован, но не работал.
Наверное можно (и нужно в будущем так и сделать) спросить у знающих Эксель товарищей, может быть есть возможность настроить пакетный экспорт, юзая сам MS Excel.
Ну, а я попросил помощи на нашем форуме http://forumooo.ru и Миша Каганский подсказал мне строку кода для консоли, которая вызывая LibreOffice в скрытом режиме выполняет искомый пакетный экспорт. Ну и в дальнейшем эта строка была оформлена в bat-файл и сам файл был переписан Мишей для того, чтобы можно было задать путь до исходных файлов и их тип, а также была прописана проверка наличия установленного в системе LibreOffice.
Вот собственно код:
@echo off

rem -------------------------------------------
rem in this file uses codepage cp866
rem -------------------------------------------
rem в этом файле используется кодировка cp866
rem -------------------------------------------

set /p "fileMask=Введите путь и маску для экспорта: "

rem ключ реестра для извлечения пути установки
rem HKEY_LOCAL_MACHINE\SOFTWARE\LibreOffice\UNO\InstallPath

setlocal ENABLEEXTENSIONS

call :QueryRegistry "HKEY_LOCAL_MACHINE\SOFTWARE\LibreOffice\UNO\InstallPath" ""

if not defined Value (
    call :QueryRegistry "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\LibreOffice\UNO\InstallPath" ""
)

echo Идет экспорт файлов в PDF, ждите
for %%f in ("%fileMask%") do start "dummyTitle" /wait "%Value%\soffice.exe" --convert-to pdf --outdir "." "%%f"
chcp 866 > nul
msg * Экспорт завершен

exit /B %ERRORLEVEL%

:: A function for querying registry value; return is in %Value%
:QueryRegistry
:: chcp 1252 makes REG QUERY to print its output in English. This makes the string look like:
::     (Default)    REG_SZ    C:\Program Files\LibreOffice 5\program
:: Without this, the string may (e.g. for Russian locale) look like:
::     (По умолчанию)    REG_SZ    C:\Program Files\LibreOffice 5\program
:: Notice the space in the (По умолчанию). This space makes additional token, and thus
:: the batch becomes non-portable.
set Value=
chcp 1252 > nul
for /F "usebackq tokens=2,*" %%A in (`REG QUERY %1 /v %2 2^>nul`) do (
    set Value=%%B
)
Вставьте его в текстовый файл, сохраните с расширением bat. Обратите внимание, что сохранить его необходимо в кодировке Cp866, иначе надписи на русском языке превратятся в крякозябры.
И ещё: файлы в формате PDF будут сохранены в то место, откуда был запущен bat-файл. Это настраивается в тексте "программы".
В конце экспорта будет показано отдельное окошко с текстом "Экспорт завершен" и кнопкой ОК. Я это сделал, чтобы видно было, что работа завершена.
Сам экспорт достаточно быстрый, однако очень сильно зависит от количества и размера файлов.
Также преимущество LibreOffice перед MS Office в данном случае в том, что LibreOffice намного всеяднее в плане поддержки кучи различных форматов файлов, а недостаток тот, что LibreOffice не совсем точно открывает файлы вражеского формата, особенно это видно, если страниц в документе много. Я увидел разницу 50 vs. 65 страниц - это бывает просто неприемлемо =(

2 комментария:

  1. я то думал у баша и перла убогий синтаксис, но это ад просто)

    ОтветитьУдалить