gpt4 book ai didi

python - 从 pdffonts 的命令输出中仅获取第三列和第六列

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:49 26 4
gpt4 key购买 nike

我正在使用 poppler pdffonts 获取 pdf 文档中的字体。下面是示例输出

$ pdffonts "some.pdf"
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
TimesNewRoman TrueType WinAnsi no no no 36 0
TimesNewRoman,Bold TrueType WinAnsi no no no 38 0
EDMFMD+Symbol CID TrueType Identity-H yes yes yes 41 0
Arial TrueType WinAnsi no no no 43 0
Arial,Bold TrueType WinAnsi no no no 16 0

现在我只想在上面的输出中获取“encoding”和“uni”列值。但由于每行的空间不一致,我无法获取。

尝试过的方法(Python):

1) 按空格拆分每一行并按空格连接然后拆分,以便结果列表中索引 2 和 5 的元素将为每一行提供所需的值。由于行值中有空格,此方法失败。

代码示例:

for line in os.popen("pdffonts some.pdf").readlines():
print ' '.join(line.split()).split()

输出:

['name', 'type', 'encoding', 'emb', 'sub', 'uni', 'object', 'ID']
['------------------------------------', '-----------------', '----------------', '---', '---', '---', '---------']
['FMGLMO+MyriadPro-Bold', 'Type', '1C', 'Custom', 'yes', 'yes', 'yes', '127', '0']
['FMGMMM+MyriadPro-Semibold', 'Type', '1C', 'Custom', 'yes', 'yes', 'yes', '88', '0']
['Arial-BoldMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '90', '0']
['TimesNewRomanPSMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '92', '0']
['FMGMHL+TimesNewRomanPSMT', 'CID', 'TrueType', 'Identity-H', 'yes', 'yes', 'no', '95', '0']
['FMHBEE+Arial-BoldMT', 'CID', 'TrueType', 'Identity-H', 'yes', 'yes', 'no', '100', '0']
['TimesNewRomanPS-BoldMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '103', '0']

2) 使用正则表达式将输出的每一行拆分为至少两个空格。这种方法失败了,因为现在我无法得到索引 5,因为只有一个空格存在。

代码示例:

for line in os.popen("pdffonts some.pdf").readlines():
print re.split(r'\s{2,}', line.strip())

输出:

['name', 'type', 'encoding', 'emb sub uni object ID']
['------------------------------------ ----------------- ---------------- --- --- --- ---------']
['FMGLMO+MyriadPro-Bold', 'Type 1C', 'Custom', 'yes yes yes', '127', '0']
['FMGMMM+MyriadPro-Semibold', 'Type 1C', 'Custom', 'yes yes yes', '88', '0']
['Arial-BoldMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '90', '0']
['TimesNewRomanPSMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '92', '0']
['FMGMHL+TimesNewRomanPSMT', 'CID TrueType', 'Identity-H', 'yes yes no', '95', '0']
['FMHBEE+Arial-BoldMT', 'CID TrueType', 'Identity-H', 'yes yes no', '100', '0']
['TimesNewRomanPS-BoldMT', 'TrueType', 'WinAnsi', 'no', 'no', 'no', '103', '0']

知识库: 由于空间问题而失败。请与原始输出进行比较以获得差异。

$ pdffonts "some.pdf"|awk '{print $3}'

encoding
----------------
WinAnsi
WinAnsi
TrueType
WinAnsi
WinAnsi

最佳答案

您可以为每个需要的列收集字符串位置:

with open('pdffonts.txt') as f:
header =f.readline()
read_data = f.read()
f.closed

header_values = header.split()

positions = {}
for name in header_values:
positions[name] = header.index(name)
print(positions)

这将为您提供以下示例字典:

{'name': 0, 'type': 37, 'encoding': 55, 'emb': 72, 'sub': 76, 'uni': 80, 'object': 84, 'ID': 91}

之后您可以指定要提取的子字符串范围:

desired_columns = []
for line in read_data.splitlines()[1:]:
encoding = line[positions['encoding']:positions['emb']].strip()
uni = line[positions['uni']:positions['object']].strip()
desired_columns.append([encoding,uni])

print(desired_columns)

结果:

[['WinAnsi', 'no'], ['WinAnsi', 'no'], ['Identity-H', 'yes'], ['WinAnsi', 'no'], ['WinAnsi', 'no']]

关于python - 从 pdffonts 的命令输出中仅获取第三列和第六列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53830267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com