【问题标题】:Booklet page layout with ReportLab使用 ReportLab 的小册子页面布局
【发布时间】:2020-04-09 09:16:11
【问题描述】:

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

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

BG|HA
DE|FC

我已经看到这个订单被称为 4-up 或 imposition。

我的打印机可以选择在每张纸上打印四页,但它不会重新排列页面。如果我使用该设置和双面打印当前文档,结果如下:

AB|EF
CD|GH

我的第一个偏好是生成一个每张纸有四页的 PDF,如图所示。如果我无法弄清楚,下一个最好的办法是生成一个带有重新排序页面的 PDF,以便我的打印机可以在每张纸上打印四页。换句话说,将页面重新排序为 B、G、D、E、H、A、F 和 C。

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

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()

【问题讨论】:

    标签: python reportlab page-layout


    【解决方案1】:

    感谢this question,我可以了解如何在将画布页面实际写入文档之前收集它们。我添加了一些代码来重新排序它们,现在我可以使用额外的打印机选项将它们打印到每张纸上 4 页。

    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 页,但现在就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多