LINUX.ORG.RU

Массовая генерация PDF true linux way

 , , ,


1

1

Есть данные о начислениях по квартплате для 300к человек в БД. Надо сделать из них платёжку на 1-3 листа А4 в pdf. Чем кошерно будет это сделать? Сейчас всё работает на fastreports в дельфи и jasperreports, но один документ делается 2+ секунд и занимает это около суток да и стрёмно всё это как-то.
Хочется следующего: данные из бд перегоняются в пригодный вид, дальше скармливаются шаблонизатору, тот делает tex/md/etc документ из которого делается pdf. Хочется, чтобы всё, кроме бд занимало <50 мс. Есть истории успеха?

Ответ на: комментарий от jollheef

Можно сделать шаблон в LaTeX, сгенерировать pdf, после чего в итоговом документе заменять нужные поля обычной заменой.

Разве pdf - текстовой? Да и документ может быть разной длинны, не пойдёт скорее всего. Там qr коды еще надо запихивать.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)

Попробуй asciidoctor-pdf – он точно быстрее чем (xe|lua)latex потому как тупее. Но вот будет ли укладываться в <50ms хз.

Я на нем делаю «бизнесовые» :) документы, ну и свои платежки тоже. Правда у меня к своим докам нет таких жестких требований.

habamax ★★ ()
Ответ на: комментарий от crutch_master

Стоп, не увидел пожелание про скорость работы самой программы - не выйдет, латех будет компилировать около секунды, а может и больше от объема зависит.

Silerus ★★ ()
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

латех будет компилировать около секунды, а может и больше от объема

один документ делается 2+ секунд

А сколько генерируется PDF-документ, в котором сотня платёжек? Вот уверен, что не 200 секунд, а много меньше. Тот же LaTeX очень много времени тратит на компилирование documentclass и прочее и прочее. Классы и стили в платёжках одинаковы, так что... А нарезать PDF потом всегда успеешь.

Есть и более прямой способ, что-то вроде pre-compiled headers для LaTeX. Но это для продвинутых

Crocodoom ★★ ()
Ответ на: комментарий от Crocodoom

Да хз. Резать бы не очень хотелось. Надо попробовать latex, вроде когда я что-то тестил он работал намного меньше двух секунд. С md может что-то есть? Хотя я не уверен, что мне хватит md, чтобы всё разметить.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

Я имел в виду, что объединив платежки в один документ мы получим выигрыш по процессорному времени (в пересчете на компиляцию одной платежки), но не сможем распараллелить это на все его ядра.

aquadon ★★★★ ()
Ответ на: комментарий от aquadon

Как же не сможем, когда сможем? Дано: 300к платёжек, 16 ядер.

Разбиваем все платежки на группы по 100 штук и компилим. Можно будет загрузить 3000 ядер параллельно, а уж 16 и подавно.

Crocodoom ★★ ()

Сгенерируй по шаблону в markdown или простым текстом, а потом через pandoc сделай PDF. Можешь ещё через convert из imagemagick попробовать. Или ты хочешь готовое решение от начала до конца?

Quasar ★★★★★ ()
Ответ на: комментарий от crutch_master

Pandoc - это универсальный конвертер форматов и языков описания документов. Умеет много чего: от примитивного ASCII до очень сложных ODF и DOCX. Его частенько используют для того, чтобы из markdown сделать pdf.

Quasar ★★★★★ ()
Ответ на: комментарий от crutch_master

pandoc в pdf будет точно дольше чем чистых латех в пдф – из коробки. Это если ты не укажешь другой (не латех бэкенд) для пандока.

Потому как у пандока есть дефолтный шаблон default.latex, в котором подключается туева хуча пакетов, которые тебе может и не нужны. В голом латехе можешь написать/подключить так как тебе надо. (Справедливости ради, этот default.latex ты можешь подменить своим)

habamax ★★ ()

Насколько часто меняется формат платежек? И какие к их формату есть требования?

Если меняются достаточно редко и есть знания о C/C++, то можно попробовать заюзать какую-нибудь низкоуровневую библиотеку, типа cairo или skia.

У них скорость генерации pdf будет максимальной.

anonymous ()

а дальше что с этим платёжками? по почте рассылаются?
ведь время на доставку платёжки клиенту может быть много дольше чем её генерация, и тогда смысла ускорять генерацию нет.

bass ★★★★★ ()
Ответ на: комментарий от crutch_master

Меняются иногда, настолько хардкодить на чём-либо не охота. Надо что-то среднее.

Ну тут уж нужно смотреть по собственным силам/производсвенной неоходимости. Ускорить генерацию можно многократно.

Кстати, пришла интересная идея. Если в пандоках и прочем основное время тратится на вычитывание тонны скриптов и конфигов, то, возможно, можно ускорить процесс если в один pdf документ пихать сразу несколько платежек, а затем этот большой документ делить на части какими-то внешними утилитами. Напр., podofoimpose (хотя конкретно ее я не советую. Написана фигово, документация — по исходникам и т.п. Но за отправную точку можно взять и ее)

anonymous ()
Ответ на: комментарий от anonymous

И еще, никто почему-то не посоветовал wkhtmltopdf. Прикидывая, как выглядят платежки, я думаю можно легко набацать html тупой табличной версткой, как деды завещали. Если будет несложный html без тонны скриптов и js, то должно работать быстро. Хотя, до 50мс все равно не дотянет.

anonymous ()
Ответ на: комментарий от bass

а дальше что с этим платёжками? по почте рассылаются?

Что-то рассылают, что-то выдают по запросу, остальное складывают в папочку и архивируют. Рассылают мало т.к. они не всем нужны. Народ мало волнует за что они сколько платят.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

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

Deleted ()