【源碼閱讀】多個函數抽象為類(實現各種類型文件轉為PDF)

目錄

  • 一、原始函數
  • 二、類
  • 三、轉換過程

一、原始函數


最開始就是寫了幾個函數(包括doc、excel、ppt類型的文件)轉換為pdf,需要將這些函數形成一個類。相似的一類函數就可以組成一個實現特定功能的類

import subprocess
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPagesdef doc_to_pdf(input_file):"""將指定文件轉換為 PDF 格式。該函數使用 LibreOffice 的命令行工具 lowriter 將輸入文件轉換為 PDF。支持多種文件格式,如 .docx, .doc, .odt 等。參數:input_file (str): 要轉換的輸入文件路徑"""try:# 調用命令行工具 lowriter 進行轉換subprocess.run(["lowriter", "--convert-to", "pdf", input_file], check=True)print(f"文件 {input_file} 已成功轉換為 PDF。")except subprocess.CalledProcessError as e:print(f"轉換失敗: {e}")except FileNotFoundError:print("未找到 lowriter 命令,請確保 LibreOffice 已安裝。")def excel_to_pdf(input_file):"""將 Excel 文件轉換為 PDF 格式。該函數使用 LibreOffice 的命令行工具將 Excel 文件轉換為 PDF。參數:input_file (str): 要轉換的 Excel 文件路徑"""try:# 調用命令行工具 libreoffice 進行轉換subprocess.run(["libreoffice", "--headless", "--convert-to", "pdf", input_file], check=True)print(f"文件 {input_file} 已成功轉換為 PDF。")except subprocess.CalledProcessError as e:print(f"轉換失敗: {e}")except FileNotFoundError:print("未找到 libreoffice 命令,請確保 LibreOffice 已安裝。")def ppt_to_pdf(input_file):"""將 PPT 文件轉換為 PDF 格式。該函數使用 LibreOffice 的命令行工具將 PPT 文件轉換為 PDF。參數:input_file (str): 要轉換的 PPT 文件路徑"""subprocess.run(["libreoffice", "--headless", "--convert-to", "pdf", input_file], check=True)print(f"文件 {input_file} 已成功轉換為 PDF。")if __name__ == '__main__':input_file='/data/hyq/code/llf/2024xx.xlsx'output_file='2024年xx.pdf'excel_to_pdf(input_file)

二、類


更加結構化的文件轉化類

import subprocess
import os
from typing import Optional, List
from pathlib import Pathclass DocumentToPDF:"""文檔轉PDF轉換器類支持將各種文檔格式(Word、Excel、PPT等)轉換為PDF格式。使用LibreOffice作為轉換工具。"""def __init__(self, libreoffice_path: Optional[str] = None):"""初始化轉換器Args:libreoffice_path: LibreOffice可執行文件的路徑,默認為None(使用系統PATH中的LibreOffice)"""self.libreoffice_path = libreoffice_path or 'libreoffice'self.supported_formats = {'doc': self._convert_document,'docx': self._convert_document,'xls': self._convert_excel,'xlsx': self._convert_excel,'ppt': self._convert_presentation,'pptx': self._convert_presentation,'odt': self._convert_document,'ods': self._convert_excel,'odp': self._convert_presentation}def _check_libreoffice(self) -> bool:"""檢查LibreOffice是否可用"""try:subprocess.run([self.libreoffice_path, '--version'], check=True, capture_output=True)return Trueexcept (subprocess.CalledProcessError, FileNotFoundError):return Falsedef _convert_document(self, input_file: str) -> bool:"""轉換文檔文件(DOC、DOCX等)"""try:subprocess.run([self.libreoffice_path, '--headless', '--convert-to', 'pdf', input_file], check=True)return Trueexcept subprocess.CalledProcessError:return Falsedef _convert_excel(self, input_file: str) -> bool:"""轉換電子表格文件(XLS、XLSX等)"""try:subprocess.run([self.libreoffice_path, '--headless', '--convert-to', 'pdf', input_file], check=True)return Trueexcept subprocess.CalledProcessError:return Falsedef _convert_presentation(self, input_file: str) -> bool:"""轉換演示文稿文件(PPT、PPTX等)"""try:subprocess.run([self.libreoffice_path, '--headless', '--convert-to', 'pdf', input_file], check=True)return Trueexcept subprocess.CalledProcessError:return Falsedef convert(self, input_file: str, output_dir: Optional[str] = None) -> bool:"""轉換文件為PDF格式Args:input_file: 輸入文件路徑output_dir: 輸出目錄,默認為None(使用輸入文件所在目錄)Returns:bool: 轉換是否成功"""if not self._check_libreoffice():print("錯誤:未找到LibreOffice,請確保已正確安裝。")return Falseinput_path = Path(input_file)if not input_path.exists():print(f"錯誤:輸入文件 {input_file} 不存在。")return Falsefile_extension = input_path.suffix.lower()[1:]  # 移除點號if file_extension not in self.supported_formats:print(f"錯誤:不支持的文件格式 {file_extension}")return False# 如果指定了輸出目錄,確保它存在if output_dir:os.makedirs(output_dir, exist_ok=True)os.chdir(output_dir)# 執行轉換convert_func = self.supported_formats[file_extension]success = convert_func(str(input_path))if success:output_file = input_path.with_suffix('.pdf').nameprint(f"轉換成功:{output_file}")else:print(f"轉換失敗:{input_file}")return successdef batch_convert(self, input_files: List[str], output_dir: Optional[str] = None) -> List[bool]:"""批量轉換文件Args:input_files: 輸入文件路徑列表output_dir: 輸出目錄Returns:List[bool]: 每個文件的轉換結果"""return [self.convert(f, output_dir) for f in input_files]# 使用示例
if __name__ == '__main__':# 創建轉換器實例converter = DocumentToPDF()# 單個文件轉換input_file = '/data/hyq/code/llf/2024年技術能力群個人創值數據匯總.xlsx'converter.convert(input_file)# 批量轉換示例# files = ['doc1.docx', 'sheet1.xlsx', 'ppt1.pptx']# converter.batch_convert(files, output_dir='output_pdfs')

三、轉換過程


面向對象設計,意味著更好的代碼組織和復用。整個類在下面函數的書寫過程中,增加了錯誤處理和狀態檢查,使得類更加健壯和靈活,可以更好地處理各種情況和錯誤。增加了類型提示,提高代碼可讀性
首先是類的初始化,且定義了一個不同類型的文件如何進行處理的字典,支持更多文件格式。
在這里插入圖片描述
增加了 LibreOffice 可用性檢查。
在這里插入圖片描述
增加了各種狀態檢查

在這里插入圖片描述
提取文件的后綴類型,并使用字典中對應的方法進行文件轉換
在這里插入圖片描述
支持批量轉換
在這里插入圖片描述
使用起來也很方便,先創建一個實例,然后調用實例
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73897.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VSCode擴展工具Copilot MCP使用教程【MCP】

MCP(Model Context Protocol,模型上下文協議) ,2024年11月底,由 Anthropic 推出的一種開放標準,旨在統一大型語言模型(LLM)與外部數據源和工具之間的通信協議。本文章教你使用VSCode…

【leetcode100】搜索插入位置

1、題目描述 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2…

【小白向】Word|Word怎么給公式標號、調整公式字體和花括號對齊

【小白向】Word|Word怎么給公式標號、調整公式字體和花括號對齊 我的版本:Word 2021 如需快速查看關鍵步驟,請直接閱讀標紅部分。 如果遇到無法調整的情況,可以直接下載我的示例文檔進行參考:花括號和其他的示例公式.…

【算法day15】最接近的三數之和

最接近的三數之和 給你一個長度為 n 的整數數組 nums 和 一個目標值 target。請你從 nums 中選出三個整數,使它們的和與 target 最接近。 這里是引用 返回這三個數的和。 假定每組輸入只存在恰好一個解。 https://leetcode.cn/problems/3sum-closest/submissions/61…

Blender-MCP服務源碼5-BlenderSocket插件安裝

Blender-MCP服務源碼5-BlenderSocket插件安裝 上一篇講述了Blender是基于Socket進行本地和遠程進行通訊,現在嘗試將BlenderSocket插件安裝到Blender中進行功能調試 1-核心知識點 將開發的BlenderSocket插件安裝到Blender中 2-思路整理 1)將SocketServe…

【MySQL數據庫】存儲過程與自定義函數(含: SQL變量、分支語句、循環語句 和 游標、異常處理 等內容)

存儲過程:一組預編譯的SQL語句和流程控制語句,被命名并存儲在數據庫中。存儲過程可以用來封裝復雜的數據庫操作邏輯,并在需要時進行調用。 類似的操作還有:自定義函數、.sql文件導入。 我們先從熟悉的函數開始說起: …

ASP3605抗輻照加固同步降壓調節器——商業航天電源芯片解決方案新選擇

ASP3605企業宇航級型號ASP3605S2U通過SEU≥75 MeVcm/mg與SEL≥75 MeVcm/mg抗輻射測試。其輸入電壓4V至15V,輸出電流5A,支持多相級聯與冗余設計,適用于衛星、航天器電源系統。 面向航天場景的核心功能設計 1. 抗輻射與可靠性保障 單粒子效應…

使用fastapi部署stable diffusion模型

使用vscode運行stable diffusion模型,每次加載模型都需要10分鐘,為算法及prompt調試帶來了極大麻煩。使用jupyter解決自然是一個比較好的方案,但如果jupyter由于種種原因不能使用時,fastapi無疑成為了一個很好的選擇。 參考github…

2025-03-16 學習記錄--C/C++-PTA 習題4-4 特殊a串數列求和

合抱之木,生于毫末;九層之臺,起于累土;千里之行,始于足下。💪🏻 一、題目描述 ?? 習題4-4 特殊a串數列求和 給定兩個均不超過9的正整數a和n,要求編寫程序求aaaaaa?aa?a&#x…

ffmpeg庫視頻硬編碼使用流程

?一、硬件編碼核心流程? ?硬件設備初始化 // 創建CUDA硬件設備上下文? AVBufferRef *hw_device_ctx NULL; av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, NULL, NULL, 0);// 綁定硬件設備到編碼器上下文? codec_ctx->hw_device_ctx av_buffer_…

【設計模式】3W 學習法全面解析 7 大結構型模式:Java 實戰 + 開源框架應用

3W 學習法總結結構型模式(附 Java 代碼實戰及開源框架應用) 結構型模式 主要關注 類與對象的組合,確保不同組件之間能夠高效協作,提高系統的靈活性和可維護性。本文采用 3W 學習法(What、Why、How)&#x…

在大數據開發中ETL是指什么?

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字經濟時代,數據已成為企業最核心的資產。然而,分散在業務系統、日志文件…

前端面試項目拷打

Axios相關 1.在Axios二次封裝時,具體封裝了哪些內容,如何處理請求攔截和響應攔截? axios二次封裝的目的:為了統一處理請求和響應攔截器、錯誤處理、請求超時、請求頭配置等,提高代碼可維護性和復用性。 首先創建axios…

「JavaScript深入」Server-Sent Events (SSE):輕量級實時通信技術

Server-Sent Events(SSE) SSE 的特點1. 單向通信2. 簡單易用,瀏覽器原生支持3. 持久連接4. 純文本傳輸5. 自動重連機制6. 輕量級協議 SSE 的實現服務器端實現(Node.js 示例)1. HTTP 響應頭設置2. 數據推送模式3. 服務器…

藍橋杯2023年第十四屆省賽真題-階乘的和

藍橋杯2023年第十四屆省賽真題-階乘的和 時間限制: 2s 內存限制: 320MB 提交: 3519 解決: 697 題目描述 給定 n 個數 Ai,問能滿足 m! 為∑ni1(Ai!) 的因數的最大的 m 是多少。其中 m! 表示 m 的階乘,即 1 2 3 m。 輸入格式 輸入的第一行包含一個整…

影刀RPA拓展-Python變量類型轉換

1. Python變量類型轉換概述 1.1 類型轉換的必要性 Python作為一種動態類型語言,在編程過程中經常需要進行變量類型轉換。這主要是因為不同數據類型在存儲結構、運算規則和使用場景上存在差異,而在實際開發中,我們常常需要對不同類型的數據進…

Python pyqt+flask做一個簡單實用的自動排班系統

這是一個基于Flask和PyQt的排班系統,可以將Web界面嵌入到桌面應用程序中。 系統界面: 功能特點: - 讀取員工信息和現有排班表 - 自動生成排班表 - 美觀的Web界面 - 獨立的桌面應用程序 整體架構: 系統采用前后端分離的架構…

Pycharm接入DeepSeek,提升自動化腳本的寫作效率

一.效果展示: 二.實施步驟: 1.DeepSeek官網創建API key: 創建成功后,會生成一個API key: 2. PyCharm工具,打開文件->設置->插件,搜索“Continue”,點擊安裝 3.安裝完成后&…

Java:Arrays類:操作數組的工具類

文章目錄 Arrays類常見方法SetAll(); 代碼排序如果數組中存儲的是自定義對象 Arrays類 常見方法 SetAll(); 注意: 不能用新的數組接是因為修改的是原數組,所以完了要輸出原數組發現會產生變化參數是數組下標變成灰色是因為還能簡化(Lambda…

2025-gazebo配置on vmware,wsl

ros2安裝 # 安裝ros2, 推薦魚香ros一鍵式安裝 wget http://fishros.com/install -O fishros && . fishros安裝版本:ubuntu24.04 ros2 jazzy gazebo Getting Started with Gazebo? — Gazebo ionic documentation ros與gz的版本對應關系: ?…