Есть ли лучший язык компоновки, чем HTML для печати?
Я использую Python и Qt 4.4, и мне приходится печатать некоторые страницы. Первоначально я думал, что буду использовать HTML с CSS для создания этих страниц. Но HTML имеет некоторые ограничения.
Теперь возникает вопрос: есть ли что-нибудь, что лучше, чем HTML, но просто (или почти) как прост в использовании? Кроме того, он должен быть совместимым с GPL.
Edit:
kdgregory и Mark G: Наиболее очевидным ограничением является то, что я не могу указать поля принтера. Есть еще одна проблема: как добавить номера страниц?
Джереми Френч: Одна вещь, которую я должен напечатать, - это список всех продуктов, которые кто-то заказал, которые могут распространяться на несколько страниц.
Ответы
Ответ 1
Я работаю с печатным (или PDF) выходом из Python уже 8 лет, и до сих пор я сталкивался с следующими подходами (в порядке личных предпочтений):
- Используя JasperReports через pyJasper ( написанный мной) или JasperServer. Вы можете использовать инструмент проектирования WYSIWYG iReport, чтобы определить макет. Ваш код Python свяжется с Jasper-движком Java через HTTP и сделает его рендерингом PDF (pyJasper обрабатывает это). Мы используем это для нескольких тысяч страниц в день.
- Используйте текстовый вывод. Вы не можете ускориться. Мы используем это для нескольких сотен страниц в день.
- Используйте XSLT-FO. Вы также должны вызывать механизм рендеринга на основе Java, такой как FOB. Могут возникнуть проблемы с производительностью, но они могут быть смягчены за счет длительной работы сервера Java - такого же подхода, как с Jasper. Мы используем это для нескольких сотен страниц в день, но при написании документов XSLT-FO у меня болит голова. Не используется для нового кода.
- Создайте LaTeX и используйте пакет программного обеспечения латекс для рендеринга в PDF. Получить LaTeX, чтобы выглядеть как вам, довольно сложно. Но до тех пор, пока вы идете с предоставленными стилями LaTeX, вы в порядке. Не используется в производстве в моем магазине.
- Генерация PDF с Инструментом ReportLab Toolkit. Несколько низкий уровень. Еще более низкий уровень: FPDF. Мы используем FPDF-Ruby для нескольких сотен страниц в день. Взял много fiddeling, чтобы получить макет, который мы хотели.
- Непосредственно создавать Postscript. Странно, но вы почти не можете получить больше с точки зрения скорости и контроля. Мы использовали это для создания контактных листов с несколькими сотнями тысяч Jpeg в день. Делает вождение, но это весело.
- используйте troff/groff для создания Postscript/PDF. Очень низкий уровень, приятный, чтобы делать простые, большие вещи. Никогда не использовали его при производстве.
Для заказов, счетов-фактур и тому подобного я очень рекомендую JasperReports. Возможность использовать визуальный редактор для определения макета - это огромная экономия времени.
Ответ 2
Там LaTeX. Не уверен, что это попадает в категорию "как можно проще использовать как html", но это не сложно.
Ответ 3
Отпечаток означает принтер? Если да, проверьте ReportLab инструменты PDF.
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
c = canvas.Canvas("hello.pdf")
c.drawString(9*cm, 22*cm, "Hello World!")
c.showPage()
c.save()
Ответ 4
Вы видели http://www.w3.org/TR/css3-page/? Печатный носитель очень настраиваемый.
В моем новом проекте я собираюсь заменить генератор PDF этим.
Ответ 5
Объекты форматирования XSL (часть Семейство расширяемых семейств стилей (XSL)), если вам необходим полный контроль над печатными документами.
Затем вам понадобится процессор форматирующих объектов, например FOP или "Антенный дом" , чтобы преобразовать документ XSL-FO в PDF или PostScript.
Ответ 6
Вы можете рассмотреть Sphinx, пакет, который преобразует файлы reStructuredText в различные выходные форматы, включая HTML и LaTeX, для PDF для печати, Он лицензирован под BSD и теперь является официальным инструментом документации Python.
Ответ 7
Что не так, просто используя Напечатанная Qt-печать?
Ответ 8
Или, если вы находитесь на mac, вы можете проверить привязки кварца для Python, но это, очевидно, не GPL.
Ответ 9
Мне понравилось asciidoc. В основном вы создаете простой текст. Это можно усилить, используя систему шаблонов, например шаблоны Django или Jinja2. Это в значительной степени похоже на XSLT-FO, описанную mdorseif (вы используете инструментальную цепочку для создания docbook, а затем все, что вам нравится), но не столько от головной боли. Существует уже неплохая оболочка toolchain, которая облегчает большинство вещей.
Ответ 10
JasperReports уже упоминалось, но мы используем его в наших приложениях Python-Qt БЕЗ сервера или сервлета (то есть без необходимости JasperServer или pyJasper).
Итак, в основном вместо сервера/сервлета вы устанавливаете Jasper Reports Library. Затем вам нужно создать небольшую программу Java, которая использует библиотеку отчетов Jasper для создания отчета в формате PDF из сериализованного ввода, например XML. Там должно быть много примеров этого, если вы делаете веб-поиск, и вам нужно только написать это один раз. Затем вы компилируете эту программу Java со всеми необходимыми библиотеками в файл JAR.
На этом этапе вы можете установить JasperSoft Studio и создать шаблон отчета Jasper. Затем в Python вы можете использовать JPype (или любую другую библиотеку Python-to-Java) для запуска JVM, загрузки JAR файла, вызова ваша Java-функция, передайте ее ваши сериализованные данные и укажите, какой шаблон отчета вы хотите.
Все это не тривиально, но это довольно просто. Нам нравится это решение, потому что оно предоставляет редактор формы перетаскивания в конструкторе Qt Designer/Creator, конструктор отчетов JasperReports с перетаскиванием и возможность создания отчета PDF непосредственно из данных, собранных на Python. Все это использует хорошо поддерживаемые инструменты и библиотеки, поэтому маловероятно, что это решение развалится в обозримом будущем.