代码之家  ›  专栏  ›  技术社区  ›  Wes

我用ReportLab复制此表单的方法是否正确?

  •  1
  • Wes  · 技术社区  · 14 年前

    我需要使用python/reportlab生成这里看到的表单。

    http://www.flickr.com/photos/49740282@N06/4563137758/sizes/o/

    我试图通过在顶部为头部创建一个自定义的可流动(绘制框),然后为下面的珠宝表创建一个可流动的表来实现这一点。在本例中,作为珠宝表显示的内容可能是多个表。我很难让我画的标题变成“流”。它会被绘制出来,但是我的表数据会覆盖它,而不是显示在它下面。

    这是我在ReportLab的第一个项目。在我真正开始调试之前,我想从有ReportLab经验的人那里了解一下我的方法是否正确。谢谢!

    3 回复  |  直到 12 年前
        1
  •  -1
  •   dzida    14 年前

    我无法帮助您使用ReportLab,因为我没有那么经验丰富的用户(在一些让我疯狂的问题之后,我留下了使用它的想法)。但是如果您考虑使用其他工具在python中生成PDF,我会让您看看 xhtml2pdf -如果你不去ReportLab,这可能是一个不错的选择。如果您熟悉HTML,这可能更容易使用。这里的想法很简单:它将您提供的HTML转换为PDF文件。当然,您需要以某种方式生成HTML代码(为此,我使用Django模板)。

        2
  •  0
  •   dugres    14 年前

    我不认为这里需要定制流动。

    您可以使用表格(和表格样式)来执行“标题”。

    另一个简单的解决方案是,如果你需要一些奇特的背景,绘制一个图像(像JPG),然后在上面绘制变量字符串。

        3
  •  0
  •   Nicholas TJ    12 年前

    我同意Dugres的观点,即对于Flickr中显示的特定形式,您不需要任何可定制的流媒体。您可以使用table和tablestyle来完成您的工作。

    在深入研究ReportLab之前,需要考虑的是,您的表不会太长,所以不会转到下一页。然后,表格样式将需要手动编辑。下一页表格中的跨距单元格将返回错误。但对于单页解决方案,reportpdf是一个不错的选择。

    对于精美的输出,很好的图形效果。你需要根据达格瑞斯的建议去做。

    对于开发表的Kickstart代码:

    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4, cm
    from reportlab.lib.styles import getSampleStyleSheet
    from reportlab.platypus import Paragraph, Table, TableStyle
    from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
    from reportlab.lib import colors
    
    width, height = A4
    styles = getSampleStyleSheet()
    styleN = styles["BodyText"]
    styleN.alignment = TA_LEFT
    styleBH = styles["Normal"]
    styleBH.alignment = TA_CENTER
    
    def coord(x, y, unit=1):
        x, y = x * unit, height -  y * unit
        return x, y
    
    # Headers
    hdescrpcion = Paragraph('''<b>descrpcion</b>''', styleBH)
    hpartida = Paragraph('''<b>partida</b>''', styleBH)
    hcandidad = Paragraph('''<b>candidad</b>''', styleBH)
    hprecio_unitario = Paragraph('''<b>precio_unitario</b>''', styleBH)
    hprecio_total = Paragraph('''<b>precio_total</b>''', styleBH)
    
    # Texts
    descrpcion = Paragraph('long paragraph', styleBH)
    partida = Paragraph('1', styleN)
    candidad = Paragraph('120', styleN)
    precio_unitario = Paragraph('$52.00', styleN)
    precio_total = Paragraph('$6240.00', styleN)
    
    data= [[hdescrpcion, hcandidad,hcandidad, hprecio_unitario, hprecio_total],
           [partida, candidad, descrpcion, precio_unitario, precio_total]]
    
    table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm,
                                   3* cm, 3 * cm])
    
    table.setStyle(TableStyle([
                           ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                           ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                           ]))
    
    c = canvas.Canvas("a.pdf", pagesize=A4)
    table.wrapOn(c, width, height)
    table.drawOn(c, *coord(1.8, 9.6, cm))
    c.save()