最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python實現(xiàn)向指定PDF指定頁面指定位置插入圖片的方法

 更新時間:2025年09月02日 08:44:13   作者:Ratten  
這篇文章主要介紹了使用Python批量為PDF添加虛擬章的方法,通過ReportLab創(chuàng)建覆蓋層并結(jié)合PyPDF2實現(xiàn)精準(zhǔn)合并,確保不破壞原有分辨率和文字可識別性,同時支持位置自定義與參數(shù)調(diào)整,需要的朋友可以參考下

1. 需求

  1. 想要能否實現(xiàn)批量自動為多個pdf加蓋不同六格虛擬章(不改變pdf原有分辨率和文字可識別性);
  2. 改在pdf首頁上方空白位置,一般居中即可;
  3. 如可由使用者自主選擇靠頁邊距更好,以便部分首頁上方有字的文件時人工可微調(diào)位置。

2. 需求分析

  1. 直接將 pdf 文件轉(zhuǎn)換為圖片,在將圖片繪制到對應(yīng)頁的對應(yīng)位置,最后將全部圖片在轉(zhuǎn)換為 pdf 文件;
  2. 使用 reportlab 創(chuàng)建一個 pdf 頁,然后將圖片插入到對應(yīng)位置;
  3. 使用 PyPDF2 將 reportlab 創(chuàng)建的含有圖片 pdf 和目標(biāo)頁面進(jìn)行合并。

3. 實現(xiàn)效果

4. 方案選擇

  1. 由于要求不改變pdf原有分辨率和文字可識別性,因此就不能將 pdf 轉(zhuǎn)圖片,因為進(jìn)行此步操作后,重新生成的 pdf 不能進(jìn)行文字可識別性;
  2. 所以采用方案二 reportlab 配合 PyPDF2 完成需求的實現(xiàn)。

5. 設(shè)置插入圖片寬高

  1. init 默認(rèn)插入圖片的寬高;
  2. reset_image_width_and_height 方法提供修改插入圖片寬高的方法。
  def __init__(self):
    self.image_width = int(237 * 0.6)
    self.image_height = int(60 * 0.8)

  # 設(shè)置圖片的寬高
  def reset_image_width_and_height(self, w, h):
    self.image_width = w
    self.image_height = h

6. 創(chuàng)建 pdf 插入圖片

  1. 創(chuàng)建一個 BytesIO 對象;
  2. Canvas 類是 ReportLab PDF 創(chuàng)建工具包的核心,它提供了一個畫布,你可以在上面繪制文本、圖形、圖像等,以生成 PDF 文檔;
  3. 創(chuàng)建一個 Canvas 對象,指定 packet 和頁面大小;
  4. drawImage 方法插入圖像;
  5. 調(diào)用 save() 方法將繪制的內(nèi)容保存到 packet 對象中;
  6. packet.seek(0) 將文件指針移動到 BytesIO 對象的開頭;
  7. 使用 PdfReader 讀取 pdf 文件,并將第一頁返回。
  # 創(chuàng)建一個PDF頁面,并在其中放置圖片
  def create_overlay(self, image_path, x_pos, y_pos, page_width, page_height):
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=(page_width, page_height))
    can.drawImage(image_path, x_pos, y_pos, width=self.image_width, height=self.image_height)  # 圖片位置和大小
    can.save()
    packet.seek(0)
    overlay = PdfReader(packet)
    return overlay.pages[0]

7. 合并插入圖片的 pdf 頁到目標(biāo) pdf

  1. 讀取原始PDF文件【需要插入圖片的 pdf】;
  2. 創(chuàng)建一個PDF writer對象;
  3. 遍歷PDF的每一頁,找到目標(biāo)頁面;
  4. 獲取當(dāng)前頁面對象;
  5. 判斷當(dāng)前頁是否是目標(biāo)頁面;
  6. 計算圖片的插入位置;
  7. 調(diào)用 create_overlay 創(chuàng)建一個插入圖片的 pdf 頁面對象;
  8. 將 create_overlay 返回的頁面通過 merge_page 合并到當(dāng)前 page;
  9. 將每一個循環(huán)的 page 通過 add_page 添加到第二步中創(chuàng)建的 writer 對象中;
  10. 判斷輸出路徑是否存在,然后寫入 pdf。
  # 將創(chuàng)建的覆蓋層合并到目標(biāo)PDF的指定頁面
  def merge_image_to_pdf(self, input_pdf_path, output_pdf_path, image_path, page_number, x_pos, y_pos):
    # 讀取原始PDF文件
    original_pdf = PdfReader(open(input_pdf_path, "rb"))
    # 創(chuàng)建一個PDF writer對象
    pdf_writer = PdfWriter()
    # 遍歷PDF的每一頁
    for page_num in range(len(original_pdf.pages)):
      page = original_pdf.pages[page_num]
      if page_number == page_num:
        # 計算距離
        left_distance = int((page.mediabox.width - self.image_width) / 2 + x_pos)
        top_distance = int((page.mediabox.height - self.image_height) - y_pos)

        overlay = self.create_overlay(image_path, left_distance, top_distance, page.mediabox.width, page.mediabox.height)
        page.merge_page(overlay)
      pdf_writer.add_page(page)

    # 寫入修改后的PDF
    with open(output_pdf_path, "wb") as out_file:
      pdf_writer.write(out_file)

8. 調(diào)用

  1. 初始化 InsertImageToPDF;
  2. 調(diào)用插入圖片的方法 merge_image_to_pdf;
  3. 將圖片 【"./out_images/pdf.png"】插入pdf 【"./pdf/pdf-1/pdf-1.pdf"】,輸出路徑【"./out_images/pdf.png"】;
  4. 【0, 0, 10】插入第幾頁,圖片距離左側(cè)邊距,圖片距離頂部邊距。
if __name__ == "__main__":
  pdf = InsertImageToPDF()
  # 使用函數(shù)
  pdf.merge_image_to_pdf(
    "./pdf/pdf-1/pdf-1.pdf", 
    "./out_pdf/pdf-1.pdf", 
    "./out_images/pdf.png", 
    0, 0, 10)

9. 運(yùn)行結(jié)果

10. 完整代碼

  1. 引入所需使用的庫 reportlab, PyPDF2, io;
  2. 初始化插入圖片的寬高,設(shè)置圖片的寬高的函數(shù);
  3. 創(chuàng)建一個PDF頁面,并在其中放置圖片;
  4. 將創(chuàng)建的覆蓋層合并到目標(biāo)PDF的指定頁面。
from reportlab.pdfgen import canvas
from PyPDF2 import PdfWriter, PdfReader
import io

class InsertImageToPDF:
  def __init__(self):
    self.image_width = int(237 * 0.6)
    self.image_height = int(60 * 0.8)

  # 設(shè)置圖片的寬高
  def reset_image_width_and_height(self, w, h):
    self.image_width = w
    self.image_height = h

  # 創(chuàng)建一個PDF頁面,并在其中放置圖片
  def create_overlay(self, image_path, x_pos, y_pos, page_width, page_height):
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=(page_width, page_height))
    can.drawImage(image_path, x_pos, y_pos, width=self.image_width, height=self.image_height)  # 圖片位置和大小
    can.save()
    packet.seek(0)
    overlay = PdfReader(packet)
    return overlay.pages[0]

  # 將創(chuàng)建的覆蓋層合并到目標(biāo)PDF的指定頁面
  def merge_image_to_pdf(self, input_pdf_path, output_pdf_path, image_path, page_number, x_pos, y_pos):
    # 讀取原始PDF文件
    original_pdf = PdfReader(open(input_pdf_path, "rb"))
    # 創(chuàng)建一個PDF writer對象
    pdf_writer = PdfWriter()
    # 遍歷PDF的每一頁
    for page_num in range(len(original_pdf.pages)):
      page = original_pdf.pages[page_num]
      if page_number == page_num:
        # 計算距離
        left_distance = int((page.mediabox.width - self.image_width) / 2 + x_pos)
        top_distance = int((page.mediabox.height - self.image_height) - y_pos)

        overlay = self.create_overlay(image_path, left_distance, top_distance, page.mediabox.width, page.mediabox.height)
        page.merge_page(overlay)
      pdf_writer.add_page(page)

    # 寫入修改后的PDF
    with open(output_pdf_path, "wb") as out_file:
      pdf_writer.write(out_file)

if __name__ == "__main__":
  pdf = InsertImageToPDF()
  # 使用函數(shù)
  pdf.merge_image_to_pdf(
    "./pdf/pdf-1/pdf-1.pdf", 
    "./out_pdf/pdf-1.pdf", 
    "./out_images/pdf.png", 
    0, 0, 10)

11. 總結(jié)

  1. 實現(xiàn)同一個需求的方法和技術(shù)很多,我們需要選擇最接近需求的方案;
  2. 技術(shù)盡量選擇自己熟悉的,或者曾經(jīng)實現(xiàn)或者學(xué)習(xí)過的技術(shù),能夠更快開發(fā);
  3. 盡量多的接觸更多的技術(shù),直到每種技術(shù)之間的優(yōu)劣勢。

以上就是基于Python實現(xiàn)向指定PDF指定頁面指定位置插入圖片的方法的詳細(xì)內(nèi)容,更多關(guān)于Python向指定PDF指定位置插入圖片的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

马尔康县| 阿克陶县| 海城市| 故城县| 泉州市| 三原县| 满城县| 乌苏市| 抚松县| 潮州市| 微山县| 政和县| 屏南县| 滦南县| 大悟县| 塘沽区| 郧西县| 渭源县| 汤阴县| 石渠县| 正蓝旗| 和静县| 巴马| 奉节县| 阳泉市| 龙山县| 仁寿县| 大化| 平罗县| 鄯善县| 延庆县| 囊谦县| 安宁市| 绥芬河市| 道孚县| 阆中市| 固原市| 天等县| 正蓝旗| 雷山县| 玉龙|