Вопрос

У меня есть приложение WSGI, которое генерирует счета и сохраняет их в формате PDF.

До сих пор я решал подобные проблемы с FPDF (или эквивалентами), генерируя PDF с нуля, как графический интерфейс. К сожалению, это означает, что вся логика форматирования (позиционирование верхних и нижних колонтитулов и содержимого, стиль) находится в приложении, где это не должно быть.

Поскольку шаблоны уже существуют в форматах Office (ODT, DOC, DOCX), я бы предпочел просто использовать их в качестве основы и заполнять фактический контент. Я нашел платформу Appy, которая делает это с аннотированными ODT-файлами.

Это все еще оставляет большую проблему открытой: конвертирование ODT (или DOC, или DOCX) в PDF. На сервере. Под управлением Linux. Без библиотек GUI. И, таким образом, без OO.o или MS Office.

Это вообще возможно, или мне лучше оставить стилизацию в моем коде?

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

РЕДАКТИРОВАТЬ: В основном я хочу библиотеку, которая может генерировать файлы ODT из файлов ODF, выступающих в качестве шаблонов, и библиотеку, которая может преобразовывать результат в PDF (что, вероятно, является ключевым моментом).

Это было полезно?

Решение

Я не знаю, как сделать автоматический ODT - > Преобразование PDF, но более простым способом может быть создание счетов-фактур в формате HTML и преобразование их в PDF с использованием http: // www. xhtml2pdf.com/ . Я сам не пробовал библиотеку, но она определенно кажется многообещающей.

Другие советы

Вы можете использовать QTextDocument, QTextCursor и QTextDocumentWriter в PyQt4. Простой пример, показывающий, как записать в файл odt:

>>>from pyqt4 import QtGui
# Create a document object
>>>doc = QtGui.QTextDocument()
# Create a cursor pointing to the beginning of the document
>>>cursor = QtGui.QTextCursor(doc)
# Insert some text
>>>cursor.insertText('Hello world')
# Create a writer to save the document
>>>writer = QtGui.QTextDocumentWriter()
>>>writer.supportedDocumentFormats()
[PyQt4.QtCore.QByteArray(b'HTML'), PyQt4.QtCore.QByteArray(b'ODF'), PyQt4.QtCore.QByteArray(b'plaintext')]
>>>odf_format = writer.supportedDocumentFormats()[1]
>>>writer.setFormat(odf_format)
>>>writer.setFileName('hello_world.odt')
>>>writer.write(doc) # Return True if successful
True

Если вы не уверены, что разница между odt и odf в этом случае. Я проверил тип файла и он сказал «application / vnd.oasis.opendocument.text». Так что я предполагаю, что это odt. Вы можете распечатать в PDF-файл с помощью QPrinter.

Больше информации на: http://qt-project.org/doc/qt-4.8/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top