首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过reportlab在特定的x和y坐标上定位表?

如何通过reportlab在特定的x和y坐标上定位表?
EN

Stack Overflow用户
提问于 2018-11-16 02:16:30
回答 1查看 2.9K关注 0票数 4

我有以下生成pdf的代码:

代码语言:javascript
运行
复制
def colr(x, y, z):
    return (x/255, y/255, z/255)
import reportlab
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.utils import ImageReader
from reportlab.platypus import SimpleDocTemplate, TableStyle, Paragraph, Image, Spacer, Frame, Paragraph
from reportlab.platypus.tables import Table
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
width, height = A4
logo = '/home/joel/myappointments/appointments/static/clinic/img/logo/logo.png'
elements = []
print(f'Height={height}')
imgw = imgh = 100
im = Image(logo, width=imgw, height=imgh)
im.hAlign = 'LEFT'
elements.append(im)

headstyle = ParagraphStyle(
    name='MyHeader',
    fontName='Helvetica-Bold',
    fontSize=16,
    leading =10
)
doctorstyle = ParagraphStyle(
    name='MyDoctorHeader',
    fontName='Helvetica',
    fontSize=13,
    leading =10
)
data = [[Paragraph("Dr John Doe's ENT Clinic", style = headstyle)], [Paragraph("Dr John Doe", style = doctorstyle)], [Paragraph("ENT Specialist", style = doctorstyle)], [Paragraph("Registration No. ", style = doctorstyle)]]
elements.append(Table(data, repeatRows=1))
line1 = ("Name", "Test", "Age", "20yr")
line2 = ("MRD No.", "18","Date", "14-11-2018")
line3 = ("No.","#", "Doctor", "Dr.John Doe")
data=[line1,line2, line3]
patientdetailstable = Table(data)
patientdetailstable.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (4, 0), '#CFEAD4'),
    ('BACKGROUND', (0, 2), (4, 2), '#CFEAD4'),
    ('BOX',(0,0),(-1,-1), 0.5, '#CFEAD4'),
    ('GRID',(0,0),(-1,-1), 0.5, colr(12, 43, 8)),
]))
elements.append(patientdetailstable)
elements.append(Spacer(1, 20))
# We use paragraph style because we need to wrap text. We cant directly wrap cells otherwise
line1 = ["Sl.", "Medicine" , "Dose", "Freq", "Durn", "Note"]
drug1 = Paragraph('AUGMED Syrup 30ml (AMOXICILLIN 200MG + CLAVULANATE(CLAVULANIC ACID) 28.5MG)', styleN)
line2 = ["1", drug1, "1 Tab", "1-0-1", "5 days", ""]
line3 = ["2", drug1, "1 Tab", "1-0-1", "5 days", ""]
data=[line1,line2, line3]
for i in range(3,50):
    temp = [str(i), "Some Drug here", "5 ml", "1-0-1", "10 days", "No comments"]
    data.append(temp)

medstable = Table(data, repeatRows=1)
medstable.setStyle(TableStyle([
    ('VALIGN',(0,0),(-1,-1), 'TOP'),
    ('TEXTCOLOR',(0,0),(-1,0),colors.white),
    ('BACKGROUND', (0, 0), (-1, 0), colr(40, 196, 15)),
    ('GRID',(0,1),(-1,-1), 0.5, '#CFEAD4'),
                            ]))
elements.append(medstable)
doc = SimpleDocTemplate('output.pdf', pagesize=A4, rightMargin=20, leftMargin=20, \
    topMargin=20, bottomMargin=20, allowSplitting=1,\
    title="Prescription", author="MyOPIP.com")
doc.build(elements)

这一切都很好,除了我需要在徽标的右边有:John Doe's ENT clinic upto to Registration No的部分,而不是在它的下面。如果我直接在Canvas上工作,而不是在可流动的SimpleDocTemplate上工作,我可以很容易地设置它的位置。

使用SimpleDocTemplate时,如何任意定位该部分?

EN

Stack Overflow用户

发布于 2018-11-16 04:21:33

我找到了一个解决方案,这可能不是最优雅的解决方案。在摆弄了框架和其他可流动对象之后,我重新阅读了文档,并发现我可以将我的表封装在另一个表中,只是为了格式化。因此,我创建了一个一行两列的表,并在一列中插入图像,在第二列中插入另一张表。

代码语言:javascript
运行
复制
col1 = Table([[im]])
col2 = Table(data, repeatRows=1)
tblrow1 = Table([[col1, col2]], colWidths=None)
tblrow1.setStyle(
    TableStyle([
        ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ]))
elements.append(tblrow1)
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53325607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档