2012-10-25 26 views
4

我试图让下面的代码片段能够实际绘制旋转90度的文档。 pagesize已经是我最终想要的方式,但文字仍然是水平的。我如何旋转文字使其垂直?带有ReportLab的旋转文档(垂直文本)

style = getSampleStyleSheet() 
normal = style["Normal"] 
normal.alignment = TA_CENTER 
normal.fontName = "Helvetica" 
normal.fontSize = 15 

pdf = SimpleDocTemplate("testplatypus.pdf", pagesize = (80, 250), rightMargin=10, leftMargin=10, topMargin=20,bottomMargin=20) 
story = [] 
text = "I really need this to be wrapped and vertical!" 

para = Paragraph(text, normal) 
story.append(para) 
pdf.build(story) 
+1

我相信你将不能够通过鸭嘴兽做到这一点,将需要直接在画布上做。这个[page](http://www.local-guru.net/blog/2009/4/9/rotated-text-in-reportlabs)可能会有所帮助。 –

回答

1

也许你可以通过添加构建方法来做到这一点。

就是这样的。

pdf = SimpleDocTemplate("testplatypus.pdf", pagesize = (80, 250), rightMargin=10, leftMargin=10, topMargin=20,bottomMargin=20) 
pdf.build(Story, onFirstPage = myFirstPage, onLaterPages=myLaterPages) 

def myFirstPage(canvas, doc): 
      canvas.saveState() 
      canvas.rotate(90) 
      canvas.restoreState() 


def myLaterPages(canvas, doc): 
      canvas.saveState() 
      canvas.rotate(90) 
      canvas.restoreState() 
2

这是这个问题的顶级谷歌结果,所以我想我会发布一个更好的解决方案。我的答案直接来自here

如果您使用的是doc模板,那么您可以使用非常轻量级的Flowable,它将在特定的表格单元格中创建垂直文本。

# rotatedtext.py 
from reportlab.platypus.flowables import Flowable 


class verticalText(Flowable): 

'''Rotates a text in a table cell.''' 

def __init__(self, text): 
    Flowable.__init__(self) 
    self.text = text 

def draw(self): 
    canvas = self.canv 
    canvas.rotate(90) 
    fs = canvas._fontsize 
    canvas.translate(1, -fs/1.2) # canvas._leading? 
    canvas.drawString(0, 0, self.text) 

def wrap(self, aW, aH): 
    canv = self.canv 
    fn, fs = canv._fontname, canv._fontsize 
    return canv._leading, 1 + canv.stringWidth(self.text, fn, fs) 

然后用它在一个文档:

# vertical_text_table.py 
from reportlab.pdfbase import pdfmetrics 
from reportlab.pdfbase.ttfonts import TTFont 
from reportlab.lib import colors 
from reportlab.lib.colors import HexColor 
from reportlab.lib.pagesizes import letter 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.lib.units import inch 
from reportlab.platypus import (
     BaseDocTemplate, Frame, Paragraph, NextPageTemplate, 
     PageBreak, PageTemplate, Image, Table, TableStyle, Spacer) 
from rotatedtext import verticalText 

document = BaseDocTemplate(
    'Vertical.pdf') 

Elements = [] 

titleFrame_1 = Frame(
    0.5*inch, 0.75*inch, 7*inch, 9*inch, id='col1', showBoundary=0) 
titleTemplate_1 = PageTemplate(
    id='OneCol', frames=titleFrame_1) 
document.addPageTemplates([titleTemplate_1]) 

cw = [1.2*inch] + [1*inch]*6 
rh = [0.25*inch] + [.6*inch] + [0.25*inch]*7 

data = [ 
    ['Some', 'Reporting', '', 'Data', '', 'Here', ''], 
    ['', verticalText('Vertical'), verticalText('Text'), 
     verticalText('Vertical'), verticalText('Text'), 
     verticalText('Vertical'), verticalText('Text')], 
    ['Row1', '0', '0', '69', '803', '20751', '11627'], 
    ['Row2', '0', '0', '1', '0', '1096', '103'], 
    ['Row3', '0', '0', '0', '0', '233', '1'], 
    ['Row4', '0', '0', '0', '0', '694', '38'], 
    ['Row5', '0', '0', '23', '2', '1319', '2'], 
    ['Row6', '0', '0', '0', '0', '0', '0'], 
    ['TOTAL', '0', '0', '93', '805', '24093', '11771'], 
    ] 

ts = [ 
    ('GRID', (0, 0), (-1, -1), 0.5, colors.black), 
    ('SPAN', (1, 0), (2, 0)), 
    ('SPAN', (3, 0), (4, 0)), 
    ('SPAN', (5, 0), (6, 0)), 
    ('SPAN', (0, 0), (0, 1)), 
    ('ALIGN', (0, 0), (-1, 1), 'CENTER'), 
    ('ALIGN', (0, 2), (-1, -1), 'RIGHT'), 
    ('VALIGN', (0, 0), (-1, -2), 'MIDDLE'), 
    ('FONT', (0, 0), (-1, 1), 'Helvetica-Bold', 7, 7), 
    ('FONT', (0, 2), (0, -2), 'Helvetica-Bold', 7, 7), 
    ('FONT', (1, 2), (-1, -2), 'Helvetica', 7, 7), 
    ('FONT', (0, -1), (-1, -1), 'Helvetica-Bold', 8, 8), 
    ('TEXTCOLOR', (0, -1), (-1, -1), colors.white), 
    ('BACKGROUND', (0, -1), (-1, -1), colors.black), 
] 

t = Table(
    data, style=ts, 
    colWidths=cw, rowHeights=rh) 

Elements.append(t) 
document.build(Elements) 

其中给出:

Table with vertical text.

+0

完美!非常感谢你写这篇文章,KJYDavis! – Lupacante