[抱歉我的英语不好]
我们正在开发一个管理公共交通信息的应用程序。该应用程序应生成公交车站标牌的海报。
海报应符合详细和严格的监管规则,在每一个细节。字体、颜色、表格、线条、符号、嵌入图像等等。
我们需要将海报制作成PDF文件,然后发送打印。
我们的问题是:如何以可靠和有效的方式生成这个文件?
我们应该先创建一个HTML+CSS文件,然后使用一个库将HTML转换为PDF吗?我们能信任库完全准确地转换HTML吗?
或者我们应该使用像iText那样直接生成PDF的库。他们是否支持根据确切的规范创建复杂的PDF ?
最适合的环境是什么?我们的首要任务是dotnet core,但如果没有选择,我们也会考虑使用python或node.
最后一个问题,这属于哪个知识领域?完成这项任务需要什么技能?我们想为这项任务发布招标,但不知道该要求什么。
免责声明:我是borb
的作者,这个答案中使用的库
一般来说,有两种PDF库。
- 高级库:这些库允许您轻松添加内容(图像,文本,表格,列表等),而无需指定太多。这对你(用户)来说更容易,但你放弃了精确的控制。
- 低级库:这些库将您(用户)带入PDF的细节级别。您可以操纵内容并将其放置在准确的位置。你可以定义一个色彩空间(确保颜色可以被校准),等等。这也意味着你放弃了舒适。你不能(很容易地)分割文本,自动流动内容块等
borb
允许您同时执行这两项操作。你可以把内容放在精确的坐标,你可以指定你自己的字体,你可以设置颜色使用RGB, HSV等
你也可以使用PageLayout
,它将接管大部分的内容放置。
from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import Paragraph
from borb.pdf import PDF
from borb.pdf.canvas.geometry.rectangle import Rectangle
from decimal import Decimal
def main():
# create Document
doc: Document = Document()
# create Page
page: Page = Page()
# add Page to Document
doc.add_page(page)
# define layout rectangle
# fmt: off
r: Rectangle = Rectangle(
Decimal(59), # x: 0 + page_margin
Decimal(848 - 84 - 100), # y: page_height - page_margin - height_of_textbox
Decimal(595 - 59 * 2), # width: page_width - 2 * page_margin
Decimal(100), # height
)
# fmt: on
# the next line of code uses absolute positioning
Paragraph("Hello World!").paint(page, r)
# store
with open("output.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, doc)
if __name__ == "__main__":
main()
这是使用PageLayout
from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import PageLayout
from borb.pdf import SingleColumnLayout
from borb.pdf import Paragraph
from borb.pdf import PDF
def main():
# create Document
doc: Document = Document()
# create Page
page: Page = Page()
# add Page to Document
doc.add_page(page)
# set a PageLayout
layout: PageLayout = SingleColumnLayout(page)
# add a Paragraph
layout.add(Paragraph("Hello World!"))
# store
with open("output.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, doc)
if __name__ == "__main__":
main()