PDF目录书签生成器 PDG
文章目錄
- PDF Dir Generator
- 安裝 PyPDF2 和 wxPython
- 獲取 PDF 目錄信息
- 格式化書簽
- 生成書簽
- 使用說明
- 基本流程
- 參數設置
- 最終效果
- 源碼下載
- 參考
PDF Dir Generator
PDF Dir Generator,PDF 目錄生成器, 是基于 wxpython 和 PyPDF2 開發的一個簡易的 GUI 程序,主要功能是給未添加書簽的 PDF 添加目錄書簽。
安裝 PyPDF2 和 wxPython
可使用 pip 安裝 PyPDF2 和 wxpython.
pip install PyPDF2 pip install wxPython我使用的版本號為: Python 3.9.12, wxpython 4.2.0, PyPDF2 2.11.0
如果 PDF 經過其他軟件修改(如刪除書簽)可能會有如下報錯:
File "C:\Users\q2799\.conda\envs\py36\lib\site-packages\PyPDF2\_writer.py", line 1195, in addBookmarktitle, pagenum, parent, color, bold, italic, fit, *argsFile "C:\Users\q2799\.conda\envs\py36\lib\site-packages\PyPDF2\_writer.py", line 1174, in add_bookmarkparent = self.get_outline_root()File "C:\Users\q2799\.conda\envs\py36\lib\site-packages\PyPDF2\_writer.py", line 1008, in get_outline_rootidnum = self._objects.index(outline) + 1 ValueError: {'/Type': '/Outlines', '/First': IndirectObject(1006, 0, 3019818315728), '/Count': 493, '/Last': IndirectObject(1498, 0, 3019818315728)} is not in list安裝完成 PyPDF2 后需要對 _writer.py 的 get_outline_roor() 函數進行修改,這個函數的路徑可以在報錯信息上找到:
def get_outline_root(self) -> TreeObject:if CO.OUTLINES in self._root_object:# TABLE 3.25 Entries in the catalog dictionaryoutline = cast(TreeObject, self._root_object[CO.OUTLINES])try:idnum = self._objects.index(outline) + 1except ValueError:if not isinstance(outline, TreeObject):def _walk(node):node.__class__ = TreeObjectfor child in node.children():_walk(child)_walk(outline)outline_ref = self._add_object(outline)self._add_object(outline_ref.get_object())self._root_object[NameObject('/Outlines')] = outline_ref idnum = self._objects.index(outline) + 1 outline_ref = IndirectObject(idnum, 0, self)assert outline_ref.get_object() == outlineelse:outline = TreeObject()outline.update({})outline_ref = self._add_object(outline)self._root_object[NameObject(CO.OUTLINES)] = outline_refreturn outline獲取 PDF 目錄信息
這一步比較繁瑣,需要手動來獲取 PDF 目錄信息,主要有兩種方式:
(推薦)使用書簽獲取軟件(見源碼下載)
在 全國圖書館參考咨詢聯盟 上搜索你的 PDF,例如我這兒搜索的是《合成孔徑雷達成像算法與實現》,打開版權頁 / 前言頁 / 目錄頁,復制它的SS碼到書簽獲取軟件,點擊獲取即可得到 PDF 的目錄信息。
(法1沒找到時)使用一些OCR文字識別工具,或者直接原PDF的目錄頁提取出來,然后再轉為word
最后,我們需要將目錄信息保存為一個 txt 文件,類似下面這種:
第一部分 合成孔徑雷達基礎 2 第1章 概論 2 1.1合成孔徑雷達背景簡介 2 1.2遙感中的雷達 3 1.3 SAR基礎 3 1.4星載合成孔徑雷達傳感器 7 1.5內容概要 9 1.5.1星載合成孔徑雷達圖像示例 10 參考文獻 11 第2章 信號處理基礎 14 2.1簡介 14 2.2線性卷積 14 2.2.1連續時間卷積 14 2.2.2離散時間卷積 16 2.3傅里葉變換 18 2.3.1連續時間傅里葉變換 18 2.3.2離散傅里葉變換 18 2.3.3傅里葉變換性質 19 2.3.4傅里葉變換示例 22 2.4卷積的DFT計算 24 2.5信號采樣 25 2.5.1采樣信號的頻譜 25 2.5.2信號類型 26 2.5.3奈奎斯特采樣率和混疊 28 2.6小結 42 2.6.1金星坑的麥哲倫圖像 42 參考文獻 43 附錄A RADARSAT數據光盤 393 縮略語對照表 395 符號表 398 參考書目 401 索引 415每一行包含兩項:標題 title + 頁碼 page。
其中標題中的符號 . 可以幫助我們判斷書簽的級別,例如:
第一部分 合成孔徑雷達基礎 2 第1章 概論 2標題符號 . 個數為0,我們認為這些是一級書簽,像:
2.1簡介 14 2.2線性卷積 14標題符號 . 個數為1,我們認為這些是二級書簽。當然也有例外
1.5.1星載合成孔徑雷達圖像示例 10 參考文獻 11 第2章 信號處理基礎 14這里的“參考文獻 ”應該和“1.5.1星載合成孔徑雷達圖像示例 ”同屬于二級書簽,但是由于沒有符號 . 會被誤判斷為一級書簽。
注意到這些標題名往往是固定的,因此可以預定義這些標題的級別,當書簽的標題與預定義的標題一致時,直接判定為預定義級別,無需統計符號 . 的個數。
格式化書簽
為提高目錄文件的可讀性,根據書簽的級別在每一行添加 n-1 個\t前綴(n為書簽級別)。
后續的“生成書簽”也是根據前綴數來判斷書簽級別的,因此這一步往往是必須的。
點擊 Run > Format Dir, 最終代碼格式化為:
第一部分 合成孔徑雷達基礎 2 第1章 概論 21.1合成孔徑雷達背景簡介 21.2遙感中的雷達 31.3 SAR基礎 31.4星載合成孔徑雷達傳感器 71.5內容概要 91.5.1星載合成孔徑雷達圖像示例 10參考文獻 11 第2章 信號處理基礎 142.1簡介 142.2線性卷積 142.2.1連續時間卷積 142.2.2離散時間卷積 162.3傅里葉變換 182.3.1連續時間傅里葉變換 182.3.2離散傅里葉變換 182.3.3傅里葉變換性質 192.3.4傅里葉變換示例 222.4卷積的DFT計算 242.5信號采樣 252.5.1采樣信號的頻譜 252.5.2信號類型 262.5.3奈奎斯特采樣率和混疊 282.6小結 422.6.1金星坑的麥哲倫圖像 42參考文獻 43 附錄A RADARSAT數據光盤 393 縮略語對照表 395 符號表 398 參考書目 401 索引 415生成書簽
再完成 format dir 后點擊 Run > Generate Dir ,一切正常的話即可完成書簽的添加。
使用說明
基本流程
注意:選擇 PDF 時記得先清空里面原先的書簽。
參數設置
參數說明
- Offset 頁碼偏移量,書簽對應的頁數 = 目錄文件的page + offset, 一般這個值等于目錄頁最后一頁所在的頁碼;
- Prefix 目錄文件每行的前綴, 生成書簽時用于判斷書簽的級別
- DELIMITER 單詞分隔符, 通常是空格, 不建議修改
- LEVEL_MARKER 級別標志符, 格式化書簽時用于判斷書簽的級別
- Pre-level 預定義級別
- Pre-title 預定義標題, 注意使用“;”隔開,不要有多余的空格
- PDF Output Path PDF輸出目錄, 留空會根據輸入PDF名自動生成
- Dir-Log Path 格式化目錄文件的輸出日志存放文件夾目錄,留空則與原目錄在同一文件夾
- Dir-format Path 格式化目錄的輸出文件夾,留空則與原目錄在同一文件夾
這里通常需要設置的是 Offset 以及 Pre-title,設置完成后記得點擊 Finish。
除了這種設置方式外,還支持直接導入配置文件(文件后綴名為 .conf):
########################################################################### # # 這是一個配置文件, 以行為基本單元, 可以分為注釋行, 賦值行和空行. # # 注釋行以字符 '#' 開頭, 程序會忽略以'#'開頭的行; 行首直接回車,則是空行; 注釋行 # 和空行可以提高配置文件的可讀性. # # 賦值行的格式為: 字段名 = 值: # 1. "值"可以修改, 但不要修改"字段名"; # 2. "="兩邊的空格可有可無, 數量沒有限制; # ############################################################################ str, 待添加書簽的PDF路徑 PDF_INPUT_PATH = "test\pdg_test.pdf"# str, 目錄文件的路徑 DIR_INPUT_PATH = "test\pdg_normal_dir.txt"# int, 頁碼偏移量, 通常是PDF目錄頁最后一頁的頁碼 OFFSET = 5# char, 目錄文件每行的前綴, 生成書簽時用于判斷書簽的級別 PREFIX = "\t"# char, 單詞分隔符, 通常是空格, 不建議修改 DELIMITER = " "# char, 級別標志符, 格式化書簽時用于判斷書簽的級別 LEVEL_MARKER = "."# int, 預定義級別 PRE_LEVEL = 2# str, 預定義標題, 使用';'隔開 PRE_TITLE = "本章小結;習題"# str, 格式化目錄文件的輸出日志存放文件夾,留空則與原目錄在同一文件夾 DIR_LOG_PATH = ""# str, 格式化目錄的輸出文件夾,留空則與原目錄在同一文件夾 DIR_FORMAT_PATH = ""# PDF輸出目錄, 留空會根據輸入PDF名自動生成 PDF_OUTPUT_PATH = ""# int, 是否只顯示目錄日志 IS_PRINT_ACTICE_ONLY = 0# int, 生成日志前默認先進行格式化 IS_FORMAT_DIR_FIRST = 1# int, 是否打印生成書簽過程中的信息 IS_PRINT_PROCESS = 1最終效果
源碼下載
- 倉庫:https://gitee.com/iam002/pdfdir-generator2
- 書簽提取軟件:
鏈接:https://pan.baidu.com/s/1FDMd4l8vFH5nAT2VjczGdg
提取碼:p3qd
參考
- https://www.codetd.com/en/article/11823498
- https://www.cnblogs.com/1blog/p/15186521.html
- https://www.jianshu.com/p/1aac3ae4d620?tdsourcetag=s_pcqq_aiomsg
- https://www.wxwidgets.org/
總結
以上是生活随笔為你收集整理的PDF目录书签生成器 PDG的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pc电脑版java模拟器下载安装_PC电
- 下一篇: 前端学习(575):margin无效情形