LINUX.ORG.RU

Чем же генерить печатные формы?


1

2

Уже в который раз задаюсь этим вопросом и решения, удовлетворяющего на 100% найти не удается. Вчера запарился, попробовать LibreOffice(OpenOffice) C++ API, но оно не совсем для жизни, судя по всему. TeX/LaTeX - вещь отличная, но для составления документа, подстановки значений надо писать все самостоятельно, потом, опять же, генерить выходной документ и чем-то его показывать, что есть не комильфо. NCReport - для Qt(мне бы без конкретного ФВ что-нибудь), да и просто не нравится он мне, визуальные отчетники как-то из моды вышли еще при винде. Кто как генерит и показывает печатные формы? Мне что-нибудь для работы на C(если есть толковое решение, то можно и С++).


LaTeX

Просто, надо научиться его нормально готовить.

Пример: генерирование формочки (скажем, заявления). Делаем веб-морду, в которой пользователь может заполнить основные поля формы. При нажатии «готово» веб-морда посылает XHR серверу, этот XHR обрабатывается нашим CGI, который проверяет содержимое полей на валидность, а затем, если все ОК, формирует из шаблона латеховский документ, подставляя введенные пользователем данные (в простейшем случае это делается так: каждое поле пользователя объявляется в преамбуле как макрос, например, \def\FIO{Иванов Иван Иванович}, а в форме происходит разворачивание макросов: \parbox{7.5cm}{\FIO}). Запускается компилятор (pdflatex) и пользователю отсылается готовый pdf.

Eddy_Em ☆☆☆☆☆
()
Ответ на: LaTeX от Eddy_Em

Пример: генерирование формочки (скажем, заявления). Делаем веб-морду, в которой пользователь может заполнить основные поля формы.

У Вас есть реально работающие примеры таких примеров? Если да, поделитесь кодом.

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

Нет, когда-то делал, искать замучаюсь. В элементарном виде: CGI на баше, без проверки валидности. В двух файлах лежат: шапка (\begin{document} и \usepackage'ы) и тело формы (содержимое окружения document). XHR запрос обрабатывается так: пара «переменная=значение» преобразуется в \def{переменная}{значение}, затем в отдельный временный файлик последовательно записываются: шапка, все полученные из XHR'а \def'ы, тело. Запускается pdflatex. Все временные файлы удаляются. Если компиляция прошла успешно, пользователю выдается pdf-файл.

В общем, смысл я объяснил. Реализовать его можно на любом ЯП. Лучше, конечно, на сях: баш уж слишком ресурсоемкий и взломоопасный.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

В своё время остановился на таком решении.
1. Формы рисуются в Libre/Open-Office (odt, ods), при этом вместо подставляемых полей пишутся какие-то маркеры, типа $CommonSum или #SummaItogo.
2. Программа, которая должна выдать отчет, копирует форму (файл odt или ods) в папку готовых отчетов, распаковывет zip'ом (это можно делать внешней утилитой, например unzip или gzip), затем открывается через библиотеку XML, ищутся маркеры и заменяются высчитанными значениями. Нужные строки в таблицах переменного размера размножаются. Готовый файл снова пакуется zip'ом.
3. Для юзера открывается готовый файл в установленном Open/Libre-Office или AbiWord'e/Gnumiric'e.
4. Юзер смотрит, если надо что-то правит и жмет «Печать».

Со стороны юзера это выглядит так: он жмет «Сформировать отчет», открывается LibreOffice, а в нем «Мой супер отчет 2012.ods», юзер жмет «Печать» или «Отправить шефу» :)

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

У Вас есть реально работающие примеры таких примеров?

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

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

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

Не надо хвастаться. Лучше, делитесь наработками.

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

Формы рисуются в Libre/Open-Office (odt, ods), при этом вместо подставляемых полей пишутся какие-то маркеры, типа $CommonSum или #SummaItogo.

Я что-то примерно такое и хотел. Даже маркеры придумывать не надо, у OpenOffice есть пользовательские переменные, которые, по идее, хранятся где-нибудь в отдельном файле(это только предположение). Пока копаю в эту сторону, но опять же, ручками это все реализовывать попахивает велосипедом.

nickey
() автор топика

Вообще-то, на каждом компьютере имеется браузер. Чем не подходит HTML?

anonymous
()

http://code.google.com/p/wkhtmltopdf/

Переводит шаблон на html в PDF, делает это с помощью собственного подпатченногго webkit, делает очень неплохо.

vden ★★
()

Чем же генерить печатные формы?

плюсую за HTML - дешево и сердито, генерить можно чем угодно, распечатать пользователь сможет на любой системе

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

делитесь наработками.

увы, я уже успел сменить банк...

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

Лучше делитесь наработками.

Так выше я уже весь алгоритм привел. Баш в руки — и вперед. А потом, как нормально взлетит, на сях можно переписать.

Кстати, многие форумные генерилки формул ведь тоже латех используют!

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

Так выше я уже весь алгоритм привел. Баш в руки — и вперед

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

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

платформозависимое решение. не поймут.

P.S. Если уж продолжать платформозависимые вещи, то была такая штука как Crystal Report.

Dark_SavanT ★★★★★
()

но для составления документа, подстановки значений надо писать все самостоятельно

И что тут такого? Сейчас этих template engines развелось столько, что хоть анально их потребляй, спасибо вебу с html-ем.

потом, опять же, генерить выходной документ и чем-то его показывать, что есть не комильфо

Ну, если уже и pdf не комильфо, то вы, батенька, зажрамшись.

Кто как генерит и показывает печатные формы?

LaTeX + tikz + pgf. Шаблоны генерятся из кода на шарпе, вся обертка в ASP.NET MVC.

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

Excel? Печатать? Извращение. Получить что-либо прилично выглядещее на бумаге из этого убожетсва крайне непросто. Оно только для интерактивных дел годится.

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

Зеленых надо вешать, они, суки, лишили меня любимых 100Вт лампочек.

Бумагу надо назло зеленым переводить тоннами.

Ну и не забываем, про что ТС спрашивал.

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

Ну, если уже и pdf не комильфо

PDF не комильфо по другой причине - как юзер внесет в него изменения? Мало ли какие ситуации могут возникнуть, в которых что-то куда-то подвинуть придется...

nickey
() автор топика
Ответ на: комментарий от baverman

Excel + VBA

Отож. Средства винды для автоматизации офисной рутины на 100 лет опередили возможности gnu. Потому что офисная автоматизация не в приоритете у gnuшников, поэтому и «линукс до сих пор не готов для десктопа». Всё банально

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

PDF не комильфо по другой причине - как юзер внесет в него изменения?

А вот нечего юзеру свои шаловливые ручки кудад ни попадя совать!

И ты, кстати, спрашивал о веб-генерировании печатных форм. А это — как раз и есть pdf.

Ну, а тем, кто использует в таких случаях мастдайные форматы и какой-нибудь VBA, я бы руки поотрывал!

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

А вот нечего юзеру свои шаловливые ручки кудад ни попадя совать!

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

nickey
() автор топика
Ответ на: LaTeX от Eddy_Em

Если ты делаешь веб приложение, нафига там столько сущностей? Сгенерил бы яваскриптом прямо на клиенте.

Kalashnikov ★★★
()

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

PS Qt4 С++

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

Лучше латеха ты ничем не сгенерируешь приличную печатную форму.

И не надо его латексом обзывать.

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

Ладно. s/Зациклился ты на латексе/Упоролся ты латехом/

Оно же просто язык разметки, не? Рисовать всё равно чем-то придётся, а это уже вторая линшяя сущность, плюс CGI костыль - третья. В твоём примере у тебя уже есть язык разметки, зачем приплетать другой с приблудами для его обработки? О скорости вообще страшно подумать... Два запроса по сети: XHR и загрузка пдфки (ещё и её генерация).

Можно твой отчёт просто сформировать через ДОМ и распечатать силами самого браузера хоть в пдф, хоть в бумагу.

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

Оно же просто язык разметки, не?

Да.

Рисовать всё равно чем-то придётся

формочку на html-страничке? Да хоть таблицами верстай!

CGI костыль

Сам ты костыль. Лучше еще ничего не придумали.

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

Я не CGI костылём назвал, а твой скрипт который всё это склеивать вместе будет.

И теперь я тебя совсем не понял. По-моему для твоего примера латекс вот ни в каком виде не нужен, даже если он только на клиенте как шаблон для генерации хтмла.

Kalashnikov ★★★
()

Для джавы есть apache poi, можно вордовские доки генерить, в самый раз будет. Из C джаву вызвать несложно, да и вообще не нужен С в вебе, пиши лучше на джаве.

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

согласись, когда говоришь с типами навроде Eddy_em, ощущение что с радиоточкой разговариваешь.

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

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

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

пдф единообразно выглядит везде

Во, наконец-то нормальный аргумент. Хотя по идее критичных проблем с отображением хтмла быть не должно, если руки не кривые.

Кстати, отображать пдф яваскриптом научились, можно при желании и генерировать)

отступы при печати из хтмл не задашь

А разве печатается не так как отображается, marginы/абсолютное позиционирование не подойдут?

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

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

я в общем то не совсем верно сказал, html подходит для бумажных отчетов для большинства задач, но не подходит в 2 случаях: когда форма печати имеет четкие размеры и координаты объектов (например, нужно печатать с попаданием в поля бланка); когда крупный проект и много разработчиков (в одиночку еще можно быть дисциплинированным и аккуратно html верстать, толпой - вряд ли)

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

когда форма печати имеет четкие размеры и координаты объектов (например, нужно печатать с попаданием в поля бланка)

Кхм, а разве не для этого придумали http://ru.wikipedia.org/wiki/PostScript ?

anonymous
()

Эм... я тут на пару часов отвлекся и тема как-то сама собой перешла в веб... на деле, в моем посте ни слова о вебе не было, речь идет как раз о декстопе. В вебе - без заморочек: {PHP, PERL, хоть BASH} + HTML юзал бы...

nickey
() автор топика
Ответ на: комментарий от Kalashnikov

Латекс ц-ц-ц. В 17 году начали за ликбез брроться, а крестьяне до сих пор необразованные.

Я бы советовал ror, чтобы не распыляться по тулчейну html->cgi->latex->pdf, или, на крайняк, и так можно, лишь бы не хтмл, потому что формы печатные должны быть формами, а не как выйдет.

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

Тогда еще проще: на каком-нибудь питоне набросай морду, в которой юзер будет заполнять нужные поля, затем генерируешь теховский файл и pdflatex'ом его компилируешь. После компиляции запускаешь какую-нибудь pdf-смотрелку с этим файлом.

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

Ну, а на худой конец — какой-нибудь LO использовать. Правда, это уже клиника.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.