- 1 - 上次的文章《PDF内容自动提取,想取哪些页面就取哪些页面!| PA实战案例》里,讲解了怎么自动提取指定页码PDF内容的操作方法,并且提及一种动态提取的情况:提取文件中除最后固定几页(如5页)以外的所有内容。
比如,很多企业的pdf报告,前面包含数据的页面不固定,但最后几页,嘿嘿,都是一些例行的备注说明,这样,我们要动态地去取前面的数据页面,最关键的是能获取到整个pdf报告的页数。
但是,目前Power Automate里却没有支持获取pdf文件页数的操作或方法,这时,我们就需要通过Power Automate自动调用第三方的工具来实现了!比如,炒鸡强大的pdf批处理工具:pdftk!
- 2 -
pdftk是啥?简单来说,就是一个操作pdf的工具箱(全称:pdf toolkit),完整介绍及文档可以参考官网PDF Labs: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
但是,一般来说,官网的内容对大部分普通用户来说,都是看得贼累的,所以,这个官网并不是本次推荐的关键,下面这个才是——网站“批处理之家”:
http://bbs.bathome.net/
首先是,pdftk到底能干啥?
简单来说,可以通过在DOS下写一些简单的命令,即能实现很多PDF文件处理的功能,具体功能有哪些呢?看图:
具体怎么干?看例子:
代码语言:javascript复制合并PDF:
pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
或者 (使用通配符):
pdftk *.pdf cat output combined.pdf
把多个PDF的不同页面组合成一个新的PDF文档(将one.pdf的前7页,two.pdf的前5页,one.pdf的第8页按先后顺序合并成combined.pdf)
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
旋转PDF的第一页为顺时针90度(向东)(其余页方向不变,2-end表示第2页到最后一页)
pdftk in.pdf cat 1E 2-end output out.pdf
旋转PDF的第一页为逆时针(向西)90度,只提取第一页
pdftk in.pdf cat 1W output out.pdf
选择所有PDF页面180度:
pdftk in.pdf cat 1-endS output out.pdf
使用128强度加密PDF(安全模式,只读)
pdftk in.pdf output mydoc.128.pdf owner_pw foopass
同上,同时给PDF加上访问密码(会弹出一个密码输入框)
pdftk in.pdf output mydoc.128.pdf owner_pw foo user_pw baz
同上,但是运行打印:
pdftk in.pdf output mydoc.128.pdf owner_pw foo user_pw baz allow printing
解密PDF文档(foopass替换成pdf的owner_pw密码):注意:前提是你得知道pdf的密码所以此功能只是解除所有者的密码,使阅读者不需要输密码
pdftk secured.pdf input_pw foopass output unsecured.pdf
合并两个PDF文档,其中一个是加密的,但最终文档不加密:
pdftk A=secured.pdf mydoc.pdf input_pw A=foopass cat output combined.pdf
解压PDF流,以便文本编辑:
pdftk mydoc.pdf output mydoc.clear.pdf uncompress
压缩PDF:
pdftk mydoc.pdf output mydoc.clear.pdf compress
修复PDF文档
pdftk broken.pdf output fixed.pdf
分解成单页(文件名以pg_开头)
pdftk mydoc.pdf burst
报告PDF信息,输出到文本
pdftk mydoc.pdf dump_data output report.txt
这么多例子,也不用一下子全部搞懂,这里咱们先看最后一条:报告PDF信息,其中就包含了一个PDF文件有多少页的信息!输出结果如下:
- 3 -
回到本文开始所提问题的关键点——获取PDF文件的总页数,我们就可以在Power Automate中调用pdftk工具来实现。
首先,我们先下载工具,下载地址:https://share.weiyun.com/uHScXQNP
解压到一个自己方便调用的文件夹下,应该包含两个文件:
然后,在Power Automate里的实现过程如下:
Step-01 获取文件夹中的文件
Step-02 添加for each循环操作
Step-03 添加“运行DOS命令”步骤,获取pdf文件信息(包含页数)
在常规设置里,通过路径选择按钮选择pdftk所在的路径,通过参数选择按钮选择当前pdf文件的全名(%CurrentItem.FullName%),最后补充dumpdata参数,从而得到pdf文件的信息。
这里要注意的是,因为有些pdf文件的文件名称可能存在空格,因此,要对%CurrentItem.FullName%加上双引号,避免dos命令运行的出错!
通过上面的步骤得到pdf文件信息后,我们接下来先用比较基础的文本拆分方法从pdf信息中分离出pdf文件的页数,以后我们再讲其他更加方便的方法(但涉及到正则、或其他dos命令用法)。
Step-04 添加“拆分文本”操作,将上一步骤获取的pdf文件信息按“NumberOfPages:”拆分:
这样,pdf文件信息将被拆成2部分:
得到的结果中TextList[1]即为包含页数的部分。
Step-05 继续添加“拆分文本”步骤对TextList[1]按“换行符”进行拆分
此时,我们会得到多行内容,其中第1行(标号为0)的内容即为页数,但要注意,这里是文本格式的内容,接下来要将文本转为数值:
Step-06 添加“将文本转换为数值”步骤,对TextList2[0]转换为数值:
Step-07 添加“从pdf提取文本”步骤,按范围提取从第1页至“页数-5”的页面
Step-08 将提取的pdf文档内容写入文本文件
- 4 -
通过上面的简单步骤,我们获取了pdf文件的页数,然后按“页数-5”的方式完成了既定的目标。
这里,pdftk工具起到了很关键的作用,实为Power Automate实现pdf文件操作的重要补充,后面我会继续用来讲解更多日常工作中遇到的pdf文件自动化处理问题。
最后,再次推荐网站:批处理之家(http://bbs.bathome.net/),上面汇聚了大量用于批处理的工具或方法(DOS、PowerShell或VB)。
当然,对于大多数的朋友来说,并不需要学太多的DOS或PowerShell命令,但是,稍作了解,在需要的时候知道可能存在这么一种方式,哪怕是让别人帮忙实现,也多一种思路。