跳转到主要内容

分割特定PDF文件并将结果存储在自定义目录布局中

项目描述

将大型PDF文件分割成多个部分。

许可

这是一个免费软件(GPLv3),有关许可信息,请参阅LICENCE.txt。

它做什么

提供一个包含所有工资表的PDF文件(或其他类型)。在每一页上,您提供一个ancode和一个名称(员工的“名称”和一个特定的“ancode”键)。此程序将PDF分割成单独的工资表。

它允许负责工资表分发的人员从他们的会计软件生成文件,并获取一个具有结构化目录结构的输出。

enDI通过其界面将该目录结构与工资表分发相匹配。

通过扩展,可以配置对多种类型数据的分割。

如何

原始文件命名为<filetype>_<year>_<month>.pdf(例如:salaire_2020_11.pdf)。

  • 使用文件类型来获取适当的解析配置。

  • 生成的PDF文件放置在名为<filetype>/<year>/<month>/的目录下。

使用配置,该工具在PDF页面中搜索“ancode”和“名称”。它在适当的目录中生成文件,格式为<ancode>_<name>.pdf,包含相关的关键字页面。

安装

发行版依赖关系

安装pdftotext命令行工具。

基于Debian的发行版

apt-get install poppler-utils virtualenvwrapper

从PyPI安装

mkvirtualenv splitpdf
pip install caerp-split-pdf

从源安装

设置Python虚拟环境

mkvirtualenv splitpdf
pip install -r requirements.txt
pip install -e

开发模式

pip install -e .[dev]

配置

主要配置文件

默认为~/.caerp_split_pdf_config.yaml,可以使用 -c <configfile> 指定。

格式为yaml。

配置

  • 文件类型

  • 对于每种文件类型,一个解析策略,描述要提取的数据类型、提取方式以及要生成的文件名。(可以提供多个解析器,这里为 ancode 提供了三个,为 name 提供了两个)

示例

salaire:
    filename_template: {data1}_{data2}_{data3}.pdf
    datatypes:
       data1:
          - type: regex
            regex: '[\s]{30,80}(?P<ancode>[A-Z]{4,12})\s+'
            from_line: 11
            to_line: 14
            strict: True
            regex_group_name: ancode

          - type: coordinates
            line: 12
            column: 40
            prefix: "     "
          - type: coordinates
            line: 13
            column: 40
            prefix: "     "

        data2:
          - type: regex
            regex: '\s+(M|Mme|Mlle)\s+(?P<name>[\w\s]+)(\n|$)'
            from_line: 6
            to_line: 9
            regex_group_name: name
            strict: True

          - type: coordinates
            line: 8
            column: 50

        data3:
          - type: coordinates
            line: 2
            column: 60
            prefix: "Section :"

这里我们配置了名为 salaire_<year>_<month>.pdf 的文件的解析。

对于每一页,我们将提取三个数据并将所有页面按照匹配的 data1/data2/data3 三元组进行分组。这些页面将被分组到一个以 filename_template 命名的文件中。

查找器

对于每个数据,你可以累积多个“查找器”来实现数据检索。查找器将按照指定的顺序使用。

有两种类型的查找器。

RegexDataFinder

使用正则表达式在页面的字符串表示形式(pdftotext 输出)中查找数据

regex

用于匹配我们正在寻找的数据(ancode 或 name)的正则表达式。

strict(默认为 False)

如果为 True,则只有当只有一个项目与正则表达式匹配时才返回结果

from_line / to_line(可选)

指定一个行范围以限制查看的数据量。查找器将只在 from_line 和 to_line 行号之间(从 1 开始)查找。

regex_group_name(可选)

如果正则表达式使用组,则指定匹配数据的组

CoordinateDataFinder

使用坐标在页面的字符串表示形式(pdftotext 输出)中查找数据

line

查找数据的行

column

在行中开始的列

prefix(可选)

在数据之后应查找的前缀

日志记录

此程序支持以下选项的高级日志配置。

verbosity: DEBUG

可用选项是 DEBUG/INFO/WARNING/ERROR/CRITICAL

Syslog 日志记录

use_syslog: true

邮件日志记录

log_to_mail: true
mail:
    host: localhost
    from: admin@host.fr
    to: contact@example.net
    subject: '[%(hostname)s] Log of the pdf splitter'

该程序足够智能,如果配置指定,则使用 syslog。

如果配置包含 log_to_mail: True,则记录到邮件

示例

完整运行

caerp-split-pdf-run -c myconfig.yaml playground/salaires_2013_07.pdf

测试前 5 页是否可解析

caerp-split-pdf-run  -c myconfig.yaml playground/salaires_2013_07.pdf -r 5

使用 -v 以获取调试信息。

使用 -h 获取选项的完整概述。

已知问题

  • 针对工资单

    无法处理某些 PDF 文件,特别是如果没有目录且字符集为“二进制”时。用此检查

    file -i $filename.pdf

已知问题

当日志返回类似以下的消息时

CRITICAL - 没有输出页!

如果最终用户使用 Sage “Édition pilotée” 生成其文件,则问题可能是最终用户使用了“打印到 PDF”导出而不是“保存为 PDF”。