接着上一篇博客继续实现PDF中表格的绘制:https://blog.csdn.net/m0_37690102/article/details/107051058
- Then on a blog to continue to implement drawing in PDF form: https://blog.csdn.net/m0_37690102/article/details/107051058
直接上代码:在上一篇博客中,您已经能够简单的能在PDF中生成相应的表格了,但是还是存在一点点小问题,对于表格内部的文字信息没办法直接写入,已经表格不属于连通区域的。
- Code directly: In the last blog post, you were able to easily generate tables in PDF, but there is still a small problem. The text information inside the table cannot be written directly, and the table does not belong to the connected area.
完整的代码您可以参考下面我给出的,如果存在相应的问题,请您及时和我联系,非常感谢您的反馈。
- You can refer to the complete code below. If there is any problem, please contact me in time. Thank you very much for your feedback.
# encoding:utf-8
# -*- coding: utf-8 -*-
#字体库
import reportlab.lib.fonts
#canvas画图的类库
from reportlab.pdfgen.canvas import Canvas
#用于定位的inch库,inch将作为我们的高度宽度的单位
from reportlab.lib.units import inch
def create_imaginarylinetable(canvas,row,col,start_y1,start_x1,data):#虚线表格
for i in range(row):
canvas.line((start_x1) * inch, (start_y1-0.5*i) * inch, 7 * inch, (start_y1-0.5*i) * inch)
for j in range(col):
#1 2.2 3.4 4.6 5.8 7
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1) * inch)#5.9
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2)* inch)#5.65
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2-0.05) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2-0.05-0.1) * inch)#5.5
canvas.line((start_x1) * inch, (start_y1 - 0.5 * row) * inch, 7 * inch, (start_y1 - 0.5 * row) * inch)
#写入数据
for i in range(row):
for j in range(col-1):
# print(str(data[i][j]))
canvas.drawString((start_x1+j*1.2+0.45) * inch, (start_y1-0.5*i-0.3) * inch, str(data[i][j]))
return (start_y1 - 0.5 * row)
def create_Dislocationtable(canvas,row,col,start_y1,start_x1,offset,data):#错位表格
for i in range(row):
canvas.line((start_x1) * inch, (start_y1-0.5*i) * inch, 7 * inch, (start_y1-0.5*i) * inch)
for j in range(col):
#1 2.2 3.4 4.6 5.8 7
if j==0:
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1) * inch)#5.9
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2)* inch)#5.65
canvas.line((start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2-0.05) * inch,
(start_x1+j*1.2) * inch, (start_y1-0.5*i-0.1-0.05-0.2-0.05-0.1) * inch)#5.5
else:
canvas.line((start_x1 + j * 1.2) * inch, (start_y1 - 0.5 * i) * inch,
(start_x1 + j * 1.2) * inch, (start_y1 - 0.5 * i - 0.1) * inch) # 5.9
canvas.line((start_x1 + j * 1.2-offset) * inch, (start_y1 - 0.5 * i - 0.1 - 0.05) * inch,
(start_x1 + j * 1.2-offset) * inch, (start_y1 - 0.5 * i - 0.1 - 0.05 - 0.2) * inch) # 5.65
canvas.line((start_x1 + j * 1.2) * inch, (start_y1 - 0.5 * i - 0.1 - 0.05 - 0.2 - 0.05) * inch,
(start_x1 + j * 1.2) * inch,
(start_y1 - 0.5 * i - 0.1 - 0.05 - 0.2 - 0.05 - 0.1) * inch) # 5.5
canvas.line((start_x1) * inch, (start_y1 - 0.5 * row) * inch, 7 * inch, (start_y1 - 0.5 * row) * inch)
#写入数据
for i in range(row):
for j in range(col-1):
# print(str(data[i][j]))
canvas.drawString((start_x1+j*1.2+0.45) * inch, (start_y1-0.5*i-0.3) * inch, str(data[i][j]))
return (start_y1 - 0.5 * row)
def pdf_head(canvas, data):
#setFont是字体设置的函数,第一个参数是类型,第二个是大小
canvas.setFont("Helvetica-Bold", 11.5)
#---------------------------------------------------------------
# draw a line segment from (x1,y1) to (x2,y2)
# ---------------------------------------------------------------
# create_table(canvas,row,col,start_y1,start_x1):
data = [("@@E1", "##E2", "%%E3", "$$E4", "result"),
('AB', "100", "80", "30", '35'),
('AC', '25', '60', '55', '45'),
('AD', '30', '90', '75', '80'),
('AE', '00', '44', '88', '11'),
('AF', '11', '22', '33', '44')]
NEXT_START = create_imaginarylinetable(canvas, 6,6,11,1,data)#6行5列的表格
data = [("@@E1", "##E2", "%%E3", "$$E4", "result"),
('AB', "100", "80", "30", '35'),
('AC', '25', '60', '55', '45'),
('AD', '30', '90', '75', '80'),
('AE', '00', '44', '88', '11'),
('AF', '11', '22', '33', '44')]
NEXT_START = create_Dislocationtable(canvas, 6, 6, NEXT_START-1, 1,0.1,data) # 5行5列的表格 offset=0.1
data = [("@@E1", "##E2", "%%E3", "$$E4", "result"),
('AB', "100", "80", "30", '35'),
('AC', '25', '60', '55', '45'),
('AD', '30', '90', '75', '80'),
('AE', '00', '44', '88', '11'),
('AF', '11', '22', '33', '44')]
create_Dislocationtable(canvas, 6, 6, NEXT_START-0.75, 1,0.1,data) # 5行5列的表格 offset=0.1
if __name__ == "__main__":
#声明Canvas类对象,传入的就是要生成的pdf文件名字
can = Canvas('report.pdf')
data = ""
pdf_head(can, data)
#showpage将保留之前的操作内容之后新建一张空白页
can.showPage()
#将所有的页内容存到打开的pdf文件里面。
can.save()
看看今天的效果如何,是否满意。
-
Let's see how it works today and if we're satisfied.
I hope I can help you,If you have any questions, please comment on this blog or send me a private message. I will reply in my free time.