PyPDF2 将pdf的两个页面拼接成一个页面

文章介绍了如何使用Python库PyPDF2(现称pypdf)中的功能,分别实现PDF页面在右侧和下方的拼接,以及创建空白PDF并插入内容后进行拼接的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from PyPDF2.generic import RectangleObject
from PyPDF2 import PdfReader, PdfWriter, Transformation
# PyPDF2已不更新,库名改为 pypdf
# 1.拼接在右方

def merge_pdf_right():
    reader = PdfReader("1.pdf")
    page1 = reader.pages[0]
    print('page1.cropbox:', page1.cropbox)
    reader2 = PdfReader("2.pdf")
    page2 = reader2.pages[0]

    offset = page1.cropbox.right
    print('offset:', offset)

    op = Transformation().translate(tx=offset, ty=0) # 拼接在右侧
    page2.add_transformation(op)
    cb = page2.cropbox

    page2.mediabox = RectangleObject((cb.left + offset, cb.bottom, cb.right + offset, cb.top))
    page2.cropbox = RectangleObject((cb.left + offset, cb.bottom, cb.right + offset, cb.top))
    page2.trimbox = RectangleObject((cb.left + offset, cb.bottom, cb.right + offset, cb.top))
    page2.bleedbox = RectangleObject((cb.left + offset, cb.bottom, cb.right + offset, cb.top))
    page2.artbox = RectangleObject((cb.left + offset, cb.bottom, cb.right + offset, cb.top))

    page1.merge_page(page2, expand=True)
    mb = page1.mediabox
    print('mb:', mb)
    page1.mediabox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.cropbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.trimbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.bleedbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.artbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    print('page1.mediabox:', page1.mediabox)

    writer = PdfWriter()
    writer.add_page(page1)
    with open("output.pdf", "wb") as fp:
        writer.write(fp)


# 2.拼接在下方

def merge_pdf_bottom():
    reader = PdfReader("1.pdf")
    page1 = reader.pages[0]
    print('page1.cropbox:', page1.cropbox)
    reader2 = PdfReader("2.pdf")
    page2 = reader2.pages[0]

    height = page1.cropbox.height
    print('height:', height)

    op = Transformation().translate(tx=0, ty=height)  # 拼接在下方
    page2.add_transformation(op)
    cb = page2.cropbox

    page2.mediabox = RectangleObject((cb.left, cb.bottom+height, cb.right, cb.top+height))
    page2.cropbox = RectangleObject((cb.left, cb.bottom+height, cb.right, cb.top+height))
    page2.trimbox = RectangleObject((cb.left, cb.bottom+height, cb.right, cb.top+height))
    page2.bleedbox = RectangleObject((cb.left, cb.bottom+height, cb.right, cb.top+height))
    page2.artbox = RectangleObject((cb.left, cb.bottom+height, cb.right, cb.top+height))

    page1.merge_page(page2, expand=True)
    mb = page1.mediabox
    print('mb:', mb)
    page1.mediabox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.cropbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.trimbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.bleedbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    page1.artbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top))
    print('page1.mediabox:', page1.mediabox)

    writer = PdfWriter()
    writer.add_page(page1)
    with open("output.pdf", "wb") as fp:
        writer.write(fp)

# 3. 自己将内容写入空白pdf,再进行拼接
import fitz
import qrcode
doc = fitz.open()
page_new = doc.new_page(width=45, height=30)
text = 'product_nameproduct_nameproduct'
page_new.insert_text(fitz.Point(0, 20), text, fontname="helv", fontsize=8)
qrcode_str = 'https://www.bing.com'
pdf_bytes = qrcode.make(qrcode_str)
rect = fitz.Rect(0, 2, 18, 18)
page.insert_image(rect, pixmap=pdf_bytes.get_image().toqpixmap(), overlay=True)
doc.save('lw.pdf')

另一篇文章pypdf 将 PDF两个页面拼接成一个页面进一步详解_page pdfreader 合并两个页码到一页中-CSDN博客

<think>嗯,用户想要把两个PDF整合到一起的代码,我需要想一下怎么用Python来实现这个功能。首先,我应该考虑用户可能使用的库,比如PyPDF2或者PyMuPDF,这两个库处理PDF比较常见。可能还有其他的库,但这两个比较主流。 用户可能需要的是将两个PDF文件按顺序合并,比如把第二个PDF的内容追加到第一个后面。那应该用PyPDF2PdfMerger类,或者PdfFileMerger,不过要注意版本问题。PyPDF2有不同版本,比如v2和v3,代码可能有差异。比如在PyPDF2 v3中,PdfMerger的用法可能和之前不同,需要确认导入的方式。 另外,用户可能对代码的兼容性有要求,比如是否支持不同版本的库。或者是否需要处理加密的PDF,但可能用户只是基本的合并,不需要复杂功能。所以示例代码应该尽量简单,同时说明依赖的库和安装方法。 还有,用户可能需要代码的详细解释,比如每一步的作用,这样他们可以理解并修改。比如打开每个PDF文件,读取内容,然后合并。另外,需要考虑文件路径的问题,是绝对路径还是相对路径,是否需要用户自己修改路径。 可能还要考虑异常处理,比如文件不存在或者无法读取的情况,但用户可能只需要核心代码,所以示例中可以省略异常处理,但最好在说明中提到需要注意的地方。 另外,输出文件的保存路径,应该让用户知道要指定正确的路径,比如使用os模块来拼接路径,避免跨平台的问题。或者直接让用户替换路径字符串。 还有,是否需要处理PDF的元数据,比如保留原来的书签或者调整页面大小。可能用户只是简单合并,所以默认配置即可。 最后,测试代码是否可行,确保示例代码正确无误。比如使用PdfMerger的append方法或者merge方法,然后写入输出文件。 总结下来,应该分步骤给出示例代码,先安装库,然后编写代码,读取两个PDF,合并,保存。同时说明不同库的优缺点,比如PyPDF2适合基本操作,PyMuPDF功能更强大但更复杂。</think>以下是一个使用 Python 和 `PyPDF2` 库实现合并两个 PDF 的示例代码: --- ### 1. 安装依赖库 ```bash pip install pypdf2 ``` --- ### 2. 核心代码 ```python from PyPDF2 import PdfMerger import os def merge_pdfs(pdf1_path, pdf2_path, output_path): merger = PdfMerger() # 逐个添加 PDF 文件 for pdf_path in [pdf1_path, pdf2_path]: with open(pdf_path, 'rb') as pdf_file: merger.append(pdf_file) # 保存合并后的文件 with open(output_path, 'wb') as merged_file: merger.write(merged_file) if __name__ == "__main__": # 定义输入和输出路径(按需修改) pdf1 = "path/to/first.pdf" # 第一个PDF路径 pdf2 = "path/to/second.pdf" # 第二个PDF路径 output = "path/to/merged.pdf" # 合并后的输出路径 # 执行合并 merge_pdfs(pdf1, pdf2, output) print("PDF合并完!") ``` --- ### 3. 代码说明 1. **PyPDF2**:轻量级库,适合基础PDF操作。 2. **PdfMerger**:提供合并功能,按顺序添加文件。 3. **路径处理**:确保输入文件存在,输出路径有写入权限。 --- ### 4. 高级需求 - **合并多个PDF**:将 `[pdf1_path, pdf2_path]` 替换为文件列表。 - **调整页面顺序**:通过 `merger.merge()` 方法控制插入位置。 - **处理加密PDF**:需先解密,或使用 `PyMuPDF` 库。 -- ### 替代方案:PyMuPDF 如果需要更复杂的操作(如提取内容/调整尺寸): ```python # 安装:pip install pymupdf import fitz # PyMuPDF def merge_with_pymupdf(pdf1, pdf2, output): doc1 = fitz.open(pdf1) doc2 = fitz.open(pdf2) doc1.insert_pdf(doc2) # 将doc2插入到doc1末尾 doc1.save(output) doc1.close() doc2.close() ``` 选择库的依据:`PyPDF2` 适合简单合并,`PyMuPDF` 支持更高级功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值