我有一个用ReportLab生成PDF文件的Python程序,我想生成另一个PDF,它的格式是将每一页切成两半,然后折叠并装订成一本小册子。
例如,如果我的当前文档包含A、B、C、D、E、F、G和H页,我希望新文档有两页,可以双面打印出来,如下所示:
BG|HA
DE|FC我已经看到这个订单被称为4-up或强制执行。
我的打印机有一个选项,可以在每张纸上打印四页,但它不会对这些页进行重新排序。如果使用该设置打印当前文档并进行双面打印,结果如下所示:
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()发布于 2019-12-17 05:33:32
多亏了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页,但现在可以这样做。
https://stackoverflow.com/questions/59364581
复制相似问题