wmjordan / PDFPatcher

PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等
https://pdfpatcher.cnblogs.com/
9.23k stars 1.26k forks source link

“提取图片”能否不限于图片,包含字体等stream均可无损提取? #161

Closed MY1L closed 12 months ago

MY1L commented 1 year ago

使用场景 出于文字学术研究的目的, 中有上百个PDF需要提取字体,只因这些PDF必须自定义字体以显示通常系统字体不支持的文字(不然就不成学术问题了)

功能应该怎样实现 界面、操作方式均同“提取图片”,仅无损导出stream即可,能批量导出就更好了,剩余(如判断文件真实格式加后缀名等等)我自己解决。

类似软件 我只用过PDF补丁丁1.0.0.4172版提取字体,但用的是探查器功能,非常艰苦。

wmjordan commented 1 year ago

可以考虑在导出信息文件的界面增加导出流对象的功能,不难,但是文件命名要想想怎么处理才好(暂时可能会考虑将流对象按类型分文件夹存储,文件名采用流对象的编号命名)。

wmjordan commented 1 year ago

PDF嵌入的字体一般是TTF子集,即使将流提取出来,也不能直接为操作系统所用。 阁下有办法做二次处理吗?

MY1L commented 1 year ago

但是文件命名要想想怎么处理才好

其它流不清楚,但字体可以考虑加上PS名,或者说被剥离掉字体信息后仅剩的那个被文字调用的字体名称,方便识别。

PDF嵌入的字体一般是TTF子集,即使将流提取出来,也不能直接为操作系统所用。有办法做二次处理吗?

这个一般人可能用不了,但对我而言没问题,已经试过多次了(毕竟我也是做字体的)

wmjordan commented 1 year ago

其实以前是有代码可以导内嵌数据流的,由于一直没有人提这样的需求,我个人又用不上这些数据流,所以就注释掉了。 现在把这些注释掉的这部分拿回来,再改改就可以了。 主要就是文件命名的事情,得重构上面的代码,增加给数据流命名的部分。

wmjordan commented 1 year ago

请下载新的测试版。 在“工具箱”的“导出导入信息文件”处,点击“信息文件配置”。 选中如下选项: image 关闭对话框, 回到“导出导入信息文件”页面,指定输出信息文件的目录,再点击“导出信息文件”。

image

在输出信息文件的目录处会找到一个“数据流”文件夹,里面以FontFile2开头的文件就是嵌入到PDF的字体子集数据。

image
MY1L commented 1 year ago

太好了。只是必须勾选“导出字典”,能否仅“导出流”?如果仅导出字体流就更好了,有时会导出一大堆不用的图片流。

https://www.unicode.org/charts/PDF/U2F00.pdf 试验: 发现导出许多0KB的流,这些是否可以跳过? 还发现有许多CIDSet.*.dat文件内容在16进制的80之后全是00,也可以跳过。 话说pdf里的字体通常会保留一个PostScript名以备调用,是否可以考虑在数字后附加PS名来命名字体流?PDF有时能导出几十个字体流,导致需要逐一打开检查名称。 同时还发现,如果字体流后缀名改为用ttf,有些较完整的字体就可以直接阅览字体缩略图了,而且也能迅速找到不完整的字体。

啊,刚才发现补丁丁可以查看字体名的,这个名称就可以: image

wmjordan commented 1 year ago

是的,要勾选“导出字典”。 下个版本不导出0KB的流。 CIDSet文件,在80后面很多00之类的暂时别纠结了。 附加PS名是可行的,稍麻烦一点,改改代码就可以。 后缀改TTF是可行的。等我看看是否可判别哪些是完整字体,哪些是字体子集,可按具体情况处理,那就更完善了。

MY1L commented 1 year ago

报告一个pdf:https://www.unicode.org/L2/L2022/22046-myanmar-numerals.pdf 目标是提取Myanmarnumerals这个字体。但补丁丁导出的字体流似乎都损坏了,字体软件无法打开。 但别人能使用 https://mupdf.readthedocs.io/en/latest/mutool-extract.html 这个功能从中提取出可以打开的 Myanmarnumerals-Regular.otf(三次曲线) 不清楚问题在哪里。

wmjordan commented 1 year ago

我查了 mutool 的代码,纯粹就是解压字体流,没什么特殊处理的。 PDF补丁丁也是这样处理。

查 VVSDUS+Myanmarnumerals-Regular 在 PDF 字典里的 Type,可见它是一个 Type1C 字体(CFF 格式)。 试用支持 CFF 格式的字体软件来打开它。 你也可以用字体转换工具(例如:https://convertio.co/cff-ttf ),把它转换成 TTF 或其它形式的字体。

image

VVSDUS+Myanmarnumerals-Regular.zip

MY1L commented 1 year ago

可能是CFF的问题,报错为“字体 head table 缺失”。 不过别人发给我的(.otf)相比补丁丁导出的(.dat,改otf)多出2KB(或别人有修复过?我再问一下对方细节),软件能正常打开前者,是三次曲线的。压缩包附上这2个文件以便研究:22046-myanmar-numerals.zip 一般来说无转换的三次曲线,比二次曲线质量更好,所以我想尽可能不用cff2ttf。呃,发现convertio.co把原始的字形名改了。

MY1L commented 1 year ago

继续报告位于Roadmap to the SMP的PDF。用1.0.0.4182版导出字体, https://www.unicode.org/L2/L2023/23122-kashmiri-sharada.pdf 未能输出目标字体“SatisarSharada”,只有各种微软Calibri字体,不过这些字体都能打开。 我更新了1.0.0.4200版继续,但这次输出的字体流就都打不开了。 重新测试,前述问题未能复现,不过还是未能输出“…Sharada”

https://www.unicode.org/L2/L2023/23019-sidetic.pdf 目标是sidetic字体,但打开检查字体名时报错,强制退出,没能看见字体名。2个版本都是,报错信息如下:

System.ArgumentOutOfRangeException:
有效的 UTF32 值介于 0x000000 和 0x10ffff 之间(包括这两者),而且不能包含代理项码位值(0x00d800 ~ 0x00dfff)。
参数名: utf32

这2个PDF兴许各有什么特别的问题。

wmjordan commented 1 year ago

未能输出目标字体“SatisarSharada”

有这个字体

image

用 BabelMap 加载并分析该字体库可见目标字符。

image

如果导出信息文件时提示编码错误,可以更改输出文档的编码规则。

image
MY1L commented 1 year ago

先前所述的并非“Satisar Sharada”,其实是“S…Sharada Proposal”,不过关键问题已解决。

sidetic仍有一点问题如下。


继续报告PDF,这次只用1.0.0.4200版。

1.有个界面逻辑问题:在PDF补丁丁打开某个PDF(此时位于编辑器界面),点击工具栏“导入导出信息文件”按钮,打开的是一个空白窗口提示导入PDF,没有像预期的那样将已打开的PDF置入,印象中以前版本是可以的。

2.前段时间有新的统一码减字谱提案(IRGN2645,提案文件巨大,因此提取第19页给你:19.pdf。 在编辑器页面,只要鼠标移到减字(应该都是位于私用区增乙的字符,19.pdf亦可复现)上立即报错:

************** 异常文本 **************
System.ArgumentOutOfRangeException: 有效的 UTF32 值介于 0x000000 和 0x10ffff 之间(包括这两者),而且不能包含代理项码位值(0x00d800 ~ 0x00dfff)。
参数名: utf32
……

这就没法操作了,由于先前sidetic那个文档也是这样(鼠标移到塞德文字上立即报错),想了解是什么原因。


看见你用的BabelMap似乎没有汉化完全?恰好我做了统一码各种名词翻译,译名经过考据,可用于汉化:https://github.com/MY1L/Unicode/tree/main/Blocks

wmjordan commented 12 months ago

先前所述的并非“Satisar Sharada”,其实是“S…Sharada Proposal”,不过关键问题已解决。

sidetic仍有一点问题如下。

继续报告PDF,这次只用1.0.0.4200版。

1.有个界面逻辑问题:在PDF补丁丁打开某个PDF(此时位于编辑器界面),点击工具栏“导入导出信息文件”按钮,打开的是一个空白窗口提示导入PDF,没有像预期的那样将已打开的PDF置入,印象中以前版本是可以的。

那个界面没有那种设计。带有批量处理列表的功能都没有那种设计。

2.前段时间有新的统一码减字谱提案(IRGN2645,提案文件巨大,因此提取第19页给你:19.pdf。 在编辑器页面,只要鼠标移到减字(应该都是位于私用区增乙的字符,19.pdf亦可复现)上立即报错:

************** 异常文本 **************
System.ArgumentOutOfRangeException: 有效的 UTF32 值介于 0x000000 和 0x10ffff 之间(包括这两者),而且不能包含代理项码位值(0x00d800 ~ 0x00dfff)。
参数名: utf32
……

这就没法操作了,由于先前sidetic那个文档也是这样(鼠标移到塞德文字上立即报错),想了解是什么原因。

属于缺陷。下个版本将其修复。

看见你用的BabelMap似乎没有汉化完全?恰好我做了统一码各种名词翻译,译名经过考据,可用于汉化:https://github.com/MY1L/Unicode/tree/main/Blocks

谢谢告知。是我特意没汉化不常用的语种区块(保留英文)。这样常用的中日韩等汉语言体系、拉丁语种和通用区块就会比较明显。