Я использую 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
Теперь я хочу получить только значения столбцов "кодировка" и "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']
AWK: Ошибка из-за недостатка места. Пожалуйста, сравните с исходным выводом, чтобы получить разницу.
$ pdffonts "some.pdf"|awk '{print $3}'
encoding
----------------
WinAnsi
WinAnsi
TrueType
WinAnsi
WinAnsi