使用PyPDF2在pdf页面中添加边距

6
我正在创建一个Python脚本,可以修改PDF文件以便分段打印。由于Ubuntu打印设置中没有这样的功能。
PyPDF2是一个很棒的工具,我已经能够做到我想要的一切,除了添加边距之外。
例如考虑这本书。 http://www.edwardothorp.com/sitebuildercontent/sitebuilderfiles/beatthemarket.pdf 它需要一些边距,以便在书籍中留出一些空间来装订。
我已经找到如何将内容向左移动几个像素,但“画布”的大小并没有改变,因此一些内容被裁剪了。
我能够通过更改mediabox大小来调整“页面大小”,但我只能裁剪页面,无法增加其大小。 要添加边距,我必须增加大小。 我也不能缩小内容,因为这样页面大小会因某种原因而缩小。

如果您想打印一本书,以下是脚本。 http://pastebin.com/LGYhKYu1 当然,它只适用于已经有一些边距的pdf,因此您只需要移动内容。

如果有人能指出如何使用PyPDF2添加pdf的边距,我将不胜感激,我肯定是忽略了什么。

谢谢!

3个回答

8
似乎没有专门的方法,但您可以创建所需大小的空页面,然后将内容与空页面合并。
page = PageObject.createBlankPage(
        yourPage.mediaBox.getWidth () + 2 * margin,  
        yourPage.mediaBox.getHeight() + 2 * margin)
page.mergeScaledTranslatedPage( yourPage, scale, leftMargin, bottomMargin)    
...
output = PdfFileWriter()
output.addPage(page)

1

我自己也在尝试弄清楚这个问题。我的目标是将一张B5页面的内容裁剪并适配到A4纸张上,以便制作小册子。

bind_margin = 60
for pnum in tqdm(range(numpage)):
    page = inpdf.getPage(pnum)

    # Trim margins from right and left
    page.trimBox.lowerLeft = tuple([a+b for a, b in zip(page.trimBox.lowerLeft, (50, 0))])
    page.trimBox.upperRight = tuple([a-b for a, b in zip(page.trimBox.upperRight, (50, 0))])
    page.cropBox.lowerLeft = tuple([a+b for a, b in zip(page.cropBox.lowerLeft, (50, 0))])
    page.cropBox.upperRight = tuple([a-b for a, b in zip(page.cropBox.upperRight, (50, 0))])

    # create empty A4 size page
    emptyPage = pdf.PageObject.createBlankPage(width=tarw, height=tarh)
    margin_available = tarw + page.mediaBox.lowerLeft[0] - page.mediaBox.upperRight[0]

    if pnum%2==0:
            tx = bind_margin
    else:
            tx = margin_available - bind_margin

    emptyPage.mergeTranslatedPage(page, tx, 180)

    outpdf.addPage(emptyPage)

0
我假设你的意思是奇数页的左边要比右边有更多的边距,而偶数页的右边要比左边有更多的边距。我使用了“主要变量”来表示较大的边距,使用了“次要变量”来表示常规的边距,顶部和底部的边距则保持不变。我使用这个脚本来准备书籍精装印刷的PDF文件,其中书籍从右手边的奇数页开始(所以左边的边距要比右边大),而偶数页则相反。
import argparse
from PyPDF2 import PdfReader, PdfWriter

def to_points(x):
    return x * 72 if measure == "inch" else x * 28.8

def add_margins(input_pdf, output_pdf, primary=0, secondary=0, top=0, bottom=0):
    with open(input_pdf, 'rb') as f:
        reader = PdfReader(f)
        writer = PdfWriter()

        for i, page in enumerate(reader.pages):
            i = i + 1

            if i % 2 == 0:
                page.mediabox.lower_left = (float(page.mediabox.lower_left[0]) - secondary, float(page.mediabox.lower_left[1]) - bottom)
                page.mediabox.lower_right = (float(page.mediabox.lower_right[0]) + primary, float(page.mediabox.lower_right[1]) - bottom)
                page.mediabox.upper_left = (float(page.mediabox.upper_left[0]) - secondary, float(page.mediabox.upper_left[1]) + top)
                page.mediabox.upper_right = (float(page.mediabox.upper_right[0]) + primary, float(page.mediabox.upper_right[1]) + top)
            else:
                page.mediabox.lower_left = (float(page.mediabox.lower_left[0]) - primary, float(page.mediabox.lower_left[1]) - bottom)
                page.mediabox.lower_right = (float(page.mediabox.lower_right[0]) + secondary, float(page.mediabox.lower_right[1]) - bottom)
                page.mediabox.upper_left = (float(page.mediabox.upper_left[0]) - primary, float(page.mediabox.upper_left[1]) + top)
                page.mediabox.upper_right = (float(page.mediabox.upper_right[0]) + secondary, float(page.mediabox.upper_right[1]) + top)

            writer.add_page(page)

        with open(output_pdf, 'wb') as out:
            writer.write(out)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Add margins to a PDF file.")
    parser.add_argument('input_pdf', type=str, help="Input PDF file path")
    parser.add_argument('output_pdf', type=str, help="Output PDF file path")
    parser.add_argument('--side_p', type=float, default=0, help="Margin of primary side")
    parser.add_argument('--side_s', type=float, default=0, help="Margin of secondary side")
    parser.add_argument('--top', type=float, default=0, help="Top margin")
    parser.add_argument('--bottom', type=float, default=0, help="Bottom margin")
    parser.add_argument('--measure', type=str, default=0, help="cm or inch")

    args = parser.parse_args()
    measure = args.measure

    add_margins(
        args.input_pdf,
        args.output_pdf,
        to_points(args.side_p),
        to_points(args.side_s),
        to_points(args.top),
        to_points(args.bottom)
    )

在命令提示符中运行: python add-margings-pdf.py linear-algebra-printing.pdf out-linear-algebra-printing.pdf --side_p 0.75 --side_s 0.5 --top 0.5 --bottom 0.5 --measure inch

花了一些时间才明白图书馆如何在X和Y方向上增加页面。例如,我想在左侧增加奇数页,所以我从左下角X和左上角X中减去主要页面,以创建一个空间,这样PDF的白色区域就会向负方向增长。奇数/偶数页的Y方向工作方式是:它从底部开始,我从左下角Y和右下角Y中减去一些值,使其向负方向增长。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接