首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ReportLab的小册子页面布局

使用ReportLab的小册子页面布局
EN

Stack Overflow用户
提问于 2019-12-17 05:33:32
回答 1查看 453关注 0票数 0

我有一个用ReportLab生成PDF文件的Python程序,我想生成另一个PDF,它的格式是将每一页切成两半,然后折叠并装订成一本小册子。

例如,如果我的当前文档包含A、B、C、D、E、F、G和H页,我希望新文档有两页,可以双面打印出来,如下所示:

代码语言:javascript
复制
BG|HA
DE|FC

我已经看到这个订单被称为4-up或强制执行。

我的打印机有一个选项,可以在每张纸上打印四页,但它不会对这些页进行重新排序。如果使用该设置打印当前文档并进行双面打印,结果如下所示:

代码语言:javascript
复制
AB|EF
CD|GH

我的第一个偏好是生成一个每页四页的PDF,如下所示。如果我不能解决这个问题,下一个最好的办法就是生成一个页面重新排序的PDF,这样我的打印机就可以在每张纸上打印四页。换句话说,将页面重新排序为B、G、D、E、H、A、F和C。

下面是一个打印八页的代码示例:

代码语言:javascript
复制
from subprocess import call

from reportlab.lib import pagesizes
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Paragraph


def main():
    pdf_path = 'booklet.pdf'
    doc = SimpleDocTemplate(pdf_path,
                            pagesize=pagesizes.letter,
                            topMargin=0.625*inch,
                            bottomMargin=0.625*inch)
    styles = getSampleStyleSheet()
    paragraph_style = styles['Normal']
    print(paragraph_style.fontSize, paragraph_style.leading)
    paragraph_style.fontSize = 300
    paragraph_style.leading = 360
    story = []
    for text in 'ABCDEFGH':
        flowable = Paragraph(text, paragraph_style)
        story.append(flowable)

    doc.build(story)

    # call(["evince", pdf_path])  # launch PDF viewer


main()
EN

回答 1

Stack Overflow用户

发布于 2019-12-17 05:33:32

多亏了this question,我才知道如何在将画布页真正写入文档之前收集它们。我添加了一些代码来重新排序它们,现在我可以用我的额外打印机选项将它们打印出来,每页4页。

代码语言:javascript
复制
from subprocess import call

from reportlab.lib import pagesizes
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.pdfgen.canvas import Canvas
from reportlab.platypus import SimpleDocTemplate, Paragraph


class BookletCanvas(Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pages = []

    def showPage(self):
        self.pages.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        while len(self.pages) % 8 != 0:
            self.showPage()
        original_pages = self.pages[:]
        reordered_pages = []
        while original_pages:
            reordered_pages.append(original_pages.pop(1))
            reordered_pages.append(original_pages.pop(-2))
            reordered_pages.append(original_pages.pop(2))
            reordered_pages.append(original_pages.pop(-3))
            reordered_pages.append(original_pages.pop(-1))
            reordered_pages.append(original_pages.pop(0))
            reordered_pages.append(original_pages.pop(-1))
            reordered_pages.append(original_pages.pop(0))
        for page in reordered_pages:
            self.__dict__.update(page)
            super().showPage()
        super().save()


def main():
    pdf_path = 'booklet.pdf'
    doc = SimpleDocTemplate(pdf_path,
                            pagesize=pagesizes.letter,
                            topMargin=0.625*inch,
                            bottomMargin=0.625*inch)
    styles = getSampleStyleSheet()
    paragraph_style = styles['Normal']
    print(paragraph_style.fontSize, paragraph_style.leading)
    paragraph_style.fontSize = 300
    paragraph_style.leading = 360
    story = []
    for text in 'ABCDEFGH':
        flowable = Paragraph(text, paragraph_style)
        story.append(flowable)

    doc.build(story, canvasmaker=BookletCanvas)

    # call(["evince", pdf_path])  # launch PDF viewer


main()

我仍然倾向于在PDF中的每个工作表中做4页,但现在可以这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59364581

复制
相关文章

相似问题

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