Python中的PDF生成

时间:2016-05-12 08:25:23

标签: python pdf reportlab

我正在尝试为我创建的程序生成PDF文件而不是文本文件。

我的问题是我看了一个reportlab,看起来过于复杂,因为我想要的只是print到pdf而不是文本文件。

目前的测试代码,它有效,但我对定位和页面末尾的所有行都很困惑,有人可以告诉我如何使用reportlab进行定位吗

from reportlab.pdfgen import canvas
def genText():
    text =["Call me Ishmael.",
        "Some years ago- never mind how long precisely- having little or no money in my purse,",
        "and nothing particular to interest me on shore,",
        "I thought I would sail about a little and see the watery part of the world."]
    return text

def testText(page,text):

    from reportlab.lib.units import inch

    textobject = page.beginText()
    textobject.setTextOrigin(inch, 2.5*inch)
    textobject.setFont("Helvetica-Oblique", 14)
    for line in text:
        textobject.textLine(line)

    page.drawText(textobject)    

page = canvas.Canvas("JIMTEST.pdf")
text = genText()
testText(page, text)
page.showPage()
page.save()

我的程序实际输出的数据:

---------------------------------------------------------
Milk Company: Bobbys Milk
Haulier: Jims Hauliers
Truck: T55JHH

Driver: 123     Route: 852
    Joe Bloggs

Everyday Collection

MilkType: Ordinary

---------------------------------------------------------
Last TankWash

Start Time: 2016/03/31 13:30:32
Finsished:  14:21:03
Litres: 9451
Temperature: 70.0 deg_C

   770500  CREAMERY

---------------------------------------------------------
Locn                    Litres

   770083 Wyrill
Coll        1643   2.0  deg_C   smp 143
2016/04/01 06:40:28

   770084 Foster
Coll        2242   1.0  deg_C   smp 28
2016/04/01 07:17:57

   770080 Dugdale
Coll        8237   4.0  deg_C   smp 49
2016/04/01 08:02:39

   770086 Cragg
Coll        4591   1.7  deg_C   smp 68
2016/04/01 09:00:17

   770051 D & S Spence
Coll        2868   3.7  deg_C   smp 83
2016/04/01 10:06:11

   770500 CREAMERY
delyFZ  -19581
Tank#     0 Ower#  3805
2016/04/01 11:14:11


---------------------------------------------------------
Milk Collected: 19581
Milk OnBoard: 0
---------------------------------------------------------
Estimated Print Time at: 2016/04/01 11:14:16

谢谢

2 个答案:

答案 0 :(得分:1)

我建议你看一下reportlab的鸭嘴兽部分。

Paragraph的行为非常类似于HTML中的DIV容器,它会自动将文本包装在文档的末尾。

from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

def genText():
    text = ["Call me Ishmael.",
        "Some years ago- never mind how long precisely- having little or no money in my purse,",
        "and nothing particular to interest me on shore,",
        "I thought I would sail about a little and see the watery part of the world."]
    return text

styles = getSampleStyleSheet()
doc = SimpleDocTemplate("my_doc.pdf", pagesize=A4)
Story=[]
text = genText()
for t in text:
    Story.append(Paragraph(t, styles["Normal"]))
Story.append(Spacer(10, 10))
t = "lorem ipsum " * 100
Story.append(Paragraph(t, styles["Normal"]))
doc.build(Story)

你也可以混合帆布和鸭嘴兽 - 这只是让你前进的一个小例子。

要定位元素,我建议您查看鸭嘴兽Table

答案 1 :(得分:0)

您可以查看 pdfme 库。是python中创建PDF文档最强大的库,而且非常好用。

要将这些日志“打印”到 PDF 文档中,您可以这样做:

from pdfme import build_pdf

with open("logs.pdf", 'wb') as f:
    build_pdf({
        "style": {"s": 12, "text_aling": "j"},
        "sections": [
            {"content": [LOGS_VARIABLE_STR]}
        ]
    }, f)

就是这样。您还可以拆分字符串,根据需要为其设置某种格式,然后按照文档 (https://pdfme.readthedocs.io/) 中的说明添加格式化的段落