狠狠精品久久久无码中文字幕,久久精品AⅤ无码中文字字幕,精品久久久无码人妻中文字幕

    1. <rp id="14sqs"><ruby id="14sqs"><input id="14sqs"></input></ruby></rp>
      1. <dd id="14sqs"></dd>

          <th id="14sqs"><track id="14sqs"></track></th>
          71愛課網 >  python培訓學校 python編輯pdf文檔(python_pdf解析)

          python編輯pdf文檔(python_pdf解析)

          • 授課方式: 面授/網課
          • 授課學校:python培訓學校
          • 預約人數:1148人試聽過
          • 教學點: 0個
          • 上課時段: 全日制
          • 開課時間:隨到隨學
          • 微信客服: 掃碼咨詢
          • 咨詢電話: 15907412407

          人工智能

          使用第三方庫

          PyPDF2

          讀取、寫入、分割、合并PDF文

          安裝:

          pdfplumber

          讀取 PDF 文件中內容和提取 PDF 中的表格

          安裝:

          !pip3 install PyPDF2

          復制代碼

          Collecting PyPDF2

          Downloading PyPDF2-1.26.0.tar.gz (77 kB)

          [K |████████████████████████████████| 77 kB 125 kB/s

          [?25hBuilding wheels for collected packages: PyPDF2

          Building wheel for PyPDF2 (setup.py) ... [?25ldone

          [?25h Created wheel for PyPDF2: filename=PyPDF2-1.26.0-py3-none-any.whl size=61085 sha256=dba5825a58d21d37cf9e417039694f1b9e716760ee7b9f0fdcca8fc65b8ef3fe

          Stored in directory: /Users/lichizou/Library/Caches/pip/wheels/d9/dc/ec/72da68331f30074b9950c1737c23cb8a67484e61498bc9713d

          Successfully built PyPDF2

          Installing collected packages: PyPDF2

          Successfully installed PyPDF2-1.26.0

          復制代碼

          !pip3 install pdfplumber

          復制代碼

          Collecting pdfplumber

          Downloading pdfplumber-0.5.28.tar.gz (45 kB)

          [K |████████████████████████████████| 45 kB 152 kB/s

          [?25hCollecting pdfminer.six==20200517

          Downloading pdfminer.six-20200517-py3-none-any.whl (5.6 MB)

          [K |████████████████████████████████| 5.6 MB 145 kB/s

          [?25hCollecting Pillow>=7.0.0

          Downloading Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl (2.8 MB)

          [K |████████████████████████████████| 2.8 MB 70 kB/s

          [?25hCollecting Wand

          Downloading Wand-0.6.6-py2.py3-none-any.whl (138 kB)

          [K |████████████████████████████████| 138 kB 16 kB/s

          [?25hCollecting pycryptodome

          Downloading pycryptodome-3.10.1-cp35-abi3-macosx_10_9_x86_64.whl (1.5 MB)

          [K |████████████████████████████████| 1.5 MB 43 kB/s

          [?25hCollecting sortedcontainers

          Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB)

          Collecting chardet

          Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)

          [K |████████████████████████████████| 178 kB 96 kB/s

          [?25hBuilding wheels for collected packages: pdfplumber

          Building wheel for pdfplumber (setup.py) ... [?25ldone

          [?25h Created wheel for pdfplumber: filename=pdfplumber-0.5.28-py3-none-any.whl size=32219 sha256=23afcf4aa92bdd0fb4e2a71b0974c1edd5ca9e59b37ef5e41b15fae3bffc5c30

          Stored in directory: /Users/lichizou/Library/Caches/pip/wheels/e9/cb/1b/c5dbba18cac53515263c5f26443e4617fa432c32cbaa7d8e48

          Successfully built pdfplumber

          Installing collected packages: sortedcontainers, pycryptodome, chardet, Wand, Pillow, pdfminer.six, pdfplumber

          Successfully installed Pillow-8.2.0 Wand-0.6.6 chardet-4.0.0 pdfminer.six-20200517 pdfplumber-0.5.28 pycryptodome-3.10.1 sortedcontainers-2.4.0

          復制代碼

          for i in range(0, 10, 2):

          print(i)

          復制代碼

          0

          2

          4

          6

          8

          復制代碼

          批量拆分

          def split_pdf(filename, filepath, save_dirpath, step=5):

          '''

          拆分pdf為多個小pdf文件,

          @param filename: 要拆分的文件名

          @param filepath: 要拆分的文件路徑

          @param save_dirpath: 保存小的的pdf的文件路徑

          @param step: 每個step頁生成一個文件,默認情況,0-4頁問一個文件,5-9頁為第二個文件

          @return:

          '''

          if not os.path.exists(save_dirpath):

          os.makedirs(save_dirpath)

          pdf_reader = PdfFileReader(filepath)

          pages = pdf_reader.getNumPages()

          for page in range(0, pages, step): # page取值:list [0, 5, 10...pages)

          pdf_writer = PdfFileWriter()

          for index in range(page, page + step): # index取值, 區間: [0, 5),[5, 10)

          if index < pages: # 防止全部頁數不能整除

          pdf_writer.addPage(pdf_reader.getPage(index)) # 逐頁添加

          save_path = os.path.join(save_dirpath, filename + str(int(page / step) + 1) + '.pdf')

          with open(save_path, 'wb') as out:

          pdf_writer.write(out)

          復制代碼

          from PyPDF2 import PdfFileReader

          from PyPDF2 import PdfFileWriter

          復制代碼

          path = '易方達中小板指數證券投資基金(LOF)2020年中期報告' # 當前路徑下

          split_pdf(path, path + '.pdf', 'test_pdf')

          復制代碼

          批量合并

          '易方達中小板指數證券投資基金(LOF)2020年中期報告1.pdf'[:-4].replace('易方達中小板指數證券投資基金(LOF)2020年中期報告', '')

          復制代碼

          '1'

          復制代碼

          '123456789'[:-4]

          復制代碼

          '12345'

          復制代碼

          os.listdir('./test_pdf/')

          復制代碼

          ['易方達中小板指數證券投資基金(LOF)2020年中期報告3.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告2.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告1.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告5.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告4.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告6.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告7.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告9.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告8.pdf',

          '易方達中小板指數證券投資基金(LOF)2020年中期報告10.pdf']

          復制代碼

          def concat_pdf(filename, read_dirpath, save_filepath):

          '''

          合并多個pdf文件

          @param filename: 文件名

          @param read_dirpath: 要合并的pdf目錄

          @param save_filepath: 合并后的pdf文件路徑

          @return

          '''

          pdf_writer = PdfFileWriter()

          list_filename = os.listdir(read_dirpath)

          list_filename.sort(key=lambda x: int(x[:-4].replace(filename, ''))) # 去掉.pdf,替換文件名,獲得文件編號

          for fn in list_filename:

          filepath = os.path.join(read_dirpath, fn)

          pdf_reader = PdfFileReader(filepath)

          pages = pdf_reader.getNumPages()

          for page in range(pages): # 逐頁添加

          pdf_writer.addPage(pdf_reader.getPage(page))

          with open(save_filepath, 'wb') as out:

          pdf_writer.write(out)

          復制代碼

          concat_pdf('易方達中小板指數證券投資基金(LOF)2020年中期報告', './test_pdf/', 'concat.pdf')

          復制代碼

          提取文字內容

          import pdfplumber

          復制代碼

          def extract_pdf_text(pdf_path, page_order=-1):

          '''

          提取pdf指定頁文字

          @param pdf_path: 文件路徑

          @param page_order: 頁數,[0,];-1表示讀取全部

          @return

          '''

          with pdfplumber.open(pdf_path) as pdf:

          if page_order == -1:

          for page in pdf.pages:

          print(page.extract_text())

          return

          page = pdf.pages[page_order]

          print(page.extract_text())

          復制代碼

          extract_pdf_text('concat.pdf', 0)

          復制代碼

          易方達中小板指數證券投資基金(LOF)2020年中期報告

          易方達中小板指數證券投資基金(LOF)

          2020 年中期報告

          2020 年 6 月 30 日

          基金管理人:易方達基金管理有限公司

          基金托管人:中國建設銀行股份有限公司

          送出日期:二〇二〇年八月二十八日

          復制代碼

          # 將pdf內容存入txt

          def save_pdf_text_as_txt(pdf_path, txt_path, page_order=-1):

          str = ''

          with pdfplumber.open(pdf_path) as pdf:

          if page_order == -1:

          for page in pdf.pages:

          str += page.extract_text()

          #print(page.extract_text())

          return

          page = pdf.pages[page_order]

          #print(page.extract_text())

          str += page.extract_text()

          with open(txt_path, 'w') as file:

          file.write(str)

          復制代碼

          save_pdf_text_as_txt('concat.pdf','concat_1.txt', 0)

          復制代碼

          # 格式丟失

          def get_pdf_text(pdf_path, page_order=-1):

          str = ''

          with pdfplumber.open(pdf_path) as pdf:

          if page_order == -1:

          for page in pdf.pages:

          str += page.extract_text()

          #print(page.extract_text())

          return

          page = pdf.pages[page_order]

          #print(page.extract_text())

          str += page.extract_text()

          return str

          復制代碼

          # savepath帶有文件后綴,因此可以獲得文件類型:txt或word

          def save_pdf_text(str, save_path):

          pass

          復制代碼

          提取表格內容

          import pdfplumber

          復制代碼

          def extract_pdf_table(pdf_path, page_order = 0):

          with pdfplumber.open(pdf_path) as pdf:

          page = pdf.pages[page_order]

          table_info = page.extract_tables()

          # 該頁只有一個表格的情況下,設置表格第一行為表頭,其余為數據

          for index in range(len(table_info)):

          df_table = pd.DataFrame(table_info[index][1: ], columns=table_info[index][0])

          #print(index)

          #print(df_table)

          # todo: 是否可以合并成1個文件?

          file_name = 'pdf_table_' + str(page_order + 1) + '_' + str(index + 1) +'.csv'

          print(file_name)

          df_table.to_csv(file_name, index=False, encoding='gbk') # gbk能用excel打開,utf-8用vscode打開

          !pip3 install Pandas

          Requirement already satisfied: Pandas in /usr/local/lib/python3.9/site-packages (1.2.4)

          Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.9/site-packages (from Pandas) (2021.1)

          Requirement already satisfied: python-dateutil>=2.7.3 in /Users/lichizou/Library/Python/3.9/lib/python/site-packages (from Pandas) (2.8.1)

          Requirement already satisfied: numpy>=1.16.5 in /usr/local/lib/python3.9/site-packages (from Pandas) (1.20.3)

          Requirement already satisfied: six>=1.5 in /Users/lichizou/Library/Python/3.9/lib/python/site-packages (from python-dateutil>=2.7.3->Pandas) (1.16.0)

          import pandas as pd

          extract_pdf_table('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf', 6)

          pdf_table7.csv

          extract_pdf_table('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf', 7) # 第8頁,單表格

          pdf_table8.csv

          extract_pdf_table('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf', 15) # 第16頁,多表格,第一個表格殘缺,最終只輸出完整的第二個表格

          pdf_table_16_1.csv

          pdf_table_16_2.csv

          extract_pdf_table('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf', 14) # 第15頁,表格有部分在第16頁,檢測是否完全輸出:沒有,被截斷了.bug了

          pdf_table_15_1.csv

          pdf_table_15_2.csv

          # 完整的2個表格,第20頁

          extract_pdf_table('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf', 19)

          pdf_table_20_1.csv

          pdf_table_20_2.csv

          提取圖片內容

          使用模塊fitz,最新版1.18.13和非最新版在部分函數名稱上有差異

          需要先安裝PyMuPDF: pip3 install PyMuPDF

          官方文檔:pymupdf.readthedocs.io/en/latest/

          提取圖片的整體邏輯如下:

          使用 fitz 打開文檔,獲取文檔詳細數據

          遍歷每一個元素,通過正則找到圖片的索引位置

          使用 Pixmap 將索引對應的元素生成圖片

          通過 size 函數過濾較小的圖片

          !pip3 install PyMuPDF

          Collecting PyMuPDF

          Downloading PyMuPDF-1.18.14-cp39-cp39-macosx_10_9_x86_64.whl (5.6 MB)

          [K |████████████████████████████████| 5.6 MB 5.1 MB/s

          [?25hInstalling collected packages: PyMuPDF

          Successfully installed PyMuPDF-1.18.14

          import fitz

          import re

          pdf = fitz.open('易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf')

          xref_len = pdf.xref_length()

          xref_len # 文檔對象個數

          17912

          len(pdf) # 實際pdf頁數

          49

          # 導出圖片地址

          pic_dir = 'pdf_export_img'

          if not os.path.exists(pic_dir):

          os.makedirs(pic_dir)

          # 使用正則表達式來查找圖片

          check_XObject = r"/Type(?= */XObject)"

          check_Image = r"/Subtype(?= */Image)"

          # 遍歷pdf對象,找到圖像

          img_count = 0

          for index in range(1, xref_len):

          text = pdf.xref_object(index)

          is_xobject = re.search(check_XObject, text)

          is_image = re.search(check_Image, text)

          if is_xobject or is_image:

          img_count += 1

          # 根據索引生成圖像

          pix = fitz.Pixmap(pdf, index)

          pic_filepath = os.path.join(pic_dir, 'img_' + str(img_count) + ".png")

          """pix.size 可以反映像素多少,簡單的色素塊該值較低,可以通過設置一個閾值過濾。以閾值 10000 為例過濾"""

          # if pix.size < 10000:

          # continue

          # 將圖片保存為png格式

          if pix.n >= 5:

          pix = fitz.Pixmap(fitz.csRGB, pix)

          pix.writePNG(pic_filepath)

          print('導出圖片:' + str(img_count)) # 整個pdf只有1張圖

          導出圖片:1

          轉存為圖片

          將每一頁轉換為一張張圖片

          安裝pdf2image, github:github.com/Belval/pdf2…

          安裝:

          pip3 install pdf2image

          對于 mac 用戶,需要安裝 poppler for Mac: brew install poppler

          !pip3 install pdf2image

          Collecting pdf2image

          Downloading pdf2image-1.15.1-py3-none-any.whl (10 kB)

          Requirement already satisfied: pillow in /usr/local/lib/python3.9/site-packages (from pdf2image) (8.2.0)

          Installing collected packages: pdf2image

          Successfully installed pdf2image-1.15.1

          復制代碼

          # 3種方法,這里使用官方圖推薦的更好的一種

          from pdf2image import convert_from_path

          import tempfile

          import send2trash

          import shutil

          # 肉眼可見的慢

          def pdf_saveas_img(pdf_path, img_dir):

          # 方便測試,

          send2trash.send2trash(img_dir)

          if not os.path.exists(img_dir):

          os.makedirs(img_dir)

          with tempfile.TemporaryDirectory() as path:

          ppm = convert_from_path(pdf_path, output_folder=img_dir)

          # 將ppm文件保存為png圖片

          for index, pm in enumerate(ppm, 1):

          img_name = pdf_name + '-' + str(index).zfill(2) + '.png'

          pm.save(os.path.join(os.path.dirname(pm.filename), img_name))

          # 刪除ppm文件

          for root, dir, file in os.walk(img_dir):

          for f in file:

          if f[-4:] == '.ppm':

          #print(f)

          send2trash.send2trash(os.path.join(root, f))

          pdf_path = '易方達中小板指數證券投資基金(LOF)2020年中期報告.pdf'

          img_dir = 'pdf_img'

          # 發現生成了.ppm格式的文件,不是圖片格式,且命名帶有規律,但不是原來的名字

          ppm = pdf_saveas_img(pdf_path, img_dir)

          #help(ppm[0])

          ppm[0].save('pdf_img.png')

          type(ppm[0])

          PIL.PpmImagePlugin.PpmImageFile

          ppm[0].filename

          'pdf_img/76b22d8c-b50f-4bfe-b5ef-f8b446d7d0ae-01.ppm'

          復制代碼

          pdf_path.split('.')[0]

          復制代碼

          '易方達中小板指數證券投資基金(LOF)2020年中期報告'

          'pdf_img/76b22d8c-b50f-4bfe-b5ef-f8b446d7d0ae-01.ppm'[:-4]

          'pdf_img/76b22d8c-b50f-4bfe-b5ef-f8b446d7d0ae-01'

          添加水印

          使用庫: github.com/2Dou/waterm…

          步驟:

          1.獲得一個帶水印pdf文件

          1.1在圖片添加水印,圖片插入到word,word保存為pdf

          1.2python處理:參考

          github.com/2Dou/waterm…

          mp.weixin.qq.com/s/_oJA6lbsd…

          2.將水印pdf文件合并到源目標pdf文件的每一頁

          獲取水印圖片

          步驟1:省車給你一張透明的水印

          步驟2: 將水印添加到一張空白圖上生成水印背景

          步驟3: 將水印背景粘貼到原圖對應的位置上去

          兩種水印類型

          固定位置水?。喝菀妆蝗コ?/p>

          全屏水?。翰蝗菀妆蝗コ?,但可能會影響閱讀

          土辦法

          法1,直接在word,插入文本框,旋轉,設置無邊框,注意設置背景透明,然后復制多個。導出為pdf。

          法2,word本身自己的增加水印,設計-水印-自定義文字或圖片。缺點是只能是單個水印。

          # 給pdf添加水印

          def add_pdf_watermask(mask_path, pdf_path, save_path):

          watermask = PdfFileReader(mask_path)

          watermask_page = watermask.getPage(0)

          pdf_reader = PdfFileReader(pdf_path)

          pdf_writer = PdfFileWriter()

          pdf_page_num = pdf_reader.getNumPages()

          # 對pdf的每一頁(除了首頁),逐頁與水印pdf合并,并添加到新的pdf

          for page_index in range(pdf_page_num):

          current_page = pdf_reader.getPage(page_index)

          if page_index == 0: # 第一頁不加水印

          pdf_writer.addPage(current_page)

          continue

          current_page.mergePage(watermask_page)

          current_page.compressContentStreams() # 壓縮內容

          pdf_writer.addPage(current_page)

          # 保存新的pdf文件

          with open(save_path, 'wb') as out:

          pdf_writer.write(out)

          add_pdf_watermask('chizou.pdf', 'concat.pdf', 'concat_watermarker.pdf')

          缺點是水印在內容pdf上方,如果設置過大,顏色不太透明,會遮擋內容。

          python自動化-pdf文檔操作

          python自動化-pdf文檔操作

          文檔加密與解密

          解密:并不是破解,而是在已知密碼的情況下解密

          from PyPDF2 import PdfFileReader

          from PyPDF2 import PdfFileWriter

          # 加密

          pdf_reader = PdfFileReader('concat.pdf')

          pdf_writer = PdfFileWriter()

          page_num = pdf_reader.getNumPages()

          for page_index in range(page_num):

          pdf_writer.addPage(pdf_reader.getPage(page_index))

          pdf_writer.encrypt('masaikemasaike') # 先逐頁添加頁,最后加密

          with open('concat_encrypt.pdf', 'wb') as out: # 必須是wb,二進制打開

          pdf_writer.write(out)

          # 解密:對concat_encrypt.pdf解密,另存

          pdf_reader = PdfFileReader('concat_encrypt.pdf')

          pdf_reader.decrypt('masaikemasaike') # 一次性解密

          pdf_writer = PdfFileWriter()

          page_num = pdf_reader.getNumPages()

          for page_index in range(page_num):

          pdf_writer.addPage(pdf_reader.getPage(page_index))

          with open('concat_decrypt.pdf', 'wb') as out:

          pdf_writer.write(out)

          作者:秦與商

          鏈接:https://juejin.cn/post/7069582991982329893

          推薦課程

          師資力量

          狠狠精品久久久无码中文字幕,久久精品AⅤ无码中文字字幕,精品久久久无码人妻中文字幕