标签: reportlab

向Reportlab Canvas对象添加分页符

我需要生成一个2页的pdf报告.页面完全独立.尝试使用:

mycanvas.drawString(x, y, "Printing on Page 1")
mycanvas._pageNumer = 2
mycanvas.drawString(x, y, "Printing on Page 2")
Run Code Online (Sandbox Code Playgroud)

和:

mycanvas.drawString(x, y, "Printing on Page 1")
P = PageBreak()
P.drawOn(mycanvas, 0, 1000)
mycanvas.drawString(x, y, "Printing on Page 2")
Run Code Online (Sandbox Code Playgroud)

但是所有内容都打印在同一页面上.

我应该如何向此Canvas实例添加分页符?

python reportlab

9
推荐指数
1
解决办法
1万
查看次数

是什么决定了Reportlab表中的垂直空间?

我在文档中定义了这种风格:

styles.add(ParagraphStyle(name='Table Header', font ='Helvetica-Bold',fontSize=16, alignment=TA_CENTER))
Run Code Online (Sandbox Code Playgroud)

我使用它来定义文本的段落以进入每个表的顶行(以便它们正确包装):

L2sub = [(Paragraph(L[0][0], styles['Table Header']))]
Run Code Online (Sandbox Code Playgroud)

后来,当我添加一个表时,还有一个定义样式的地方:

report.append(Table(data,style=[
                ('GRID',(0,0),(len(topiclist)-1,-1),0.5,colors.grey),
                ('FONT', (0,0),(len(topiclist)-1,0),'Helvetica-Bold',16),
                ('FONT', (0,1),(len(topiclist)-1,1),'Helvetica-Bold',12),
                ('ALIGN',(0,0),(-1,-1),'CENTER'),
                ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
                ('SPAN',(0,0),(len(topiclist)-1,0)),
                ]))
Run Code Online (Sandbox Code Playgroud)

我的问题是:定义第一行单元格垂直高度的设置在哪里?我有一些问题,文本对于单元格来说太大和/或在单元格中设置得太低,但我无法确定导致它的原因或修复它的方法.我已经改变了两种尺寸,但我不能让细胞成为除了相同高度之外的任何东西.当我只是将文本放入单元格而不是段落时,表格def'n工作得很好,但段落引起了问题.

python reportlab

9
推荐指数
2
解决办法
7711
查看次数

Django,ReportLab PDF生成附加到电子邮件

使用Django和ReportLab生成PDF并将其附加到电子邮件消息的最佳方法是什么?

我正在使用SimpleDocTemplate并且可以将生成的PDF附加到我的HttpResponse - 这很棒,但是我无法找到如何将相同的附件添加到电子邮件中:

    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=invoice.pdf'
    doc = SimpleDocTemplate(response, pagesize=letter)
    Document = []
Run Code Online (Sandbox Code Playgroud)

...通过将表附加到文档来制作我的pdf ...

  doc.build(Document)
  email = EmailMessage('Hello', 'Body', 'from@from.com', ['to@to.com'])
  email.attach('invoice.pdf', ???, 'application/pdf')
  email.send()
Run Code Online (Sandbox Code Playgroud)

我只是不确定如何将我的pdfdocument翻译为blob,以便email.attach可以接受它并且email.send可以发送它.

有任何想法吗?

email django reportlab

8
推荐指数
2
解决办法
6775
查看次数

reportlab中的条件分页符

我正在用Reportlab platypus创建PDF表格.我不知道,因为动态内容页面已满.如果我在页面的末尾,我该如何查看?

鸭嘴兽有没有方法检查页面末尾?

我有公司名单,每家公司都有多个业务部门负责.

   companies = [('company1', 'businessunit1', 500),
                ('company1', 'businessunit2',400),
                ('company2', 'businessunit3',200),
                ('company2', 'businessunit4', 700),
                ('company3', 'businessunit5', 800)
               ]
Run Code Online (Sandbox Code Playgroud)

上面的列表应该为一个公司生成3个表,但是如果这个列表有多个公司将生成多个表,并且如果任何表到达页面末尾将会中断.

      fields = ['company name', 'business unit name', 'charge']
      for i, comp in enumerate(companies):
          charges = []
          document.append(Paragraph("<b>%s</b>" %comp[i][0], STYLES['COMPANY_NAME']))
          document.append(Spacer(1, 5))
          charges.append(comp[i][0])
          charges.append(comp[i][1])
          charges.append(comp[i][2])
          charges_table = LongTable([fields] + charges, colWidths=(30,150,100))
          charges_table.setStyle(TableStyle([
                          ('BACKGROUND', (0, 0), (-1, 0), colors.gray),
                          ('FONTSIZE', (0, 0), (-1, 0), 6),
                          ('GRID', (0, 0), (-1, -1), 1, colors.gray),
                          ('FONTSIZE', (0, 0), (-1, -1), 7),
                          ('TEXTCOLOR',(0,-1),(-1,-1),'#FF4500'),
                          ])
                          ) …
Run Code Online (Sandbox Code Playgroud)

python django reportlab

8
推荐指数
1
解决办法
6846
查看次数

使用reportlab SimpleDocTemplate和Django的两个不同页面

我正在使用django并根据此示例生成报告,我需要生成最后一页但没有页眉或页脚和不同的内容.

我正在尝试这样做:

def print_example(self):
    buffer = self.buffer
    doc = SimpleDocTemplate(buffer,
                            rightMargin=72,
                            leftMargin=72,
                            topMargin=72,
                            bottomMargin=72,
                            pagesize=self.pagesize)

    elements = []
    elements.append(Paragraph('Content for all pages'), my_custom_style)
    # ...

    doc.build(elements, onFirstPage=self._header_footer, onLaterPages=self._header_footer,
                  canvasmaker=NumberedCanvas)

    doc2 = SimpleDocTemplate(buffer,
                        rightMargin=72,
                        leftMargin=72,
                        topMargin=72,
                        bottomMargin=72,
                        pagesize=self.pagesize)

    elements2 = []
    elements2.append(Paragraph('Content for the last page only'), my_custom_style)

    doc2.build(elements2, canvasmaker=NumberedCanvas)


    # Get the value of the BytesIO buffer and write it to the response.
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
Run Code Online (Sandbox Code Playgroud)

然后只显示最后一个内容,之前的内容消失.

如何生成包含不同内容的最后一页?

python django reportlab

8
推荐指数
1
解决办法
6348
查看次数

Reportlab:将表格对齐到框架的“底部”

我在将表格对象与框架底部对齐时遇到问题,hAlign“RIGHT”和“LEFT”有效,但它似乎卡在“TOP”中,如何将表格向下对齐到“MIDDLE”或“框架的底部?下面是一个完整且可运行的示例。请注意,框架内的表格应位于底部,这意味着表格位于右下角(现在,下面的表格位于框架的顶部)。

from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import Frame, PageTemplate
from reportlab.lib.units import cm
from reportlab.platypus import (Table, TableStyle, BaseDocTemplate)

########################################################################

def create_pdf():
    """
    Create a pdf
    """

    # Create a frame
    CatBox_frame = Frame(
        x1=14.00 * cm,  # From left
        y1=1.5 * cm,  # From bottom
        height=9.60 * cm,
        width=5.90 * cm,
        leftPadding=0 * cm,
        bottomPadding=0 * cm,
        rightPadding=0 * cm,
        topPadding=0 * cm,
        showBoundary=1,
        id='CatBox_frame')

    # Create a table
    CatBox = Table([
        ['', '', …
Run Code Online (Sandbox Code Playgroud)

python pdf reportlab

8
推荐指数
1
解决办法
4288
查看次数

升级到 Macos Big Sur 后 Reportlab 安装失败

升级到 MacOS Big Sur 后,我试图重新安装我的虚拟环境。

但出现错误:

4 warnings generated.
    clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk -I/Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX11.0.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -Qunused-arguments -Qunused-arguments -DRENDERPM_FT -DLIBART_COMPILATION -DLIBART_VERSION=2.3.21 -Isrc/rl_addons/renderPM -Isrc/rl_addons/renderPM/libart_lgpl -Isrc/rl_addons/renderPM/gt1 -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/sqlite/include -I/Users/zulfugar/PycharmProjects/AppForm/.venv/include -I/usr/local/Cellar/python@3.8/3.8.6_1/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c src/rl_addons/renderPM/gt1/gt1-parset1.c -o build/temp.macosx-11.0-x86_64-3.8/src/rl_addons/renderPM/gt1/gt1-parset1.o
    src/rl_addons/renderPM/gt1/gt1-parset1.c:604:28: warning: for loop has empty body [-Wempty-body]
            for (i = 0; i < size; i++);
                                      ^
    src/rl_addons/renderPM/gt1/gt1-parset1.c:604:28: note: put the semicolon on a separate line to silence this warning
    src/rl_addons/renderPM/gt1/gt1-parset1.c:1907:16: warning: comparison of integers of different signs: …
Run Code Online (Sandbox Code Playgroud)

python reportlab clang macos-big-sur

8
推荐指数
2
解决办法
1840
查看次数

使用reportLab向页面添加页眉和页脚

我试图将页眉和页脚包含在单个页面上。我在reportlab中引用了A multiline(paragraph) footer and header,并使用了Jochen和NateB80所述的方法。但只生成页眉,而不生成页脚。

def header(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.topMargin)
    content.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h)
    canvas.restoreState()


def footer(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.bottomMargin)
    content.drawOn(canvas, doc.leftMargin, h)
    canvas.restoreState()

styles = getSampleStyleSheet()

PAGESIZE = pagesizes.portrait(pagesizes.A4)
# PAGESIZE = letter
pdf = SimpleDocTemplate(filename, pagesize=PAGESIZE, leftMargin=2.2*cm, rightMargin=2.2*cm,
        topMargin=1.5*cm,bottomMargin=2.5*cm)
frameh = Frame(pdf.leftMargin, pdf.bottomMargin, pdf.width, pdf.height - 2 * cm, id='normal')
header_content = Paragraph("This is a header. testing testing testing  ", styles['Normal'])
templateh = …
Run Code Online (Sandbox Code Playgroud)

python pdf header reportlab footer

8
推荐指数
1
解决办法
7561
查看次数

在 macOS 12 上使用 Python@3.9 的 reportlab 在平面命名空间“_FT_Done_Face”中找不到符号

我有一个 Django 项目,使用 easy-thumbnail 作为依赖项。

使用 pip 安装所有软件包按预期工作,但是当我尝试运行我的应用程序时,出现此错误:

Invalid template library specified. ImportError raised when trying to load 'backend.templatetags.get_thumbnail': dlopen(/opt/homebrew/lib/python3.9/site-packages/reportlab/graphics/_renderPM.cpython-39-darwin.so, 0x0002): symbol not found in flat namespace '_FT_Done_Face'
Run Code Online (Sandbox Code Playgroud)

该错误是从 reportlab 引发的,它是 easy-thumbnail 的依赖项。据我了解,reportlab 无法找到 freetype。但恕我直言,它安装正确。

我使用的是 macOS 12.0.1

我通过 Homebrew 安装了 Python 和 freetype。pkg-config 表示,freetype2 在预期路径中可用。

我究竟做错了什么?我怎样才能解决这个问题?


编辑

otool -l对失败的 .so 文件做了处理,这就是我得到的(这里我在 venv 中再次运行它):

/Users/markusgerards/.pyenv/versions/myapp/lib/python3.9/site-packages/reportlab/graphics/_renderPM.cpython-39-darwin.so:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
Run Code Online (Sandbox Code Playgroud)

我怀疑 freetype 应该列在那里......对吧?

python macos homebrew reportlab

8
推荐指数
2
解决办法
8416
查看次数

Python - ReportLab 和 PyPDF 编辑 PDF 问题

PyPDF我正在尝试使用和编辑现有的 pdf 文件ReportLab。当我尝试放置红色圆圈和红色文本时,它似乎隐藏在白色容器或其他东西后面。如果我把它放在其他地方,它就可以正常工作。是什么原因造成的?

样本 pdf = https://www.puc.nh.gov/regulatory/CASEFILE/2010/10-246/INITIAL%20FILING%20-%20PETITION/10-246%202010-09-13%20BAYRING%20ATT%20TO% 20PET%20FOR%20AUTH%20TO%20CONSTRUCT%20UTILITY%20CABLE%20OVER%20AND%20ACROSS%20SUNCOOK%20RIVER.PDF

WHAT THE ERROR IS:

WHAT THE FINAL RESULT SHOULD BE:

from PyPDF2 import PdfWriter, PdfReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.colors import red

def main():
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    can.setFillColorRGB(1, 0, 0)
    can.circle(370,780,20,fill=1)
    can.setFillColor(red)
    can.setFont("Times-Roman", 14)
    can.drawString(352, 785, "Customer Group #22")
    can.save()

    packet.seek(0)
    new_pdf = PdfReader(packet)

    existing_pdf = PdfReader(open("samplePDF.pdf", "rb"))
    output = PdfWriter()

    page = existing_pdf.pages[1]
    page.merge_page(new_pdf.pages[0])
    output.add_page(page)

    outputStream = …
Run Code Online (Sandbox Code Playgroud)

python reportlab pypdf pdf-reader

8
推荐指数
1
解决办法
850
查看次数

标签 统计

reportlab ×10

python ×9

django ×3

pdf ×2

clang ×1

email ×1

footer ×1

header ×1

homebrew ×1

macos ×1

macos-big-sur ×1

pdf-reader ×1

pypdf ×1