Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请为文档结构探查器为表单和批注等显示其内容流的命令节点 #233

Closed
Charltsing opened this issue Sep 20, 2024 · 29 comments
Assignees
Labels
改进 New feature or request

Comments

@Charltsing
Copy link

Charltsing commented Sep 20, 2024

0004.zip
捕获

我用pdfbox的debugger可以看到Fm0中的Tj内容,补丁丁找不到

另外我发现文档结构查看器有的内容可以复制,有的不行。例如 Tj 中的数据无法复制

@wmjordan
Copy link
Owner

表单里的指令暂时没有解析。
你选中上图的“Fm0”后,点击“查看”按钮,就能看到表单内的指令。

@wmjordan wmjordan added the 改进 New feature or request label Sep 20, 2024
@Charltsing
Copy link
Author

Charltsing commented Sep 20, 2024

表单里的指令暂时没有解析。 你选中上图的“Fm0”后,点击“查看”按钮,就能看到表单内的指令。

可以考虑在点击节点之后,在下面的那个帮助窗口里面显示解析内容。这样复制问题也解决了

@Charltsing
Copy link
Author

23.zip
3

Contents不全是可见字符,遇到不可见字符例如00,查看的信息就可能截断。

@wmjordan
Copy link
Owner

遇到这种情况,可以用“导出”按钮,把内容导出成文件。

@Charltsing
Copy link
Author

遇到这种情况,可以用“导出”按钮,把内容导出成文件。

二进制文件没法直接看,也许可以把00替换成.再输出文本

@wmjordan
Copy link
Owner

不会考虑替换。
导出成文件后,可以用支持 NUL 字符的文本编辑器或十六进制编辑器查看。

也许后面会为表单等内容解析指令,和页面类似,生成一个“命令”节点。

@Charltsing
Copy link
Author

能生成命令节点也不错,只是不知道要等到哪一年。

其实Contents里面的00字节都在Tj中,转成.也不影响查看结构细节。

我目前的处理办法是检查Tj是不是含有不可显示字符,如果有的话,把Tj中的内容按16进制输出,然后做个标记,能看明白就行。
这样不需要其它第三方软件。

毕竟保存再看实在太慢了。

@wmjordan
Copy link
Owner

请下载新的测试版本。

image

@wmjordan wmjordan self-assigned this Sep 26, 2024
@wmjordan wmjordan changed the title 文档结构查看器显示的信息不全 请为文档结构探查器为表单和批注等显示其内容流的命令节点 Sep 26, 2024
@Charltsing
Copy link
Author

Charltsing commented Sep 26, 2024

测试不通过.zip

一个被截断,一个乱码,具体看压缩包

另外最新代码缺MuPdfWriterOptions定义,删掉才能编译

@wmjordan
Copy link
Owner

wmjordan commented Sep 26, 2024

能生成命令节点也不错,只是不知道要等到哪一年。

一个星期都没够就做出来了,还想“哪一年”呢?
已经说过不考虑替换\0了。前面的帖子给了你截图,在表单节点内有“命令”节点。

请等下个版本,把控制字符替换成\000的八进制表达方式。

@wmjordan
Copy link
Owner

刚刚上传了一个新的测试版。
除了替换了部分不可见字符为八进制表示形式之外,还增加了切换显示编码的功能。

@Charltsing
Copy link
Author

Charltsing commented Sep 27, 2024

谢谢更新,辛苦了

002c.pdf 我不太清楚为什么你要采用八进制显示的方式。我是希望对Tj括号内的乱码或者不可见字符串解码要看到原始byte字节的,这样方便后继处理。至于Contents的其它字符,本来就是ASCII可见字符串,也不需要改编码。

那个切换编码功能可能还是需要加一个混合显示模式。只对TJ内的字符串做编码转换,如果Tj里面有不可见字符,则整个Tj括号里面的数据以原始byte方式显示。这样方便查看Contents信息(提供一个ASCII+部分原始字节的混合显示模式)。

另外 /Artifact 里面会有Contents内容,这里面的字符串也会乱码。希望与Tj中的处理方法一致。

Contents里面目前只发现这两种情况乱码,其它是否还会有乱码情况,等以后遇到再告诉你。

这个应用场景:有的时候我们一方面要看编码后的文本是什么,同时还要能切换看到这个文本的原始字节(包括转义用的反斜杠。之前版本测试发现文档结构查看器可以显示原始字节,但是漏掉了反斜杠,估计是按照转义之后的字符串显示的字节数据),这样才能把可见文本与原始数据对应起来,进行下一步处理。

@Charltsing
Copy link
Author

Charltsing commented Sep 27, 2024

Artifact-Contents.zip
乱码

/Artifact的Contents 显示乱码,切换编码无效。

@wmjordan
Copy link
Owner

PDF规范里支持的转义就是8进制。

如果你关心的是Tj里的文本内容,你应该看展开的命令节点,里面已经给你做好了解码的工作,并且给出了参数的十六进制表示形式。

@wmjordan
Copy link
Owner

内容流不一定都是用ASCII、GBK或统一码编码的。
PDF补丁丁的源码都是开放的,你可以看看它是怎样解码文本的。

别想什么用正则表达式直接匹配TJ或Tj内容来筛选文本,那是歪路。遇到CID字库就马上抓瞎。

@Charltsing
Copy link
Author

Charltsing commented Sep 28, 2024

内容流不一定都是用ASCII、GBK或统一码编码的。 PDF补丁丁的源码都是开放的,你可以看看它是怎样解码文本的。

别想什么用正则表达式直接匹配TJ或Tj内容来筛选文本,那是歪路。遇到CID字库就马上抓瞎。

你可能没太理解我的应用场景。

我在写PDFCommander,这是个永久免费的去水印工具,目前此软件真的可以实现万能去除水印。

通过PDFPatcher,我需要看Contents里面的Tj文本,然后80%情况下最终操作是处理这个文本的原始字节(大概10%的PDF水印是字符串,80%以上不是文本字符串,需要处理原始字节)。

希望PDFPatcher能看到Contents的Tj文本(目的是为了定位原始字节),同时又能把文本显示为原始字节(某些pdf查找水印需要用原始字节),毕竟大部分时候操作是针对原始字节进行的。

使用命令节点确实可以看Tj,但是当命令节点极多的时候(几百个),没有办法找到需要的水印节点。
如果能从Contents里面看那就方便了。先看文本,搜到Tj里面的文本字符串,再切换混合模式,复制Tj的原始字节,然后PDFCommander直接处理水印。一条龙。

如果PDFPatcher只能看到Contents的文本,不能切换显示Tj里面的原始字节,我就得手工干活了。其实我无所谓,只是大部分软件用户没啥操作基础,找不到文本水印的位置和字节就没法写参数。

PDFCommander不需要识别文本,也不使用正则。所以不在乎是不是CID字库。

@wmjordan
Copy link
Owner

wmjordan commented Sep 28, 2024

我知道你想做的工作。
之前已经有网友给我提过这个事情,所以我才将那个查看器给改了一下。
我一般都不使用这界面,而是直接看命令节点的输出结果。

你要做好这个筛选文本的工作,就必须知道怎么解码文本。这是绕不过去的。否则,只会浪费你和我的时间。

@Charltsing
Copy link
Author

Charltsing commented Sep 28, 2024

我知道你想做的工作。 之前已经有网友给我提过这个事情,所以我才将那个查看器给改了一下。 我一般都不使用这界面,而是直接看命令节点的输出结果。

你要做好这个筛选文本的工作,就必须知道怎么解码和重新编码文本。这是绕不过去的。否则,只会浪费你和我的时间。

你答复得比我编辑得都快。

我的意思是软件有分工,你的软件做水印肉眼识别,我的软件做水印处理。
毕竟PDFCommander是个命令行工具,没有界面,不像商业软件那样点选就能删水印。水印全靠肉眼识别,这就突显补丁丁的重要作用了。没有你这个软件,很多人连水印都找不到。

我不能在PDFCommander里面做解码文本,因为没有UI。而且,实际上不需要解码我就能处理水印。
大概60%的文本水印需要先看解码后的文本,再看原始字节码,然后才能写参数。这活我不需要补丁丁就能干,但是大部分菜鸟就不行了,得给他们一个找水印文本和原始字节的软件。

@wmjordan
Copy link
Owner

如果是给普通用户用的话,那就更不能让他们看 Contents 了。

你应该知道 PDF 不是所有文本都是使用国标或统一码编码的,而且这种文档绝非少数。
得想点别的办法。

@Charltsing
Copy link
Author

Charltsing commented Sep 28, 2024

我见过的PDF中的Contents都是ascii编码的,只是Tj里面或者其它个别地方是乱七八糟的编码。PDFCommander所作的一部分工作就是把这些乱七八糟的文本原始字节找到,然后替换掉,达到去水印的目的。补丁丁是我看到的找文本水印的最方便的软件。

Contents正常应该都是ASCII的吧,如果有其它编码的找找有没有样本让我看看。其实PDFCommander处理的是原始字节,并不在意Contents是什么编码,只要人眼能找到水印对应的原始字节就可以了。

我平时工作很少用pdf,不是专业搞pdf文档解析的。我只是临时写个工具救急。发到吾爱发现用途甚广,很多人需要它,所以才慢慢更新成现在这个万能工具。

@Charltsing
Copy link
Author

Charltsing commented Sep 28, 2024

因为需要查找字符串,并复制字节码。

还是希望补丁丁能增加Nice模式,解决在Tj括号内(以及其它个别乱码位置)可以切换显示文本或原始字节码的需求。文本要能人眼识别(支持可能的字符串编码,ASCII、UTF8、ANSI、CID等等)、HEX用来复制(保留转义用的斜杠)。

至于Contents,现在最新测试版是手工切换各种编码,这些切换目前不太符合需求,只能供参考,最终还得靠手工。

我目前的做法是在补丁丁里面看看Contents中的文本位置,然后在PDFCommander输出的text文件中找到对应的HEX。这活菜鸟干不了,所以我需要补丁丁的支持。

这是PDFCommander的输出
捕获

现在需要的Nice模式就是把目前补丁丁命令节点中的字节码和字符串在Contents查看中实现切换输出格式的功能。
因为很多时候命令节点有几百个,完全找不到水印对应的命令节点位置(如果水印是最后几个命令倒是可以找到,但是我见过若干pdf的水印夹杂在几十个命令节点中间的,挨个点开不现实)。
2

如果PDFCommander能集成文本识别并解码的功能当然更好,只是它没有UI,无法点击切换各种编码。PDFCommander的主要工作是处理水印,不具备查找水印的功能(现在靠人工找,效率低,对技术有要求)。而补丁丁正适合补上这个缺陷。

@wmjordan
Copy link
Owner

Contents正常应该都是ASCII的吧,如果有其它编码的找找有没有样本让我看看。

显然不是。
这个就是一例:

test.pdf

@wmjordan
Copy link
Owner

更甚者如下。
test.2.pdf

@Charltsing
Copy link
Author

Charltsing commented Sep 29, 2024

更甚者如下。 test.2.pdf
捕获

没太看懂你说的不是ASCII是啥意思。我看16进制 71 0A 31 36 2E 这就是ASCII啊

另外,查看Contents的时候,切换编码方式,为什么字体还不一样呢?
捕获

@wmjordan
Copy link
Owner

没太看懂你说的不是ASCII是啥意思。我看16进制 71 0A 31 36 2E 这就是ASCII啊

我上传的两个示例文件是针对这句话而言的:“你应该知道 PDF 不是所有文本都是使用国标或统一码编码的,而且这种文档绝非少数。”
内容流的指令是在 ASCII 字符集里,但是文本指令的参数不是。
不借助工具不可能在使用 CID 字库的 PDF 文件里看出文本指令输出了什么文本。

@Charltsing
Copy link
Author

没太看懂你说的不是ASCII是啥意思。我看16进制 71 0A 31 36 2E 这就是ASCII啊

我上传的两个示例文件是针对这句话而言的:“你应该知道 PDF 不是所有文本都是使用国标或统一码编码的,而且这种文档绝非少数。” 内容流的指令是在 ASCII 字符集里,但是文本指令的参数不是。 不借助工具不可能在使用 CID 字库的 PDF 文件里看出文本指令输出了什么文本。

你说的对,现在PDFCommander缺乏文本指令参数的解码功能,导致查找文本水印相对困难。因为没有UI,所以我的软件不打算写文本解码功能。我觉得补丁丁可以弥补这个问题,给菜鸟们谋个福利。

谢谢你的卓越工作

@wmjordan
Copy link
Owner

让我花点时间想想怎样让普通用户可以相对轻松地指定要删除的内容。
下一个版本会更新 MuPDF 组件库,到时候看看是否有更好的办法。

@wmjordan
Copy link
Owner

wmjordan commented Oct 2, 2024

去水印的需求在 #209 ,因内容与本帖提到的需求有重合之处,可到该处继续讨论。

@Charltsing
Copy link
Author

仔细想了想,没有混合模式输出也没啥。把Contents导出之后,在文本编辑器里面把乱码转成16进制字节就行了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
改进 New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants