国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

pypdf 將 PDF兩個頁面拼接成一個頁面進一步詳解

這篇具有很好參考價值的文章主要介紹了pypdf 將 PDF兩個頁面拼接成一個頁面進一步詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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ā)效果

pypdf 將 PDF兩個頁面拼接成一個頁面進一步詳解,pdf

2. 當 left和buttom都不為0,即RectangleObject([91.841, 38.5506, 261.791, 95.1271])
用上面方法拼接出來的效果,?

pypdf 將 PDF兩個頁面拼接成一個頁面進一步詳解,pdf

方法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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Vue路由(router)進一步詳解】

    【Vue路由(router)進一步詳解】

    本篇文章主要針對已經(jīng)掌握Vue路由(router)基礎(chǔ)以及路由嵌套的用戶群體,如果你是Vue路由初學(xué)者的話,不仿先去看看 【Vue路由(router)的基本使用】這篇文章 接上一篇文章理解Vue路由中常用的知識點 在實際開發(fā)過程中,我們可能不單單要實現(xiàn)簡單的頁面跳轉(zhuǎn)動作,可能在

    2023年04月08日
    瀏覽(17)
  • Druid未授權(quán)漏洞進一步的利用

    Druid未授權(quán)漏洞進一步的利用

    Druid是阿里巴巴數(shù)據(jù)庫出品的為監(jiān)控而生的數(shù)據(jù)庫連接池。并且Druid提供的監(jiān)控功能包括監(jiān)控SQL的執(zhí)行時間、監(jiān)控Web URI的請求、Session監(jiān)控等。Druid本身是不存在什么漏洞的,但當開發(fā)者配置不當時就可能造成未授權(quán)訪問。本文除了介紹Druid未授權(quán)漏洞之外,還要講的是一種該漏

    2024年02月11日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)--并查集的進一步優(yōu)化

    數(shù)據(jù)結(jié)構(gòu)--并查集的進一步優(yōu)化

    壓縮路徑 ? ? F i n d 操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 color{red}壓縮路徑 -- Find操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 壓縮路徑 ? ? F in d 操作,先找到根節(jié)點,再將查找路徑上所有結(jié)點都掛到根結(jié)點下 每次Find操作,

    2024年02月15日
    瀏覽(25)
  • 進一步了解WPF UI 實現(xiàn)XAML語法

    進一步了解WPF UI 實現(xiàn)XAML語法

    Extensible Application Markup Language (XAML) 是一種用于聲明性應(yīng)用程序編程的標記語言。 Windows Presentation Foundation (WPF) 實現(xiàn) XAML 處理器實現(xiàn)并提供 XAML 語言支持。 WPF 類型的實現(xiàn)為 XAML 表示提供了必要的類型支持,從而確保了順暢的集成和高效的運行。 在 XAML 標記中創(chuàng)建 WPF 應(yīng)用程序

    2024年02月02日
    瀏覽(28)
  • [架構(gòu)之路-203] - 對系統(tǒng)需求類型的進一步澄清

    [架構(gòu)之路-203] - 對系統(tǒng)需求類型的進一步澄清

    目錄 業(yè)務(wù)/商業(yè)需求: 用戶/客戶需求: 功能性需求: 非功能性需求: 系統(tǒng)需求: 約束條件: 軟件需求說明書: 軟件質(zhì)量: 是自頂向下的需求,往往來自于中高層管理人員(或監(jiān)管、政策要求),基于業(yè)務(wù)運營管理的直接訴求和要求。需要使用商業(yè)/工作語言描述業(yè)務(wù)/商業(yè)

    2024年02月07日
    瀏覽(30)
  • iOS 微信、支付寶、銀聯(lián)支付組件的進一步設(shè)計

    原文地址:https://zhanglei.blog.csdn.net/article/details/121376500 有段時間沒寫技術(shù)文章了,一是因為工作太忙,再者因為本人文筆實在一般。最近終于閑下來,本著分享的目的將一些組件設(shè)計上的心得與大家分享。 本篇文章是基于原有一篇關(guān)于支付文章的進一步優(yōu)化設(shè)計,所以在閱讀

    2024年02月10日
    瀏覽(26)
  • 頻數(shù)表和列聯(lián)表,以及進一步處理分析 -- R

    數(shù)據(jù)框包含了一些分類變量,問? 操作頻數(shù)表 vcd?中的assocstats()函數(shù)可以計算二維列聯(lián)表的phi系數(shù),列聯(lián)系數(shù),Cramer‘s V系數(shù) 總體來說,較大的數(shù)值意味著較強的相關(guān)性

    2024年01月19日
    瀏覽(30)
  • C++面向?qū)ο蟪绦蛟O(shè)計 - 類和對象進一步討論

    C++面向?qū)ο蟪绦蛟O(shè)計 - 類和對象進一步討論

    ? ? ? ? 在C++中,關(guān)于面向?qū)ο蟪绦蛟O(shè)計已經(jīng)講了很大篇幅,也例舉很多案例,此篇將通過一些習(xí)題來進一步了解對象、靜態(tài)成員、指針、引用、友元、類模板等等相關(guān)知識。 ? ? ? ? 示例代碼: ? ? ? ? 如上代碼,運行后結(jié)果如下圖: ???????? 現(xiàn)在將上述代碼中,第

    2024年04月16日
    瀏覽(25)
  • 學(xué)習(xí)筆記---更進一步的雙向鏈表專題~~

    學(xué)習(xí)筆記---更進一步的雙向鏈表專題~~

    目錄 1.?雙向鏈表的結(jié)構(gòu)?? 2.?實現(xiàn)雙向鏈表?? 2.1 要實現(xiàn)的目標?? 2.2 創(chuàng)建+初始化?? 2.2.1 List.h 2.2.2 List.c 2.2.3 test.c 2.2.4 代碼測試運行 2.3 尾插+打印+頭插?? 思路分析 2.3.1 List.h 2.3.2 List.c 2.3.3 test.c 2.3.4 代碼測試運行 2.4 尾刪+頭刪?? 2.4.0 思路分析 2.4.1 List.h 2.4.2 List.c 2.4.3 t

    2024年02月07日
    瀏覽(24)
  • element中Table表格控件單選、多選功能進一步優(yōu)化

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包