Генерация ODT / DOC (X) и преобразование в PDF, без OO.o / MS
-
10-07-2019 - |
Вопрос
У меня есть приложение 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/ р>