将 PDF 或 FDF 转换为 CSV?

将 PDF 或 FDF 转换为 CSV?

这看起来很疯狂,但是虽然 Libre Base 可以将表单导出为 PDF,无法将 PDF 中已完成的表单数据导入 Libre Base。

一个想法是将 PDF 表单数据提取为 FDF(或不友好的 CSV),然后将其转换为友好的 CSV,此时可以将 CSV 数据复制并粘贴到 Libre Base 中。

  • 如何使用以下命令将 PDF、FDF 或不友好的 CSV 文件转换为友好的 CSV:
    • 第 1 行:“字段名称 1,字段名称 2,...”
    • 第 2 行:“值 1,值 2,...”

Ge.tt 上的有用文件截至 2015,02,25

  1. 超级基本空白 PDF,以 FDF 格式提交
    • Libre Base > 表单 > 编辑 > 打开数据库对象 --> 文件 > 导出为 PDF
  2. 已填充 PDF 由 (1) 制作
    • 手动输入数据
  3. 从 (2) 中提取的 CSV 数据
    • pdftk filled_form-submit_format_fdf.pdf dump_data_fields output filled_form.csv
  4. 从 (2) 中提取的 FDF 数据
    • pdftk filled_form-submit_format_fdf.pdf generate_fdf output filled_form.fdf

*注意:您还可以使用 Libre Base 将空白表单导出为 XML 或 HTML,但我不知道如何将数据输入这些文件以及如何将数据导入回 Base。

答案1

如何将 FDF 转换为 CSV?

选项 A:

awk -F "[()]" '{ if ($1=="/V ") value[$2];} \
    END {printf( "CompanyName\tEmailAddress\t\tCountryOrRegion\n" ); \
           for (x in value)printf("%s\t", x);print "" ; \
    }' filled_form.fdf > filled_form.CSV

选项 B:

grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf |awk '{ORS=(NR%3?",":RS)}1'; 

上述命令的简短版本为:

paste -sd, <(grep -oP '(?<=\/T \(txt).*(?=\))' filled_form.fdf) <(grep -oP '(?<=\/V \().*(?=\))' filled_form.fdf)

选项C:

awk 'NR%2==0{type[$0]} NR%2{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=\/T \(txt|\/V \().*(?=\))' filled_form.fdf)

如何将不友好的 CSV 转换为友好的 CSV?

选项 A:

awk -F: '{ if ($1=="FieldValue") value[$2];} \
    END {printf( "CountryOrRegion\tCompanyName\tEmailAddress\n" ); \
           for (x in value)printf("%s\t", x) ;print ""; \
    }' filled_form.csv > friendly_filled_form.CSV

选项 B:

grep -oP '(?<=FieldName: txt).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'; \
grep -oP '(?<=FieldValue: ).*' filled_form.csv |awk '{ORS=(NR%3?",":RS)}1'

*请注意,此命令是线性的。因此,要运行它,您必须键入/复制两行。

这个的简短版本是:

paste -sd, <(grep -oP '(?<=FieldName: txt).*' filled_form.csv) <(grep -oP '(?<=FieldValue: ).*' filled_form.csv)

选项C:

awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(grep -oP '(?<=FieldName: txt|FieldValue: ).*' filled_form.csv)

或者甚至是这个:

awk 'NR%2{type[$0]} NR%2==0{value[$0]} END{for (x in type)printf("%s\t", x);print "" ;for (y in value)printf("%s\t", y);print "" ;}' <(awk -F'FieldValue: |FieldName: txt' 'NF>1{print $2}' filled_form.csv)

如何将 PDF 转换为 CSV?

我将在明天完成解决方案pdfgrep,但如果你想自己尝试,请使用以下命令:

pdfgrep 'CompanyName|CountryOrRegion|EmailAddress' filled_form-submit_format_fdf.pdf

它需要处理输出格式。如果您只想获取整个单词,请使用该-C 0选项。祝您好运,希望对您有所帮助 ;)

答案2

在此特别回答您的评论:

我希望 Base 可以解码 Base 创建的 PDF 文件

不,是的不合理期望任何程序应该能够读取它生成的 PDF,就像期望打印机能够重新打印出一张刚刚打印的纸张并将文档返回给你一样。

PDF 是一种打印/存档格式。它基本上是(1)一系列“将单词你好在页面的 x,y 位置”。因此,当您在 PDF 中看到:

示例 PDF

计算机程序无法判断它是两行三列还是两行两列且包含空格(2)。这个数字3甚至可能是四舍五入后的 2.95。你无法知道,因为信息根本就不存在。所以,你永远都不会认为从 PDF 返回数据是可能的(3)。

然而,你可以尝试将信息转换为更易于管理的内容,例如pdftotext(4):

[romano:~/tmp] 1 % pdftotext Untitled1.pdf; cat Untitled1.txt
Sheet1

shiny
mint

new
used

3
1

Page 1

...然后使用脚本、手动编辑等方式对其进行修改。


脚注:

(1)这里真的、真的是轻描淡写。

(2)实际上,它是 2 乘 2。

(3) 我甚至见过一些 PDF,其中创建程序花了很长时间才使这种情况几乎不可能发生,方法是将每个字形独立且随机地放在页面中,使篡改变得非常困难。不,我再也找不到这个例子了……

(4)从包装中poppler-utils

答案3

LibreOffice 可以生成 pdf 表格。

可以使用免费的 Foxit Reader 将数据转换为 CSV,该程序在 Bionic Beaver 18.04 下运行良好。

将填好的表格加载到 Foxit Reader 中,从“连接”下拉菜单中选择“表格”。然后工具按钮应提供“导出表格数据”。然后保存窗口将提供 XML、XFDF(无论它是什么)、TXT 和 CSV 选项。

相关内容