【问题标题】:How do you change from Landscape to Portrait Layout in python ReportLab?如何在 python ReportLab 中从横向布局更改为纵向布局?
【发布时间】:2013-02-27 06:32:05
【问题描述】:

我有一个新手问题(应该很容易回答)在过去一天左右一直困扰着我,并且在倾注了所有与 reportlab 相关的在线帖子之后仍然无法弄清楚。我要做的就是在同一个文档中从横向切换到纵向。这将允许我创建一个特征表(包括表中这些图片的链接),然后放入图片以便它们可以链接到。

这里是我迄今为止想出的代码,以促进应该是一个简单的过程:

from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, landscape
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Frame,
                   Table, TableStyle, NextPageTemplate, PageTemplate, BaseDocTemplate
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.platypus.flowables import Flowable, PageBreak
from pyPdf import PdfFileReader, PdfFileWriter
import glob, os
from reportlab.lib.pagesizes import letter, A4

doc = BaseDocTemplate("M:\GIS Mapping Services\Promotional\Automated Reports\PDF_ReportLab\NextPageExample.pdf",showBoundary=1,pagesize=landscape(letter))
elements = []
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(name='normal', fontSize=6, leading = 7, alignment=TA_LEFT))

ptemplate = PageTemplate(id='portrait', pagesize=portrait(letter))
elements.append(Paragraph("Table is here.",styles["normal"]))
elements.append(NextPageTemplate('portrait'))
elements.append(PageBreak())
elements.append(Paragraph("Pictures are to be placed here.",styles["normal"]))

doc.build(elements)
del elements

如果您有任何提示或想帮助我解决这个问题,请您具体说明一下我做错了什么,或者包括一个从头到尾没有任何编码丢失的工作示例。

提前感谢您的帮助,

赢了

【问题讨论】:

  • 我记得这是可能的,因为我想我做过一次,但要注意在文档中切换页面大小可能会出错。我放弃了这个,因为即使我让它“工作”了,我仍然无法在所有 PDF 阅读器中打印和可靠地显示。不确定这是 ReportLab 做事方式的问题还是 PDF 固有的问题。
  • 但我并不想改变页面大小,只是改变方向。我想将所有页面保持在标准字母大小。 -温

标签: python reportlab


【解决方案1】:

这是一个 hack,基于我找到的答案 here

from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, landscape
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Frame,Table, TableStyle, NextPageTemplate, PageTemplate, BaseDocTemplate
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.platypus.flowables import Flowable, PageBreak
from pyPdf import PdfFileReader, PdfFileWriter
import glob, os
from reportlab.lib.pagesizes import letter, A4

def make_portrait(canvas,doc):
    canvas.setPageSize(letter)

def make_landscape(canvas,doc):
    canvas.setPageSize(landscape(letter))

doc = BaseDocTemplate("NextPageExample.pdf",showBoundary=1)
elements = []
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(name='normal', fontSize=6, leading = 7, alignment=TA_LEFT))


frame1 = Frame(doc.leftMargin, doc.height-5*inch,
                doc.width, 5*inch,
                leftPadding = 0, rightPadding = 0,
                topPadding = 0, bottomPadding = 0,
                id='frame1')

ptemplate = PageTemplate(id='portrait',frames =[frame1], onPage=make_portrait)
ltemplate = PageTemplate(id='landscape',frames =[frame1], onPage=make_landscape)
doc.addPageTemplates([ptemplate, ltemplate])
elements.append(Paragraph("Table is here.",styles["normal"]))
elements.append(NextPageTemplate('landscape'))
elements.append(PageBreak())
elements.append(Paragraph("Pictures are to be placed here.",styles["normal"]))

doc.build(elements)
del elements

使用鸭嘴兽时,我发现操作画布的最简单方法是通过 PageTemplate 的 onPage 设置,它可以让您实现文本的非流动部分。在这里,在横向或纵向模板上绘制任何内容之前,画布会被重新调整为所需的大小。

【讨论】:

  • 太棒了。感谢您的帮助。稍微调整一下,我就能得到我想要的布局。
  • 我很高兴能帮上忙,我刚刚在工作中的一个报告实验室项目上花了几个星期,我知道文档是多么迟钝。 Stackoverflow 很快就得到了答案,所以请随时发布更多问题。另外,如果我的答案对您有用,请单击我的答案旁边的检查以接受它。这不仅给了我荣誉,而且让人们在知道你接受问题时更乐意为你回答问题。
  • 哈哈哈,看来我之前确实回答过这个问题,但没有鸭嘴兽。
  • 好吧,也许我说这个问题已经解决了。对于我的一生,我仍然无法得到我想要完成的事情。上面的代码允许从纵向到横向。但是,我真的想从横向开始并转向纵向。出于某种原因,将页面大小设置为横向(字母)仍然会创建纵向。
  • 只需更改页面模板的顺序即可。通过将 ptemplate 放在首位,这是默认模板。然后调用elements.append(NextPageTemplate('landscape')) 使下一页成为风景。要更改顺序,请将行 doc.addPageTemplates([ptemplate, ltemplate]) 更改为 doc.addPageTemplates([ltemplate, ptemplate]) 然后而不是调用 elements.append(NextPageTemplate('landscape')) 调用 elements.append(NextPageTemplate('portrait'))
【解决方案2】:

您可以进一步简化上述内容。不需要另外两个函数来设置旋转画布:

    p_frame = Frame(0.5 * inch, 0.5 * inch, 7.5 * inch, 10 * inch,
                   leftPadding=0, rightPadding=0,
                   topPadding=0, bottomPadding=0,
                   id='portrait_frame')

    l_frame = Frame(0.5 * inch, 0.5 * inch, 10 * inch, 7.5 * inch,
                    leftPadding=0, rightPadding=0,
                    topPadding=0, bottomPadding=0,
                    id='landscape_frame')

    portrait_tmpl = PageTemplate(id='portrait_tmpl', frames=[p_frame], pagesize=letter)
    landscape_tmpl = PageTemplate(id='landscape_tmpl', frames=[l_frame], pagesize=landscape(letter))

它更易于维护。虽然,我还没有找到解决设置两个单独框架的方法。

答案中的框架在旋转时对我不起作用。

【讨论】:

  • 今天这对我有用。在我的情况下,我只对大图像使用横向模式,所以有两个框架是一个加号,因为我需要对页边距做不同的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2017-10-14
相关资源
最近更新 更多