简介:这是一款专为处理PDG格式电子书而设计的工具组合,面向需要批量转换或阅读老旧PDG文档的读者、研究人员及档案整理者。资源将PDG文件先解析为图片,再借助批量合并功能生成通用PDF,同时附带对DjVu格式的操作支持,适合在多种设备间完成文档转移与长期保存。压缩包共2个文件,以htm与exe为主,其中exe为可直接运行的核心程序,htm提供相关说明或帮助信息,整体体积约2.86MB,小巧轻便。已有953人学习下载,对于常接触中国早期网络电子书资源的用户而言,这套组合能有效解决格式老旧、打开困难的问题。读者可获得PDG转图片、图片转PDF、DjVu基础处理等完整转换链路,既能逐页导出图片,也能一键合成多页PDF,兼顾灵活性与批量效率,在日常查阅、打印或归档场景中较为实用。
1. 老马三剑客:把整库PDG批量转成可检索PDF的实战路线
整理单位图书室电子资源时,我遇到过一个再常见不过的任务:上千本早期数字图书系统交付的PDG老书,要统一转成PDF,供长期归档和全文检索。动手一轮之后才发现,“pdg2PDF”这件事根本没有一键完成的通用工具,最可靠的还是从业者圈子里流传多年的“老马三剑客”方案——三个小工具分别负责读取PDG页面、合成PDF、挂接章节目录,拼起来正好是一条完整的转换流水线。这篇笔记就是我把这条流水线跑通的完整记录:工具怎么分工、参数怎么调、批量怎么做、哪里容易翻车,都按实际使用情况写清楚。适合数字化归档、资料库维护和个人藏书整理的同行参考。
2. 拆解三剑客:PDG转PDF为什么是一条流水线而非一个工具
2.1 PDG的文件结构:扫描页与文字页两类内容
PDG在很多人眼里是一种“过气格式”,但它并没有真正离开资料库,不少机构早期电子书采购的交付物至今仍是这种格式。PDG的页面内容大致分两类:一类是扫描图,每页对应一张黑白、灰度或彩色的位图,体积会随页数线性增长;另一类是文字版页面,内容由字符编码和字体信息构成,靠阅读器在打开时实时渲染。这种“图像+文字”的双轨结构,决定了转换工具必须同时具备图像处理能力和文字渲染能力。普通PDF转换器识别不了这种容器,直接在操作系统里改后缀名,或者丢给在线转换网站,基本都会以失败告终,不是不出文件,就是出一堆乱码页。
批量场景里还有更麻烦的情况:文字版和扫描版的页面会混在同一本书里,封面是扫图、内页是文字、插图页又按图像存放。这种情况下只用一种策略去处理,多半会翻车。这也是为什么必须把多个工具串起来,而不是指望一个所谓的“万能转换器”解决问题。
2.2 三剑客的定位:解包、组装、回填目录
关于“三剑客”具体指哪三个工具,不同帖子里说法略有出入,但按“转PDF并带目录”这个目标来看,最常见的组合是Pdg2Pic、FreePic2Pdf和PdgCntMaker。它们都出自同一位老开发者的工具箱,没有官方“三剑客”的叫法,名字是使用者们叫出来的。可正因为三个工具对目录和页序的处理是成体系的,合在一起用非常顺手。
| 工具 | 在流水线里的位置 | 核心输出 |
|---|---|---|
| Pdg2Pic | 读取PDG容器,把每一页内容提取成图片 | 一页一个JPG/TIF/PNG文件 |
| FreePic2Pdf | 把按页序排列的图片合成PDF,并写入书签目录 | 可直接翻阅的PDF |
| PdgCntMaker | 从CNT目录文件或扫描目录页中提取章节目录,生成书签数据 | 供FreePic2Pdf读取的书签文件 |
三个工具的边界很清晰:Pdg2Pic负责“读懂”PDG,FreePic2Pdf负责“拼装”PDF,PdgCntMaker负责“恢复目录”。很多人初次接触时只用了FreePic2Pdf,结果拼出来的PDF没有书签,几百页的书翻起来全靠手点,体验很差。加上PdgCntMaker之后,目录可以批量回填,整本书才真正符合归档要求。我见过不少同事在这套工具上花时间反复试,最后发现最合理的路径就是先把这三个工具各自的功能边界搞清楚,再谈参数。
2.3 路线选择:pdg2pdf直转、还是先转图像再合成
老马的工具里其实有一个pdg2pdf程序,可以把PDG直接转成PDF,单本书、页数少、对版式要求不高时非常快。但直接转换有两个问题:一是对PDG内页的图像质量和分辨率干预空间小,遇到彩色页面、灰度页与黑白页混排时,容易出现整页被统一压缩的情况;二是书签回填比较麻烦,直转出来的PDF通常只有正文没有目录。做批量书库时,我更倾向于“Pdg2Pic → FreePic2Pdf”的图片中继路线。好处有三点:
- 中间产物是图片,能人工抽检,发现单页问题可以单独重转,不用整本书返工;
- 图片在合成前可以定制尺寸、命名、压缩方式,避免一把梭把彩色封面包压成黑白;
- 目录回填有FreePic2Pdf的专用入口,PdgCntMaker生成的目录文件能直接被它读取,直转路线反而难处理书签。
当然,直接转也不是没有价值。以文字页为主的PDG、版面干净、没有大量彩色插图的,用pdg2pdf直转最快,转出来还自带文本层。扫描书则老老实实走图片中继,看起来多了一步,实际最稳。这个选型判断我在多个项目里反复确认过,原则就是“先看页面构成,再决定路线”。
2.4 动手前的准备:文件整理、备份、cnt目录文件识别
从书库导出的PDG,一般一本书是一个独立文件夹,里面有一堆以数字命名的*.pdg文件,还可能带一个*.cnt目录文件和若干配置类小文件。cnt文件记录着“章节名+页码”,是后面生成书签的地图。我习惯先把整个待转换盘区按以下套路整理,再开始点工具:
- 建源书库、临时图库、成品PDF三个目录,互不交叉;
- 对源书库做一次文件数快照,至少记录每本书的pdg文件数量;
- 确认cnt文件是否存在,有就单独复制一份出来备用;
- 对0字节或超大异常PDG先做标注,避免转换到一半中断。
这套准备看起来琐碎,但在批量场景里是“后悔药”。我遇到过整个批次的PDG文件在拷贝过程中缺了一批,如果没有源目录页数记录,根本发现不了PDF少了几十页。另外,临时目录最好不要放在系统盘,Pdg2Pic导出图片时会产生大量小文件,系统盘空间不足会导致转换中途报错,这个细节很容易被忽略。
3. 实操:一本接一本,把PDG导成带书签PDF的完整过程
3.1 用Pdg2Pic提取页面:输出格式、DPI与底灰处理
启动Pdg2Pic后,界面左侧是书目录列表,右侧是页面预览。把待转换的书目录添加进来,点击某本书就能看到每页的缩略图。这一步的重点是右侧的输出选项,也就是中间产物的形态。我按扫描书处理时的常用参数如下:
| 参数项 | 推荐设置 | 理由 |
|---|---|---|
| 输出格式 | JPG,质量80到90之间 | 清晰度和体积比较均衡,方便后续抽检 |
| 页面缩放 | 保持原始尺寸 | 扫描书开本不一,强制放大只会增加噪点 |
| 灰度页处理 | 自动保留灰度 | 避免把彩色印章、插页变成黑白块 |
| 底灰清理 | 开启,阈值偏保守 | 去浅灰底纹,但不要误删浅色正文 |
点击转换后,工具会在输出目录下按页序生成图片。生成完毕先别急着关,用预览图随机翻几页,确认没有白页或乱码页。这一步如果出了大量白页,往往是文字版PDG的字体渲染配置不对,后面避坑部分会展开。中间产物一旦确认没问题,后面FreePic2Pdf合成的成功率就很高了。
3.2 用FreePic2Pdf合成PDF:页面尺寸、压缩率与书签挂载
打开FreePic2Pdf后,左边选择刚刚Pdg2Pic输出的图片目录,右边按文件名列出图片列表。这时我只检查两件事。第一,列表顺序必须按数值而非字符串排列,否则第10页会排到第2页前面;第二,PDF页面大小建议按“原图尺寸”而不是固定A4,因为扫描书开本不统一,强制A4会产生大量白边。
参数设置上,我一般把JPEG压缩设为中高,PDF版本选PDF/A兼容;如果页面文件本身已经是处理好的JPG,FreePic2Pdf就不要做二次压缩,直接选择不重新压缩,能保住细节。这里需要解释一下:如果原始页面是扫描图,二次压缩等于把已经损失过的信息再压一遍,残影和噪点会被放大;而原始页面本来就是黑白文字的话,适度压缩反而可以大幅缩小PDF体积,不影响阅读。这个取舍要根据“这本书是文字书还是彩图书”来定,而不是一个参数用到底。
3.3 用PdgCntMaker生成目录:从cnt文件到FreePic2Pdf书签
许多书库里的cnt文件是阅读器维护的,包含章节名和页号,但直接把cnt文件交给FreePic2Pdf并不总能识别,因为FreePic2Pdf对书签文件的层级和页号格式有自己的约定。这时PdgCntMaker就派上用场:打开PdgCntMaker,选择“从cnt文件导入”,它会解析出来一个目录树,可以增删章节、修改名称和页码。保存时选择FreePic2Pdf书签文件格式,生成一个文本文件备用。
如果没有cnt文件,PdgCntMaker还支持“从图片目录页提取”:在书的正文前一般会有目录页,用它标注目录条目并指定页码,原理是把目录页当作图像来识别。这一步对扫描书尤其有用,很多书库导出的PDG没带cnt,目录只能从版权页后面的目录页重建。操作时需要注意目录页的页码是“印刷页码”还是“文件页序”,如果二者不一致,后面书签跳转就会整体偏移。
3.4 批量化:批处理脚本与GUI结合的真实工作流
这三件工具的官方形态都是图形界面,要实现全自动并不现实,但可以把人工步骤压缩到最短。下面是我常用的批处理框架,用PowerShell把每本书归拢到独立目录,然后按顺序唤起工具,人工确认后再放行下一本:
param([string]$BooksDir = "D:\books_pdg") $tempRoot = "D:\books_tmp" $pdfRoot = "D:\books_pdf" foreach ($dir in Get-ChildItem $BooksDir -Directory) { $name = $dir.Name Write-Host "== $name ==" -ForegroundColor Cyan # 第1步:把每本书的pdg文件整理进独立临时目录 $pageDir = Join-Path $tempRoot $name New-Item -ItemType Directory -Force -Path $pageDir | Out-Null Copy-Item "$($dir.FullName)\*.pdg" -Destination $pageDir # 第2步:唤起Pdg2Pic,人工点击转换 Start-Process "D:\tools\Pdg2Pic.exe" $pageDir Pause # 第3步:唤起PdgCntMaker,提取并保存书签文件 Start-Process "D:\tools\PdgCntMaker.exe" $pageDir Pause # 第4步:唤起FreePic2Pdf,合成PDF Start-Process "D:\tools\FreePic2Pdf.exe" $pageDir Pause } Write-Host "流程结束,请检查临时目录中的日志" -ForegroundColor Green这段脚本的逻辑很简单:foreach循环遍历源书库下的每个子目录,把每本书的PDG文件复制到独立的临时目录,然后依次唤起三个工具。Start-Process只是打开程序并传目录参数,Pause让循环等待人工操作完成后继续,避免多个工具窗口互相干扰。它的价值不是省掉点击,而是保证每一本书都统一进入同一个流程,不会漏转、不会重复转、也不会因为人工切换目录搞混来源。
4. 三剑客避坑记录:乱码、页序、书签偏移等五个现象
4.1 文件名和目录乱码:转换工具读不出中文书名
现象:Pdg2Pic里能看到页面,但导出的图片文件名或生成的书签标题变成“锟斤拷”一类乱码,甚至无法读取目录。
原因:老工具在简体中文Windows上用GBK读取字符串,若目录名或cnt文件是UTF-8编码,就出现编码错位。这种问题在来源系统版本较新的书库里尤其常见,新系统导出时默认UTF-8,老工具按GBK解析,必然乱码。
解决:先把中文目录名复制成临时英文名,转换完成后再改回中文;或者调整系统区域设置,勾选“使用Unicode UTF-8提供全球语言支持”重启后再试。需要注意第二种做法会影响整个系统,谨慎评估后再操作。我一般优先用临时英文目录名,简单、不碰系统全局配置。
4.2 页面顺序错乱:第10页跑到了第2页前面
现象:合成出来的PDF从某页开始章节倒错,像第10页、第11页、第12页出现在了第2页之前。
原因:FreePic2Pdf按文件名做字符串排序,若页面文件导出为“1.jpg、2.jpg、10.jpg”,字符串顺序是1、10、2,而不是1、2、10。这个问题在书页超过两位数时必然出现,页数越多越明显。
解决:转换前统一把页面文件改成三位以上编号。Pdg2Pic导出时勾选“页号补零”,或者在批处理里加一段重命名,把编号强制补齐为四位数,确保字符串排序和数值排序一致。
$files = Get-ChildItem "$dir" -Filter *.jpg $i = 1 foreach ($f in $files) { Rename-Item $f.FullName -NewName ("{0:D4}.jpg" -f $i) $i++ }4.3 书签整体偏移:目录内容对,点击后却跳到别的页
现象:PdgCntMaker生成的目录条目名称准确,但PDF里点击书签后,跳转页与预期差固定的几页,比如每章都晚了三页。
原因:书签文件里的页码以0为起点还是以1为起点,与源cnt记录的“1基页号”不对齐;加上书内封面、扉页、版权页是否计入页码,两者定义也不同。这个偏移量在同一本书里是固定的,但换一本书可能就不一样。
解决:先抽一本书,在前、中、后各选三个章节验证偏移量,然后在PdgCntMaker的页号偏移里输入修正值,批量重生成书签。不要拿PDF编辑器逐条拖动书签,数量一多必然痛苦,而且下次转换又得重来。
4.4 文字版PDG转出后白页或缺字
现象:某些书转出来的PDF里,部分页面是空白或断字,文字内容丢失。
原因:这批PDG是文字版页面,依赖阅读器内置字体渲染。转换工具的字体文件不全,或字号设置不对,渲染失败就成了白页。和扫描图不同的是,文字版页面没有原始位图可以兜底,渲染不了就真的丢了内容。
解决:在Pdg2Pic的文字渲染选项中切换到完整字体模式,或者把这类书直接交给pdg2pdf转换,直转路线对文字版的兼容更可靠。转换后随机抽查几页文字完整性,别只看页数对上就觉得没问题。
4.5 彩色扫描书被压成灰阶,封面细节全丢
现象:PDF里彩色页面全部变成黑白或灰阶,印章、彩色插页的细节完全丢失。
原因:FreePic2Pdf的压缩设置中勾选了“黑白页统一压缩”,或者源图片在Pdg2Pic输出时被强制降为黑白模式。问题通常出在“统一”两个字上,一本书里只要有一半文字页,这个选项就会把另一半彩色页也拖下水。
解决:回到Pdg2Pic,把输出格式设为彩色JPG;FreePic2Pdf合成时不要开启“全黑白化”,保留灰度与彩色。这里要特别提一下,彩色书和黑白书的参数不能复用同一套配置,我曾在批量转换时图省事,一套参数跑完全部书目,结果三分之一的彩色书全部变成了灰阶,只能返工。
5. 验证与验收:转完的PDF要怎么核对页数和书签
5.1 页数核对:源目录与PDF双向对账
转换完成后,第一件事不是打开看,而是对页数。源书库的页数记录和PDF页数不一致,说明转换过程中有丢页。用PyMuPDF写一个简单的PDF页数和书签检查脚本,几秒钟就能扫完一本:
import fitz import sys pdf = fitz.open(sys.argv[1]) print(f"PDF页数: {pdf.page_count}") toc = pdf.get_toc() print(f"书签数: {len(toc)}") for level, title, page in toc[:5]: print(f"L{level} {title} -> PDF第{page+1}页")逻辑说明:PyMuPDF的get_toc返回的是以0为起点的页索引,所以展示时加1转成习惯页码。先打印PDF总页数,再打印前五条书签的层级、标题和跳转页。若源书登记页数为300而PDF页数是299,基本可以断定中间少了一页,要去临时目录找Pdg2Pic的输出图片,确认是导出缺失,还是FreePic2Pdf合成时跳过了空文件。sys.argv[1]就是传入的PDF路径,脚本不关心PDF在哪个目录,跑起来很快。
5.2 书签跳转验证:抽查“首一中一尾”三处
书签列表只有数量、没有内容,不等于目录可用。点开PDF目录,分别抽查第一章、中间一章、最后一章,确认跳转页与标题语义基本一致。若有全本偏移,回到PdgCntMaker修正偏移量后重新生成,不要用PDF编辑器手改。这个步骤每批抽两本即可,但新换的PDG数据源第一本必须全查。我做书库维护时,被目录偏移坑过一次,一本五百页的书签全部晚了两页,当时偷懒没抽查,结果整批发出去后被退回,后来再也不敢跳过这一步。
5.3 体积与清晰度抽查:防“假高清”
PDF动辄几十MB不一定清楚,体积小也不一定“看起来清”。用脚本统计图片目录下的文件大小分布,再和PDF文件大小做粗略对比,能快速发现压缩过狠或过大两种情况:
param([string]$ImageDir = "D:\books_tmp\某书") $sizes = Get-ChildItem $ImageDir -Filter *.jpg | ForEach-Object { $_.Length } | Sort-Object $count = $sizes.Count if ($count -eq 0) { Write-Host "目录为空"; exit } $median = $sizes[[int]($count / 2)] Write-Host "图片数量: $count" Write-Host "单页大小中位数: $([math]::Round($median / 1KB, 1)) KB"逻辑说明:中位数比平均值更可靠,个别大图把均值撑高的假象可以被中位数识破。如果300页的书单页中位数只有20KB,说明压缩过狠,放大到全屏会明显发糊。回到FreePic2Pdf重新合成,把JPEG质量调高即可。反过来,一本书单页平均5MB、整本PDF超过2GB,说明原始图片没有压缩,也要检查是不是页面缩放设置失效。
5.4 文字版PDF做文本层抽检
文字版PDG转出的PDF里应该能选中文字。验证方式有两种:用PDF阅读器打开任意三页,鼠标在正文上拖选,能选中文字说明保留了文本层;也可以用脚本提取文本:
import fitz doc = fitz.open("output.pdf") page = doc[15] # 抽查第16页 text = page.get_text() print(f"第16页文本长度: {len(text)}") if len(text) < 50: print("警告:该页几乎无文本,可能未保留文字层") doc.close()这里有一个常见的认识误区:图像PDF的页面在阅读器里也能被鼠标“选中”,但选中的只是整张图片,不是文字。真正区分文本层的方法是反选状态下的复制粘贴,或者用get_text看返回值。如果一本文字版书转出来变成纯图片PDF,说明走的图片中继路线时没有开启文本保留选项,这种PDF在知识库里检索不到内容,只能重新处理。
6. 固化三剑客参数模板,扫描PDF顺带补全文检索
6.1 把“调好的参数”固化成模板
三剑客这套工具我第一次用的时候,花了两天时间才把参数调顺,后来每次换一批新书又要重新试。后来悟出一个习惯:首次样书验收后,把导出格式、DPI、偏移量、压缩率、页号补零这些关键参数记录下来,放在批处理脚本同目录下。之后再接到新书库,先按模板跑一本样书,确认页面质量过关,再全量执行。这个习惯让我在后续项目里省了大量返工。工具不复杂,复杂的是人对参数的记忆和重复校准。
6.2 给扫描版加文本层,让PDF具备全文检索能力
扫描版PDG转出的PDF仍是一张张图片,放进知识库后检索命中率很低。要给扫描版补文本层,常见路线是先对每页图片做OCR,再把识别文本嵌回PDF。下面是思路演示,不是可直接运行的生产代码:
# 示意:把OCR结果作为极小字号的文本对象写回PDF ocr_results = [] # 每页识别文本 for page_img in page_images: text = ocr_engine.recognize(page_img) # 替换为你的OCR函数 ocr_results.append(text) pdf = fitz.open("scan.pdf") for i, page in enumerate(pdf): if i < len(ocr_results): page.insert_text((10, 10), ocr_results[i], fontsize=0.01) pdf.save("scan_ocr.pdf")这个示例演示的是最小可行思路:把OCR文本放进肉眼几乎看不见的极小字号文本对象中,既不影响阅读,又让PDF具备可被搜索的文本层。生产环境建议用支持OCR文本层的正规工具或库函数完成同样的动作,避免文本坐标处理出问题。实际操作时,我会先用Pdg2Pic导出的JPG做OCR,确认识别准确率,再决定是否全量处理。这套流程在你档案入库的最后一公里很值得投入,毕竟归档的目的是以后能查得到。希望帮到你。
本文还有配套的精品资源,点击获取