pypdf 原庫名Pypdf2(已棄用,文檔?PyPDF2 RectangleObject類_w3cschool)
pypdf 官方文檔?The Transformation Class — pypdf 3.17.4 documentation
pypdf 將兩個PDF頁面在x軸,y軸進行平移調(diào)整位置之后,直接用merge_page拼接在一起,或者PageObject.create_blank_page 先創(chuàng)建一個空白頁面,再將兩個頁面添加到空白頁面上,
參考的文章Alternative to add_transformation translate · Issue #1426 · py-pdf/pypdf · GitHub,
page1.merge_page(page2, expand=True) doesn't seem to work · Issue #1035 · py-pdf/pypdf · GitHub
prpdf github中的問題解決頁面拼接, 問題頁面?https://github.com/py-pdf/pypdf/issues?page=2&q=is%3Aissue+is%3Aopen
小日子的兩個案例,拼接在右側(cè)
Pythonで2ページのPDFを見開き1ページに結(jié)合する方法 - ガンマソフト
Cropping and Transforming PDFs — PyPDF2 documentation
其他的案例
Blank pages in output file using PyPDF2 in Python ... - Alteryx Community
https://www.coder.rs/d/247-pythongei-pdfde-zhi-ding-ye-tian-jia-tu-pian-dao-zhi-ding-wei-zhi
多種方式實現(xiàn)PDF合并、生成目錄及大綱、添加水印 - 徐彪的網(wǎng)絡(luò)日志
1. 拼接的兩個PDF都是正常的,距離左側(cè)和底部都是0
拼接過程中真正起作用的是page.mediabox和page.cropbox
from pypdf import PdfWriter, PdfReader, PageObject, Transformation
from pypdf.generic import RectangleObject
def merge():
file_path1 = r"1703906324193.pdf"
file_path2 = r"1703906324193.pdf"
reader = PdfReader(file_path1)
page1 = reader.pages[0]
print(page1.mediabox)
print(page1.trimbox)
print(page1.cropbox)
print(page1.bleedbox)
print(page1.artbox)
# 0.0, 0.0, 120.16, 159.92 對應(yīng) left, bottom, right, top
# page1.mediabox: RectangleObject([0.0, 0.0, 120.16, 159.92])
reader2 = PdfReader(file_path2)
page2 = reader2.pages[0]
height = page1.cropbox.height
print('height:', height)
# x軸不動,沿y軸向上平移page1的高度,將page1在下方,page2在上方(tx,ty可為負值)
op = Transformation().translate(tx=0, ty=height)
page2.add_transformation(op)
cb = page2.cropbox
# page2向y軸正向平移后bottom和top 加上平移的高度
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))
print('page2.mediabox:', page2.mediabox)
# page1合并page2
page1.merge_page(page2, expand=True)
mb = page1.mediabox
print('mb:', mb)
print(mb.bottom)
print(cb.bottom)
# page1 在bottom 或者 top上 加 page2的高度,
page1.mediabox = RectangleObject((mb.left, mb.bottom + cb.top, mb.right, mb.top))
page1.cropbox = RectangleObject((mb.left, mb.bottom + cb.top, mb.right, mb.top))
# page1.cropbox = RectangleObject((mb.left, mb.bottom, mb.right, mb.top + cb.top))
# page1.trimbox = RectangleObject((mb.left, mb.bottom + cb.bottom, mb.right, mb.top))
# page1.bleedbox = RectangleObject((mb.left, mb.bottom + cb.bottom, mb.right, mb.top))
# page1.artbox = RectangleObject((mb.left, mb.bottom + cb.bottom, mb.right, mb.top))
print('page1.mediabox:', page1.mediabox)
writer = PdfWriter()
writer.add_page(page1)
with open("output96.pdf", "wb") as fp:
writer.write(fp)
2. 當 left和buttom都不為0,即RectangleObject([91.841, 38.5506, 261.791, 95.1271])
用上面方法拼接出來的效果
def merge():
file_path1 = "1.pdf"
file_path2 = "2.pdf"
outfile = './output96.pdf'
reader3 = PdfReader(file_path1)
# 對p1的每頁都拼接 p2, p1在上方, p2在下方
writers = PdfWriter()
for i in range(len(reader3.pages)):
p1 = reader3.pages[i] #p1.cropbox RectangleObject([91.841, 38.5506, 261.791, 95.1271])
reader = PdfReader(file_path2)
p2 = reader.pages[0] #p2.cropbox= RectangleObject([91.841, 38.5506, 261.791, 95.1271])
p1_left = p1.cropbox.left
p1_bottom = p1.cropbox.bottom
p3_right = p1.cropbox.right
tem = p2.cropbox.top - p2.cropbox.bottom
# p1 向左和向上平移
op1 = Transformation().translate(tx=-p1.cropbox.left, ty=(p2.cropbox.top - p2.cropbox.bottom)-p1_bottom)
p1.add_transformation(op1)
# p2 向左和向下, tx為正數(shù)向右平移
op2 = Transformation().translate(tx=-p2.cropbox.left, ty=-p2.cropbox.bottom)
p2.add_transformation(op2)
p2.cropbox = RectangleObject((0, 0, p2.cropbox.right, p2.cropbox.top))
p2.trimbox = RectangleObject((0, 0, p2.mediabox.right, p2.mediabox.top))
p2.bleedbox = RectangleObject((0, 0, p2.mediabox.right, p2.mediabox.top))
p2.artbox = RectangleObject((0, 0, p2.mediabox.right, p2.mediabox.top))
p1.merge_page(p2, expand=True)
mb = p1.mediabox
cb = p2.cropbox
p1.mediabox = RectangleObject((mb.left, mb.bottom + cb.bottom, p3_right, p1.cropbox.top + tem))
p1.cropbox = RectangleObject((mb.left, mb.bottom + cb.bottom, p3_right-p1_left, p1.cropbox.top + tem-p1_bottom))
p1.trimbox = RectangleObject((mb.left, mb.bottom + cb.bottom, p3_right, p1.cropbox.top))
p1.bleedbox = RectangleObject((mb.left, mb.bottom + cb.bottom, p3_right, p1.cropbox.top))
p1.artbox = RectangleObject((mb.left, mb.bottom + cb.bottom, p3_right, p1.cropbox.top))
writers.add_page(p1)
with open(outfile, mode='wb') as f:
writers.write(f)
1. left 和buttom 都為0時用方法1拼接發(fā)效果
2. 當 left和buttom都不為0,即RectangleObject([91.841, 38.5506, 261.791, 95.1271])
用上面方法拼接出來的效果,?
文章來源:http://www.zghlxwxcb.cn/news/detail-819602.html
方法2調(diào)整之后的效果 和left 和buttom 都為0時用方法1拼接發(fā)效果一樣文章來源地址http://www.zghlxwxcb.cn/news/detail-819602.html
到了這里,關(guān)于pypdf 將 PDF兩個頁面拼接成一個頁面進一步詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!