如何使用python識別出文件夾中全是圖片合成的的PDF,并將其移動到指定文件夾

引言

在現代數字化工作流程中,無論是為機器學習模型處理數據,還是進行數字歸檔,區分原生文本 PDF(例如,由文字處理器生成的報告)和基于圖像的 PDF(例如,掃描的發票、檔案文件)都至關重要。前者允許直接提取文本,而后者則需要借助光學字符識別(OCR)技術。因此,這種分類是任何自動化文檔處理流程中的關鍵第一步 。本報告旨在解決一個具體需求:如何自動識別文件夾中完全由圖片合成的 PDF,并將其移動到指定位置。 ?

通過編程方式分析 PDF 的內部內容結構,可以構建一個強大且高性能的解決方案。我將采用的 Python 庫是 PyMuPDF,并開發一種核心的啟發式方法——基于圖像內容與文本內容的面積比例來進行判斷。這一方法為后續詳細的技術探討奠定了基礎。

從 PDF 格式的基礎理論和工具選擇,到實現一個生產級的 Python 腳本,并最終探討在真實世界中可能遇到的高級挑戰。

第一節:基礎概念:數字 PDF 的剖析

目標

本節旨在提供理解我們所選方法為何有效的必要理論背景。它將揭開 PDF 格式的神秘面紗,從用戶眼中的靜態文檔視角,轉向工程師眼中結構化的數據容器視角。

1.1 文本的兩種存在形式:可渲染文本與柵格化文本

首先,必須明確一個關鍵區別。可渲染文本是以字符編碼(如 ASCII 或 Unicode)的形式存儲,并與字體資源相關聯。這種文本是可搜索、可選擇且可直接提取的 。 ?

與此相對的是柵格化文本,它已被轉換為像素網格,成為圖像的一部分。對人類觀察者而言,它與普通文本無異,但在計算上,它與圖像的任何其他部分都沒有區別。這是掃描后未經 OCR 處理的文檔的決定性特征 。 ?

這里的核心挑戰并非視覺識別問題,而是數據結構問題。腳本的目標是檢測可渲染文本對象的缺失,而非視覺上文本字符的存在。換言之,程序需要解析文件的內部結構,以區分兩種不同的內容編碼方式:一種使用字體定義和字符代碼,另一種則使用像素陣列(即圖像)。這種方法將問題從計算成本高昂的計算機視覺領域,轉移到了計算成本更低、結果更明確的數據解析領域。

1.2 PDF 內部結構:頁面、內容流與 XObject

將提供一個簡化的 PDF 層次結構模型。一個Document(文檔)對象包含多個Page(頁面)對象 。每個 ?

Page都有一個內容流(content stream),其中包含渲染其內容的指令。

至關重要的是,需要引入 XObject(External Objects,外部對象) 的概念。這些是 PDF 中可復用的資源。我們將重點關注兩種類型:Image XObject,即嵌入的圖像(如 JPEG 或 PNG);以及 Form XObject,即可復用的內容組,其本身可以包含文本或圖像 。 ?

一個 PDF 頁面并非一個單一的整體,而是由多個不同的塊級元素組成的集合。一些塊是文本,另一些是圖像。這種基于塊的結構正是 PyMuPDF 和 pdfplumber 等庫能夠高效解析的基礎。PDF 格式本身提供了必要的內容分割信息,算法無需自行發明尋找圖像的方法,只需正確查詢 PDF 創建者已在頁面上放置的、預先定義好的對象即可 。這使得任務比在頁面的渲染圖像上運行對象檢測要確定得多。關鍵在于訪問這種已存在的結構化信息。 ?

第二節:為 PDF 分析選擇最佳工具

本節將通過詳細、基于證據的比較,嚴謹地論證為何選擇 PyMuPDF 是完成此項任務的最佳工具。

2.1 Python PDF 庫概覽

首先,概述與本任務最相關的幾個庫,包括 PyPDF2/pypdf、PDFMiner/pdfminer.six、pdfplumber 和 PyMuPDF (Fitz) 。還會指出它們之間的傳承關系,例如,pdfplumber 是構建在 pdfminer.six 之上的 ,而 PyPDF2 現已并入pypdf 項目 。 ?

2.2 對比分析:正面評估

本小節是論證的核心,將根據任務的關鍵需求對這些庫進行直接比較。

  • 文本提取能力:雖然大多數庫都能提取文本,但提取方式的差異至關重要 。PyMuPDF 和 pdfplumber 能夠提供詳細的布局和結構信息(如 ?

    "blocks""dict"),這遠優于 PyPDF2 簡單的文本轉儲功能 。對于我們的啟發式算法而言,不僅要知曉文本是否存在,更要獲取其所占的面積

  • 圖像檢測與分析:這是區分不同庫能力的關鍵。PyMuPDF 擁有強大且直接的圖像提取與分析功能(例如 page.get_images()page.get_text("dict"))。pdfplumber 也支持圖像提取 (?

    page.images) 。相比之下,像 PyPDF2 和 PDFMiner 這樣的老牌庫,對圖像提取的原生支持非常有限甚至沒有 。這一點直接排除了它們作為我們面積比例啟發式算法的備選工具。 ?

  • 性能:在處理整個文件夾的文件時,速度是一個主要考量因素。研究資料一致表明,得益于其基于 C 語言的 MuPDF 后端,PyMuPDF 的性能優于純 Python 實現的庫或那些具有更多抽象層的庫 。 ?

  • 穩健性與錯誤處理:現實世界中的 PDF 文件常常存在損壞或不符合標準的情況。PyMuPDF 繼承了 MuPDF 的穩健性,旨在處理有問題的文檔,并常常在其他庫可能失敗的地方嘗試修復 。對于一個生產環境下的腳本來說,這是一個至關重要的特性。 ?

2.3 結論:為何 PyMuPDF 是更優選擇

基于上述分析,本節正式得出結論:PyMuPDF 是最佳選擇,因為它獨特地結合了高性能、深度結構分析能力(同時針對文本和圖像)以及強大的錯誤處理機制。為了清晰地展示這一決策過程,下表提供了一個簡明的比較摘要。

表 2.1:用于內容分類的 Python PDF 庫對比分析

特性/標準

PyMuPDF (Fitz)

pdfplumber

pypdf

核心引擎

MuPDF C 庫 ?

pdfminer.six ?

純 Python ?

文本分析粒度

高:字符/塊/面積數據 ?

中:保留布局的文本 ?

低:簡單的字符串轉儲 ?

圖像檢測/分析

是:直接訪問圖像對象和邊界框 ?

是:可訪問圖像對象 ?

否/有限 ?

相對性能

非常高 ?

中等 ?

低 ?

表格提取

支持(高級) ?

核心功能 ?

不支持 ?

穩健性(損壞文件)

高:嘗試修復 ?

中:可能失敗

中:可能失敗

項目活躍度

非常活躍(與 MuPDF 同步) ?

活躍 ?

活躍 ?

第三節:核心算法:一種用于檢測圖片型 PDF 的啟發式方法

本節將詳細闡述用于分類 PDF 的邏輯,從一個簡單但有缺陷的思路,逐步構建出一個穩健且可辯護的算法。

3.1 初始(有缺陷的)方法:空文本字符串檢查

最直觀的方法是:如果 page.get_text() 返回一個空字符串或幾乎為空的字符串,則該頁面是基于圖像的。然而,這種方法并不可靠。一個 PDF 可能只包含沒有文本的矢量圖形,或者文本使用了 get_text("text") 無法解碼的非標準編碼,這會導致假陽性(錯誤地識別為圖片型)。反之,一個掃描的文檔可能在頁眉或頁腳處有一小段機器可讀的文本,這又會導致假陰性(錯誤地識別為文本型)。此方法缺乏必要的精細度。 ?

3.2 更穩健的啟發式方法:面積比例法

本節將介紹一種更優越的方法,該方法受到文獻 的啟發,并經過改良以提高準確性。 ?

  • 步驟 1:頁面解構 我們將使用 page.get_text("dict") 來獲取頁面內容的結構化表示 。我們明確選擇此方法而非 ?

    "blocks",是因為其輸出的字典中有一個清晰的 "type" 鍵(0 代表文本,1 代表圖像),這比解析塊的內容字符串(如 中所做)作為分類器更為可靠。 ?

  • 步驟 2:面積計算 我們將遍歷塊列表。對于每個塊:

    1. 提取其邊界框 ("bbox")。

    2. 計算矩形面積:(x1??x0?)×(y1??y0?)。

    3. 將這些面積分別累加到兩個總和中:total_text_areatotal_image_area

  • 步驟 3:分類邏輯?使用 page.rect.width * page.rect.height 計算頁面的總面積。然后,計算一個文本比例:text_ratio=total_text_area+total_image_areatotal_text_area?。如果一個頁面的 text_ratio 低于某個可配置的閾值(例如 0.05 或 5%),則該頁面(并可延伸至整個文檔)被分類為“圖片型”。

3.3 為何面積比例法更優

從簡單的“是否有文本?”檢查,轉變為“文本的相對面積是多少?”的檢查,是構建一個穩健分類器的關鍵思維躍遷。現實世界中的“圖片型 PDF”很少是絕對的。一個掃描文檔可能帶有文本水印或包含文本的logo。簡單的布爾值檢查在這些常見邊緣情況下會失效。問題本身不是二元的,而是模擬的。通過測量內容的面積,將問題轉化為一個量化問題。這使能夠設定一個閾值,該閾值與人類對“大部分是圖像”的直覺相符。這種方法對于那些大部分是圖像但含有少量文本(如掃描儀添加的頁碼)的 PDF 也能穩健地工作,因為它能正確識別出絕大部分內容區域是基于圖像的。同時,它也能正確處理完全空白或只包含矢量圖形的頁面,避免了常見的錯誤分類。

第四節:實現:一個生產就緒的 Python 腳

本節旨在提供一個完整、文檔齊全且可執行的 Python 腳本。該腳本不僅實現了前述算法,還能處理現實世界中的各種操作要求。

4.1 環境與依賴

首先,需要為項目設置一個虛擬環境,并安裝必要的庫

pip install pymupdf

PyMuPDF 是執行此任務所需的唯一外部依賴 。 ?

4.2 腳本結構與配置

腳本將采用模塊化設計,為每個邏輯任務定義清晰的函數。配置變量(如源目錄、目標目錄和閾值)將置于腳本頂部,以便于修改。

4.3 核心邏輯 - is_pdf_image_based 函數

此函數將接受文件路徑和閾值作為參數,并完整實現第三節中詳述的面積比例啟發式算法。為了使腳本達到“生產就緒”水平,必須包含強大的錯誤處理機制。

一個健壯的腳本必須能夠區分一個真正基于圖像的文件和一個它根本無法分析的文件。天真的腳本可能會在遇到受密碼保護的 PDF 時崩潰。一個稍好的腳本可能會捕獲異常并跳過它。而一個真正穩健的腳本則能理解不同的失敗模式。

因此,is_pdf_image_based 函數的返回值應為三態:True(圖片型)、False(文本型)或 None(無法分析)。這使得主循環可以采取不同的行動:移動文件、保留文件或將其移動到一個單獨的“待審查”文件夾。這種精細的錯誤處理是生產級代碼的標志。

函數的實現將包含一個 try...except 塊,用于包裹 pymupdf.open() 調用,以捕獲pymupdf.errors.FileDataError 等指示文件損壞或無法打開的異常 。此外,它會使用 ?

doc.is_encrypted 檢查文件是否加密。如果加密,腳本會嘗試使用空密碼進行驗證(doc.authenticate("")),以處理那些沒有設置密碼的用戶鎖定文件。如果驗證失敗,文件將被記錄為加密文件并跳過 。 ?

4.4 文件系統操作

將使用現代的 pathlib 模塊來遍歷源目錄 (Path.glob('*.pdf')),這種方式比舊的 os.listdir 方法更面向對象且平臺無關 。如果目標目錄不存在,將使用os.makedirs(..., exist_ok=True) 創建它 。文件將使用 shutil.move() 進行移動,該函數功能強大,可以處理跨文件系統的移動操作 。所有路徑的構建都將使用os.path.join(),以確保跨平臺的兼容性 。 ?

4.5 完整腳本實現

以下是結合了上述所有概念的完整 Python 腳本。

import os
import shutil
import pymupdf  # PyMuPDF, a.k.a. fitz
from pathlib import Path# --- 配置 ---
SOURCE_DIRECTORY = "source_pdfs"  # 包含待處理PDF的文件夾
DESTINATION_DIRECTORY = "image_based_pdfs"  # 移動圖片型PDF的目標文件夾
ERROR_DIRECTORY = "error_pdfs" # 移動無法處理的PDF的目標文件夾
# 如果文本內容所占面積比例低于此閾值,則將PDF分類為圖片型
# 例如,0.01 表示文本面積小于總內容面積的 1%
TEXT_AREA_THRESHOLD = 0.01def is_pdf_image_based(pdf_path, threshold):"""通過分析文本和圖像內容的面積比例來判斷PDF是否主要基于圖像。參數:pdf_path (Path): PDF文件的路徑。threshold (float): 文本面積比例的閾值。返回:bool | None: 如果是圖片型則返回 True,文本型則返回 False,如果文件無法處理(如加密或損壞)則返回 None。"""total_text_area = 0.0total_image_area = 0.0total_page_area = 0.0try:doc = pymupdf.open(pdf_path)if doc.is_encrypted:# 嘗試用空密碼解鎖if not doc.authenticate(""):print(f"  [警告] 文件已加密且無法打開: {pdf_path.name}")doc.close()return None # 表示無法分析if doc.page_count == 0:print(f"  [警告] 文件不含任何頁面: {pdf_path.name}")doc.close()return Nonefor page in doc:total_page_area += page.rect.width * page.rect.height# 使用 "dict" 提取帶有類型信息的塊blocks = page.get_text("dict")["blocks"]for block in blocks:# 塊類型 0 是文本,1 是圖像bbox = pymupdf.Rect(block["bbox"])area = bbox.width * bbox.heightif block["type"] == 0: # 文本塊total_text_area += areaelif block["type"] == 1: # 圖像塊total_image_area += areadoc.close()except pymupdf.errors.FileDataError as e:print(f"  [錯誤] 無法處理文件(可能已損壞): {pdf_path.name}, 詳情: {e}")return Noneexcept Exception as e:print(f"  [錯誤] 發生未知錯誤: {pdf_path.name}, 詳情: {e}")return Nonetotal_content_area = total_text_area + total_image_area# 處理完全空白或不含文本/圖像內容的PDFif total_content_area == 0:# 如果頁面有面積但沒有內容塊,可以認為是圖片型(例如,一個大的背景圖)# 或者可以根據需求分類為空白并跳過return True text_ratio = total_text_area / total_content_areareturn text_ratio < thresholddef main():"""主函數,用于遍歷源目錄,分類PDF,并移動相應文件。"""source_path = Path(SOURCE_DIRECTORY)dest_path = Path(DESTINATION_DIRECTORY)error_path = Path(ERROR_DIRECTORY)# 創建目標和錯誤文件夾(如果不存在)dest_path.mkdir(exist_ok=True)error_path.mkdir(exist_ok=True)pdf_files = list(source_path.glob("*.pdf"))if not pdf_files:print(f"在 '{SOURCE_DIRECTORY}' 中未找到任何PDF文件。")returnprint(f"開始處理 {len(pdf_files)} 個PDF文件...")moved_count = 0skipped_count = 0error_count = 0for pdf_file in pdf_files:print(f"正在分析: {pdf_file.name}")result = is_pdf_image_based(pdf_file, TEXT_AREA_THRESHOLD)if result is True:try:shutil.move(str(pdf_file), str(dest_path / pdf_file.name))print(f"  -> 分類為圖片型。已移動到 '{DESTINATION_DIRECTORY}'")moved_count += 1except Exception as e:print(f"  [錯誤] 移動文件時出錯: {e}")error_count += 1elif result is False:print("  -> 分類為文本型。跳過。")skipped_count += 1else: # result is Nonetry:shutil.move(str(pdf_file), str(error_path / pdf_file.name))print(f"  -> 無法分析。已移動到 '{ERROR_DIRECTORY}'")error_count += 1except Exception as e:print(f"  [錯誤] 移動錯誤文件時出錯: {e}")error_count += 1print("\n--- 處理完成 ---")print(f"總計文件: {len(pdf_files)}")print(f"已移動 (圖片型): {moved_count}")print(f"已跳過 (文本型): {skipped_count}")print(f"錯誤/無法分析: {error_count}")if __name__ == "__main__":main()

第五節:高級考量與優化

本節旨在探討在真實世界場景中出現的細微差別和邊緣案例,將解決方案從一個簡單的腳本提升為一個可配置的工具。

5.1 調整啟發式閾值

TEXT_AREA_THRESHOLD 的選擇至關重要。一個為 0.0 的值過于嚴格,可能會將包含極少量文本(如掃描儀添加的頁碼)的掃描文檔錯誤地歸類為文本型。一個 0.01 (1%) 或 0.05 (5%) 的值通常是很好的起點。建議通過分析被錯誤分類的文件來微調此值。例如,如果一個掃描文檔帶有由掃描儀添加的大面積文本頁眉,可能需要提高閾值才能正確分類。

5.2 處理多頁文檔

當前的啟發式算法應該應用于文檔的所有頁面。在計算最終比例之前,應將所有頁面的總文本面積和總圖像面積相加。這可以防止單個文本標題頁導致一份包含數百頁的掃描報告被錯誤分類。第四節中提供的腳本實現已經考慮了這一點,通過在整個文檔范圍內累加面積。

5.3 OCR PDF 的邊緣案例

這是一個關鍵的深層次問題。一個掃描的 PDF 可能含有一個由 OCR 過程添加的隱藏、不可見的文本層。在視覺上,它是一張圖片;但在結構上,它包含了大量的文本。

我們的腳本會將這類 OCR 過的 PDF 分類為“文本型”。這可能符合也可能不符合用戶的預期行為。這種矛盾源于“圖片型 PDF”這一術語的模糊性。如果用戶的意圖是識別所有“掃描件”,那么當前的分類就是不準確的。

為了解決這個問題,我們可以提出一種更精細的改進方案。通過使用 page.get_text("rawdict") ,我們可以分析每個字符范圍的flags。OCR 使用的不可見文本通常有一個特定的渲染模式標志(例如,渲染模式3)。一個更高級的啟發式算法可以檢查絕大多數文本是否為不可見。這將使腳本能夠區分“原生數字”的文本 PDF 和“掃描后 OCR”的 PDF,從而提供更為精細的分類。

5.4 規模化性能:并行處理

對于包含數千個 PDF 的目錄,順序處理可能會非常緩慢。由于對每個 PDF 的分析都是一個獨立任務(易于并行化),我們可以使用 Python 的 multiprocessing 模塊顯著加快處理速度。策略是使用一個工作進程池(Pool),將 is_pdf_image_based 函數應用于文件路徑列表,從而將工作負載分配到所有可用的 CPU 核心上。

結論

系統地闡述了如何使用 Python 識別并遷移主要由圖像構成的 PDF 文檔。通過結合對 PDF 格式的深入理解和 PyMuPDF 庫強大的分析能力,我們構建了一個準確且穩健的自動化解決方案。

報告的關鍵結論如下:

  1. 問題的核心是數據結構,而非視覺識別:成功的關鍵在于區分 PDF 內部的可渲染文本對象和圖像對象,而不是嘗試進行視覺分析。

  2. 面積比例啟發式算法的優越性:與簡單的文本存在性檢查相比,基于文本與圖像內容面積比例的啟發式方法能夠更準確地處理含有少量文本噪聲的掃描文檔,具有更高的穩健性。

  3. PyMuPDF 是最佳工具:憑借其卓越的性能、對文本和圖像的深度分析能力以及強大的錯誤處理機制,PyMuPDF 在眾多 Python 庫中脫穎而出,成為執行此類批處理任務的最佳選擇。

  4. 生產級腳本需要考慮現實世界的復雜性:一個可靠的腳本必須能夠妥善處理各種邊緣情況,包括文件損壞、加密以及 OCR 文本層等問題。本報告提供的腳本已將這些因素納入考量。

最后,建議在部署此解決方案時,應根據具體的文檔集調整分類閾值,并啟用詳細的日志記錄以便于問題排查。對于大規模任務,可以考慮引入并行處理以提高效率。遵循這些指導,用戶可以有效地自動化其文檔分類工作流程,為后續的數據提取或歸檔任務奠定堅實的基礎。

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

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

相關文章

淘系怎么做?

首先&#xff0c;要明確一點就是&#xff0c;補單不是“刷/單”&#xff0c;補單是為了給買家營造一個良好的購物氛圍&#xff0c;畢竟再好的產品沒有排名、沒有權重&#xff0c;買家根本都沒有機會看到你的產品&#xff0c;而且只有讓淘寶感覺的產品有扶持必要它才會給你對應的…

網安系列【6】之[特殊字符] SQL注入揭秘:從入門到防御實戰指南

文章目錄一 真實案例二 SQL注入三 為什么危害堪比核彈&#xff1f;四 深入解剖攻擊原理&#x1f3af; 4.1&#xff1a;探測SQL漏洞的存在&#x1f3af; 4.2&#xff1a;數據庫信息探測&#x1f3af; 4.3&#xff1a;數據庫信息探測&#x1f3af; 4.4&#xff1a;數據庫信息進一…

Windows內核并發優化

Windows內核并發優化通過多層次技術手段提升多核環境下的系統性能&#xff0c;以下是關鍵技術實現方案&#xff1a; 一、內核鎖機制優化? 精細化鎖策略? 采用自旋鎖&#xff08;Spinlock&#xff09;替代信號量處理短臨界區&#xff0c;減少線程切換開銷 對共享資源實施讀…

【數據結構】 排序算法

【數據結構】 排序算法 一、排序1.1 排序是什么&#xff1f;1.2 排序的應用1.3 常見排序算法二、常見排序算法的實現2.1 插入排序2.1.1 直接插入排序2.1.2 希爾排序2.2 選擇排序2.2.1 直接選擇排序2.2.1.1 方法12.2.1.1 方法22.2.2 堆排序&#xff08;數組形式&#xff09;2.3 …

NumPy-核心函數np.matmul()深入解析

NumPy-核心函數np.matmul深入解析 一、矩陣乘法的本質與np.matmul()的設計目標1. 數學定義&#xff1a;從二維到多維的擴展2. 設計目標 二、np.matmul()核心語法與參數解析函數簽名核心特性 三、多維場景下的核心運算邏輯1. 二維矩陣乘法&#xff1a;基礎用法2. 一維向量與二維…

突破政務文檔理解瓶頸:基于多模態大模型的智能解析系統詳解

重磅推薦專欄&#xff1a; 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域&#xff0c;包括但不限于ChatGPT、DeepSeek、Stable Diffusion等。我們將深入研究大型模型的開發和應用&#xff0c;以及與之相關的人工智能生成內容…

深入探討支持向量機(SVM)在乳腺癌X光片分類中的應用及實現

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

九、K8s污點和容忍

九、K8s污點和容忍 文章目錄九、K8s污點和容忍1、污點&#xff08;Taint&#xff09;和容忍&#xff08;Toleration&#xff09;1.1 什么是污點&#xff08;Taint&#xff09;&#xff1f;1.2 什么是容忍&#xff08;Toleration&#xff09;&#xff1f;1.3 污點的影響效果&…

基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的超級文化符號構建路徑研究

摘要&#xff1a;在數字技術重構文化傳播生態的背景下&#xff0c;超級文化符號的塑造已突破傳統IP運營框架。本文以開源AI智能名片鏈動21模式與S2B2C商城小程序的融合創新為切入點&#xff0c;結合"嶼光生活"體驗館、快手燒烤攤主等典型案例&#xff0c;提出"技…

QT 日志 - qInstallMessageHandler將qDebug()打印內容輸出到文件

在編程開發中&#xff0c;日志功能至關重要&#xff0c;對于在開發期間或者是程序上線后&#xff0c;都有助于排查問題&#xff1b; 對于C/C和QT方向&#xff0c;日志庫有log4cpp、plog、log4qt等&#xff0c;本篇文章將使用qt自帶的日志方式去實現。 定義日志函數&#xff1a…

記錄一下seata啟動403問題

1.現象&#xff1a;啟動報錯可能是403&#xff0c;或是是密碼錯誤一般是nacos加了認證&#xff0c;seata配置nacos賬號密碼的時候就啟動不了。可能是密碼錯誤&#xff0c;最有可能是seata版本太低導致的。1.4.2以及一下的版本應該都有這個問題2.問題密碼不能有特殊符號如&#…

【STM32實踐篇】:GPIO 詳解

文章目錄GPIO 基本結構GPIO 工作模式GPIO 基本結構 右邊的紅框是I/O引腳&#xff0c;這個I/O引腳就是我們可以看到的芯片實物的引腳&#xff0c;其他部分都是GPIO的內部結構。 保護二極管 上方二極管用于防過壓保護&#xff0c;當I/O引腳電壓高于 V_DD 二極管導通壓降?時&…

#include

關于 C 中的 include <>和 include “” 這兩種形式&#xff0c;區別其實是關于“搜索路徑”和“優先級”的。讓我詳細為你講解。 1. 簡單區別總結 #include <header>&#xff1a;告訴編譯器去“系統標準目錄”或“預定義的標準路徑”中查找頭文件&#xff08;比如…

永磁同步電機參數辨識算法--帶遺忘因子的遞推最小二乘法辨識

一、原理介紹之前已經介紹了遞推最小二乘法進行電氣參數辨識&#xff0c;在實時參數辨識中&#xff0c;協方差矩陣P和增益矩陣K是用于更新參數估計的重要工具&#xff0c;而系統參數變化時&#xff0c;P、K矩陣會逐漸減小&#xff0c;導致數據飽和。數據飽和與參數遲滯是實時參…

JVM 知識點

一、JVM 概述JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虛擬機&#xff0c;它是 Java 編程語言的核心組件之一&#xff0c;負責執行 Java 程序。JVM 使得 Java 程序可以實現“一次編寫&#xff0c;到處運行”的特性&#xff0c;因為它提供了一個抽象的運行環境&…

windows裝機

1、制作啟動盤 2、制作啟動盤 啟動盤中含有WinPE系統和ISO 3、從U盤啟動&#xff0c;加載ISO 4、執行ISO中的setup安裝win10 5、之后從C盤啟動進入win10系統 6、安裝“華為電腦管家”,安裝驅動 華為電腦管家官方下載-筆記本驅動更新 | 華為官網 7、下載安裝必要軟件 https://…

提示技術系列(13)——ReAct

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

【SVO】klt與極限搜索塊匹配findEpipolarMatchDirect

Matcher::findEpipolarMatchDirect 函數邏輯與原理分析 核心目標&#xff1a; 在極線上搜索參考幀特征點 ref_ftr 在當前幀 cur_frame 中的最佳匹配點&#xff0c;并通過三角化計算深度。 關鍵步驟解析&#xff1a; 1. 極線端點計算&#xff1a; const BearingVector A T_…

C 語言基礎入門:基本數據類型與運算符詳解

一、基本數據類型C 語言提供了豐富的基本數據類型&#xff0c;用于存儲不同類型的數據&#xff0c;主要包括整數類型、浮點類型和布爾類型。1. 整數類型整數類型用于存儲整數&#xff0c;根據是否帶符號以及占用存儲空間的不同&#xff0c;可進一步細分&#xff1a;類型名占用存…

應用在核電行業的虛擬現實解決方案

核能領域正處于創新與責任的交匯點。盡管核反應堆提供了高效且可持續的能源&#xff0c;但由于放射性物質的危險性&#xff0c;其也帶來了獨特挑戰。虛擬現實&#xff08;VR&#xff09;技術正通過為遠程操作、應急響應和放射性物質處理提供先進解決方案&#xff0c;徹底革新這…