[РЕШЕНО] Пакетный экспорт офисных документов в PDF

Автор kompilainenn, 14 марта 2017, 12:42

0 Пользователи и 1 гость просматривают эту тему.

kompilainenn

Уважаемые, гуру. Либра может экспорт офисных форматов в PDF. Однако это все вручную и по одному документу отдельно. Есть ли способ заставить либру делать пакетный экспорт документов в ПДФ с возможностью выбора исходных документов и настройкой некоторых параметров (в данном случае интересует выбор, какие конкретно листы документа выводить в ПДФ)?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Из коробки - можно только использовать командную строку. Там нельзя указать диапазон для экспорта.

Но можно написать макрос, который бы занимался экспортом сам, и (опять-таки) из командной строки открывать все нужные файлы с запуском нужного макроса. Конфигурабельность макроса - вопрос исправления исходного кода либо навороченность его с реализацией UI и хранения параметров. Вот, например, здесь макрос экспортирует в PDF один лист таблицы.
С уважением,
Михаил Каганский

economist

#2
Немного офф, но всё-же. Пробовал в свое время и макрос-переборщик, и безголовый режим, и расширения.

После массовой конвертации 5 тыс ODF/DOC/XL*-файлов в PDF - оказалось что 90% файлов - мусор, требующий ручного удаления (то есть бОльших трудозатрат). Почти всегда документ нужно открыть, посмотреть, поправить, и лишь потом его PDF-ить.

В итоге массовое "запэдээфиванеи" сделали путем размещения некоего текста-гиперссылки
на каждом нужном листе и макрос, подобный #1 его сохранял (с обновлением). Это оказалось намного лучше и "точнее" чем расширения multisave, PDFSaveAndSend итп.

Но еще более полезным оказалось развитие этого метода - "забазаданнивание". То есть перед каждым закрытием Calc/Writer - макрос все именованные особым образом диапазоны/поля - считывал и укладывал в БД SQLite/BASE. Это буквально преобразило офис и всю отчетность, поскольку стало ненужным наводить марафет в каждом "адчетике и далбичке", а иметь одноразмерные данные в сетевом расшаренном файле базы, доступном по сети нескольким десяткам пользователей Base, со всей силой и скоростью SQL-запросов.

Снизился и расход бумаги, так как из 1000 показателей (10-20 листов), распечатываемых на ежеутреннюю планерку для 30 чел. - на практике обсуждается всего 2-3 показателя. Остальные по DDE зеркалятся в презентацию и крутятся на большом ТВ, молча намекая на размышления об отпуске.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

цель моей хотелки - именно экспорт ВСЕГО документа в ПДФ с возможностью выбора диапазона страниц, потому что часто нужно, чтобы ПДФ был без первого листа. Ничего кроме, никакие базы данных и прочая не требуется.
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Я бы воспользовался пакетным преобразованием в виде связки LO и ghostscript (для вырезания ненужных страниц из получившихся PDF).
С уважением,
Михаил Каганский

kompilainenn

#5
Цитата: mikekaganski от 15 марта 2017, 09:22
Я бы воспользовался пакетным преобразованием в виде связки LO и ghostscript (для вырезания ненужных страниц из получившихся PDF).
мне нужно на виндовс это все делать.
и я бы вообще воспользовался отдельной специализированной утилитой, но я таких просто не нашел
ps: это какой-то трешак. нашел, как я сам же в лохматых годах писал рецепт http://lna.org.ru/forum/index.php?topic=1948.0
кто понимает питон? можно этот скрипт доработать?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

#6
Я понимаю, что это моветон, но вот для обычной командной строки Windows без питона:
for %f in ("D:\Documents\*.odt") do start "dummyTitle" /wait "C:\Program Files\LibreOffice 5\program\soffice.exe" --convert-to pdf --outdir "D:\Documents\pdf-out" "%f"

А вот устранение первых страниц у результата с помощью GhostScript:
for %f in ("D:\Documents\pdf-out\*.pdf") do start "dummyTitle" /wait "C:\Program Files\gs\gs9.20\bin\gswin64c.exe" -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=2 -sOutputFile="D:\Documents\pdf-out\stripped\%~nf.pdf" "%f"

Вместо GhostScript можно воспользоваться любой утилитой, умеющей вытаскивать страницы из PDF. Например, PDFtk. Преимущество специальных утилит для PDF может состоять в том, что GhostScript производит избыточные преобразования: например, растровые изображения могут пострадать внутри получающегося PDF.
С уважением,
Михаил Каганский

kompilainenn

Цитата: mikekaganski от 15 марта 2017, 09:04Я понимаю, что это моветон
а это не моветон, вопрос в том, как задать диапазон страниц для каждого файла?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

#8
@kompilainenn: если требуется отдельный процессинг каждого файла, то о каком пакетном преобразовании речь?

Вот .bat на основе вышеприведённых команд для обработки одного файла:

REM Первый параметр - имя файла, второй - начальная страница, третий - конечная страница, четвёртый - результирующая папка
start "dummyTitle" /wait "C:\Program Files\LibreOffice 5\program\soffice.exe" --convert-to pdf --outdir "%4" "%1"
start "dummyTitle" /wait "C:\Program Files\gs\gs9.20\bin\gswin64c.exe" -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=%2 -dLaststPage=%3  -sOutputFile="%4\%~n1.pdf.new" "%4\%~n1.pdf"
del "%4\%~n1.pdf"
move "%4\%~n1.pdf.new" "%4\%~n1.pdf"


Запускать как-то так:
magic.bat path\to\file.odt 2 4 path\to\result
С уважением,
Михаил Каганский

JohnSUN

Цитата: mikekaganski от 15 марта 2017, 11:24
...о каком пакетном преобразовании речь?
Скорее всего, о многократном. ИМХО, речь о заполнении данными (скорее всего вручную) пачки шаблонов и конвертации результата в пакет PDF-документов для отправки. Переделывать шаблоны, чтобы исключить из печати целые разделы, просто влом. Да и юзеры уже привыкли "as is"
Продолжаем ковырять рецепт с GhostScript...
А если вместо "for ля-ля-ля do" в батнике будет набор строк - по одной для каждого файла, с персональным диапазоном страниц?
Подготовить такой батник можно, например, в Калк - три колонки (имя файла, первая страница, последняя страница) для редактирования и формула с CONCAT для формирования команды start
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

#10
kompilainenn - такие спецоперации по удалению "ненужного" - народ очень быстро делает в бесплатной утилите http://www.pdfsam.org/ и переубедить их не удается, говорят что очень удобно всё реализовано.  

Я сделал десяток батников для мышиного Drag&Drop, которое удобно после сканирования на МФУ, в работе - постоянно, используются free-утилиты:
- для разрезания, отбраковки титула, поворота, склейки - уместен самый быстрый pdftk.exe, но не поддерживает кириллицу в именах, нужно переименование (прямо в батнике)
- сжатие любой графики в PDF - ImageMagick (convert.exe), весьма требователен к RAM.
- распознавание текста и сохранениев файл (тут без ghostscript и tesseract.exe никак)  
- нахождение QR-кода с кириллицей и его чтение (zbarimg.exe)
- пронумеровать "вырезку" из PDF заново - batemaster.exe
итд

Например, чтобы пронумеровать PDF, просто тащим его на батник и бросаем:


REM _20. Пронумеровать страницы PDF-файла A4 (портретная).bat
REM @ECHO OFF & SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
CHCP 1251
\Temp\batesmaster.exe --overwrite --format %%d --inpdf %1 --xoffset 560 --yoffset 15
pause


Бросание мышью, несмотря на атавизм, весьма удобно и редко приводит к ошибкам.    
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

kompilainenn

Цитата: mikekaganski от 15 марта 2017, 09:24если требуется отдельный процессинг каждого файла, то о каком пакетном преобразовании речь?
входные параметры для всех файлов единые. то есть если нам нужна пачка файлов в ПДФ и мы задаем диапазон страниц для экспортаЮ как 3-10, то значит ВСЯ пачка и должна быть выведена в диапазоне 3-10
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

kompilainenn

Цитата: JohnSUN от 15 марта 2017, 09:37Скорее всего, о многократном. ИМХО, речь о заполнении данными (скорее всего вручную) пачки шаблонов и конвертации результата в пакет PDF-документов для отправки
нет, есть просто куча файлов в отдельном каталоге, они готовы к экспорту в ПДФ. точка
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

@kompilainenn: тогда тебе надо во второй команде из ответа #6 определить -dFirstPage=3 и -dLastPage=10. Точка :)
С уважением,
Михаил Каганский

economist

pdftk.exe может быстрее чем GS убрать ненужный лист из полного файла.  Из документации:
Remove 'page 13' from in1.pdf to create out1.pdf
 pdftk in.pdf cat 1-12 14-end output out1.pdf
 or:
 pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...