一些想法及其可能的实现方法


=Start=

缘由:

从微信的付费文章内容获取这里想起来的,但是又不局限于此,主要也是想学习了解一下macOS系统上类似于Windows按键精灵等行为录制的功能该如何更简单快速的实现,简单记录一下,方便后面有需要的时候参考。

另外就是macOS系统自带的“预览”应用和OCR功能真的是很强,比一般人能获取到的其它在线/离线工具强很多。

正文:

参考解答:

想法:

对于已付费的微信文章,我想对其内容做保存(避免后面因为某些原因文章被删减导致无法查看和回顾),但因为付费文章的限制无法对内容进行复制,当前也仅支持用微信客户端提供的阉割版浏览器打开付费文章,所以要实现目标当前可行的方案也就是截图后进行OCR提取文字内容了。虽然我当前看的付费文章中的有效内容绝大多数都是文字,但不排除后面可能会出现图片的情况,所以截图后将所有图片拼接成PDF文档也是非常有必要的,一方面可以保留原始文字样式,另一方面对于内容中有图片的情况支持更好。所以最终目标是:

  1. 提取文字内容
  2. 将截图拼接成PDF文件方便长期保存

当前的做法

简单总结一下后面我可以复用的方法(自动化截图的方法还没学会,先手动操作解决问题):

  1. 按顺序手动截图(Command + Shift + 4 #指定区域截图(会自动在桌面文件夹下用包含时间信息的名字保存png图片文件))
  2. 使用命令行工具 convert 将多张图片转换成PDF文件
  3. 生成的PDF文件是可以用预览打开,并全选然后复制文件内容的

晚点测试一下 Textinator 这个app能否简化提取图片内容的操作(每次截图之后自动对截图中的文字内容进行OCR提取并粘贴至剪贴板,等到后面完全截图完成之后再从剪贴板中把那些文字内容整体复制,这里可能有一个问题是剪贴板的内容可能会被覆盖掉,需要有一个专门的剪贴板管理工具才行,这样的话就把3个步骤简化成了2步,甚至是只有截图这一个步骤,如果不需要图片本身的话)。

自动化截图可能存在的一个问题是,每次移动多少像素点才能比较好的把内容截取全面,又不至于有重复、错漏,感觉程序很难把握的好。

几种实现方法:

全手动:

  1. 按顺序手动截图(并自动存储截图图片)
  2. 对截图进行按序拼接整理成PDF文件(简单不耗时)
  3. 对PDF文件或者各截图图片中的文字内容进行提取并存成文本文件方便检索和复制(不复杂,但如果图片太多了也需要多次全选才行)

半自动:

  1. 按顺序手动截图(并自动存储截图图片)
  2. 【自动】将多张图片按顺序拼接成单个PDF文件
  3. 【手动/自动】对图片/PDF文件中的文字内容进行提取

全自动:

  1. 【自动】截图
  2. 【自动】提取文字
  3. 【自动】将多张图片按顺序拼接成单个PDF文件

当前【全手动】的流程已经跑通了,最耗时的还是“按顺序手动截图”这里,后面的将图片合并成PDF文件以及从生成的PDF文件中提取文字内容不那么耗时。感觉要想实现【全自动】,需要依靠macOS系统提供的 Automator 和 AppleScript 功能来实现,不过需要学习和练习。

过程中零散的问题记录:

  1. 【问题】如何将 ls -l 命令的输出提供给for循环使用,并且避免将文件名中包含空格的内容做切分处理?

简单来说:为了避免在使用 ls -l 命令输出与 for 循环结合时,文件名中包含空格被错误切分的问题,最好的做法是不直接解析 ls 的输出。ls 的输出格式化是为了人类阅读,并不适合程序解析。取而代之的是,应该使用 find 或者其他命令来生成文件列表,这些方法可以更好地处理文件名中的空格、换行符等特殊字符。

但是,如果你确实需要从 ls -l 的输出中提取信息并且正确地处理文件名(包括那些带有空格的),你可以考虑以下几种方式:
……

#!/bin/bash
# 截屏将存储为 .png 文件,而录屏将存储为 .mov 文件。文件名将以“截屏”或“录屏”开头,并包括日期和时间。比如:
# ~/Desktop/截屏2025-01-08 20.32.16.png
# 上面的这个自动保存的文件名中就包含空格。

# ls -1 ~/Desktop/*.png | while IFS= read -r file; do
ls ~/Desktop/*.png | while IFS= read -r file; do
    # echo "$file"
    file "$file"
done

# ls 的 -1 选项,强制输出每行一个条目。当输出不指向终端时,这是默认值。 Force output to be one entry per line.  This is the default when output is not to a terminal.
# 直接 ls 命令不指定任何选项也是可以的。
  1. bash shell中如何对find或者ls命令中的完整路径的文件进行cat操作?

find + xargs 命令可以满足大多数要求,但是,如果对要操作的文件顺序有要求,find 命令就无法满足了,可以通过 ls 命令尝试进行一些简单的文件名顺序的排序,如果更复杂的建议通过代码编程实现。

  1. 用shell脚本批量将当前目录下名字中带有空格的png图片的名字中的空格用下划线替换

注意事项:先切换到对应的目录中去,避免出现因为完整路径字符串中可能包含空格导致的错误。

  1. macOS上如何将多个png图片内容合并成一个(可复制内容的)PDF文件?
brew install imagemagick

convert *.png combined.pdf

open combined.pdf #注意,生成的PDF文件其实还是图片构成的,对于一般程序来说需要先经过OCR处理之后才能获取其中图片里面的文字
  1. macOS上如何将PDF文件中的文字内容提取出来?

补充:下面的几种方法中,好像除了第1种使用预览应用程序的方式可以对由图片生成的PDF文件内容自动进行OCR提取文字内容之外,其它的都不能直接提取成功,需要先经过OCR之后才行。

方法 1:使用预览(Preview)应用程序
macOS 自带的 Preview 应用程序可以直接打开 PDF 文件,并且可以复制其中的文字内容。这是最简单的方法之一,适用于不想安装额外软件的用户。

方法 2:使用 pdftotext 命令行工具

brew install poppler
pdftotext input.pdf output.txt

方法 3:使用 pdfgrep 搜索和提取特定文本

brew install pdfgrep
pdfgrep 'example' input.pdf

方法 4:使用 Automator 创建服务或应用
你可以创建一个 Automator 流程来自动化提取 PDF 文本的过程。这个方法适合那些希望无需每次都手动输入命令的用户。

方法 5:使用 Python 和 PyMuPDF 库
对于编程爱好者来说,Python 提供了许多处理 PDF 文件的库。PyMuPDF(也称为 fitz)是其中一个非常强大的库,可以用来读取 PDF 文件并提取文本。

参考链接:

在 Mac 上截屏或录屏
https://support.apple.com/zh-cn/guide/mac-help/mh26782/mac

ocrmac
https://github.com/straussmaximilian/ocrmac

在 Mac 上的“预览”中选择并拷贝 PDF 中的文本
https://support.apple.com/zh-cn/guide/preview/prvw1020/mac

在 Mac 上的“预览”中使用“实况文本”与照片中的文本交互
https://support.apple.com/zh-cn/guide/preview/prvw625a5b2c/mac

豆包/通义千问/Kimi
https://kimi.moonshot.cn/

Textinator
https://github.com/RhetTbull/textinator

=END=


《 “一些想法及其可能的实现方法” 》 有 4 条评论

  1. mac automator 自动操作 使用初探
    https://blog.csdn.net/sun_csdn_id/article/details/128092637
    `
    1.背景
    我需要给弟弟找一些中考的模拟试卷题,然后找到了一个网页,但是这个网页只记录了获取几十份试卷的方式,就是需要把对应试卷的代码发送到一个微信公众号,然后公众号会回复一个百度网盘的地址和提取码,我要做的是不断重复以下过程:
    (1)复制试卷对应的代码
    (2)发送到公众号,获取网盘地址和提取码
    (3)请求网盘链接,填写提取码,将资料保存到我的网盘
    2.automator探索
    以前无意间看过 automator 好像可以将重复操作录制成脚本,然后定义循环次数,就可以自动完成了。
    注:录制过程使用的 app 尽量使用 mac 系统自带的,这样执行过程中更不容易出错。
    接下来对 automator 的简单使用做以下说明。
    `

  2. 在Windows系统上右键【打印…】菜单的功能是有用的,可以打印生成一个PDF文件(不可以选中文字进行复制)。

    当内容分发到了用户的客户端之后,总有各种各样的方法可以绕过防复制的控制手段,只不过是绕过成本和效率的不同而已,这个是没有办法的事情。但是能尽可能的提高门槛已经是有价值的一件事情了。

    而且,对于这类付费文章,文本内容其实不是核心,如果你想学到东西,真正应该花时间的是消化吸收文章中的内容和思想,以及尽可能的去适配适合自己的方式方法,然后去实践,不要买椟还珠,把重点给搞反了。

  3. 压榨 DEVONthink 的潜力,一键批量 OCR 外部 PDF 文件
    https://utgd.net/article/20956
    `
    Adobe Acrobat 或 ABBYY FineReader Pro 或许是终极 OCR 工具,但如同越野车,大家都知道性能好,可真正买的人却不多。一般人更愿意使用 PDF 阅读器或文件管理工具中的 OCR 功能,而 DEVONthink 刚好内置了稍旧一些的 ABBYY OCR 引擎,堪称 OCR 处理中的 SUV:马力够,买得起,也用得起——意思是,性能最差的 MacBook Air 也跑得动。

    但有个问题。DEVONthink 通常只能处理其数据库内的文件,最起码也要把文件索引(Index)到其库中,处理完再导出或者复制一份出去,导入导出频繁。而处理一份 PDF 文件并不意味着要永远将其存于 DEVONthink 数据库中。例如我每天收到少则几份、多则几十份的扫描版文件,大多需要转为可复制文本的版本,但绝大多数属于工作文件,用完就移到硬盘里归档,不会留在 DEVONthink 里。

    此事令我介意很久,甚至一度想再买一个 ABBYY FineReader Pro,免得反复导入导出。^1理想情况下,OCR 应当成为复制粘贴一样的基础设施,在文件右键上下文菜单或 Finder 中有现成的按钮,点一下,即可就地 OCR——至少只有几页或十来页的小文件应当如此。

    就像下图。易言之,我已经找到了用 DEVONthink 处理几乎任何 PDF 的方法。

    回顾旧方案,整体逻辑是:预备一个专用文件夹,将其作为触发机关,再于 DEVONthink 内关联此外部文件夹并制备 smart rule(具体方法见前文),迨需处理 PDF 文件时,便将其替身文件(Alias)拖入文件夹中,此时即可借用替身文件触发 DEVONthink 中的 smart rule,OCR 刚刚拖入的文件。而替身毕竟只是一个中转的临时文件,故原始文件仍在原位,不占空间,也不必频繁导入导出文件。

    警告:通过 Alias 索引文件时,DEVONthink 实际上直接索引了原始文件,如果你在 DEVONthink 中删除文件、清空垃圾桶并确认抹掉原始文件,那么原始文件也会被删除。根据事故的瑞士奶酪模型,同时踩到前述全部雷点的可能性不高,但仍需注意。

    惜乎,旧方案违反直觉之处也在于必须将待处理文件拖入目标文件夹,而这个文件夹又不具备任何文件管理上的意义,它仅仅充当触发机关。或许除了(估计没多少人记得的)DropZone、FilePane 和部分自制方案,也没多少软件采用托拽交互。此番改进,主要在于找回传统的点击或纯快捷键操作。

    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注