pdfminer.six
pdfminer.six copied to clipboard
getting lots of (cid:#) instead of readable text
New issue since #368 was closed due to missing examples and such stuff. The output I get is always the same of course.
Code:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages("vp.pdf"):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
File: vp.pdf
Output:
(cid:36)(cid:88)(cid:74)(cid:88)(cid:86)(cid:87)(cid:76)(cid:81)(cid:72)(cid:85)(cid:86)(cid:70)(cid:75)(cid:88)(cid:79)(cid:72)(cid:15)(cid:42)(cid:82)(cid:72)(cid:87)(cid:75)(cid:72)(cid:83)(cid:79)(cid:68)(cid:87)(cid:93)(cid:3)(cid:23)
(cid:39)(cid:16)(cid:25)(cid:20)(cid:20)(cid:25)(cid:28)(cid:15)(cid:3)(cid:41)(cid:85)(cid:76)(cid:72)(cid:71)(cid:69)(cid:72)(cid:85)(cid:74)
(cid:54)(cid:87)(cid:88)(cid:81)(cid:71)(cid:72)(cid:81)(cid:83)(cid:79)(cid:68)(cid:81)(cid:3)(cid:21)(cid:19)(cid:21)(cid:19)(cid:18)(cid:21)(cid:19)(cid:21)(cid:20)
(cid:21)(cid:17)(cid:3)(cid:43)(cid:68)(cid:79)(cid:69)(cid:77)(cid:68)(cid:75)(cid:85)
(cid:56)(cid:81)(cid:87)(cid:76)(cid:86)(cid:3)(cid:21)(cid:19)(cid:21)(cid:20)
(cid:21)(cid:24)(cid:17)(cid:25)(cid:17)(cid:21)(cid:19)(cid:21)(cid:20)(cid:3)(cid:3)(cid:20)(cid:21)(cid:29)(cid:23)(cid:25)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:16)(cid:57)(cid:72)(cid:85)(cid:87)(cid:85)(cid:72)(cid:87)(cid:88)(cid:81)(cid:74)(cid:86)(cid:83)(cid:79)(cid:68)(cid:81)(cid:3)(cid:73)(cid:129)(cid:85)(cid:3)(cid:71)(cid:72)(cid:81)(cid:3)(cid:3)(cid:21)(cid:27)(cid:17)(cid:25)(cid:17)(cid:3)(cid:18)(cid:3)(cid:48)(cid:82)(cid:81)(cid:87)(cid:68)(cid:74)(cid:3)(cid:58)(cid:82)(cid:70)(cid:75)(cid:72)(cid:16)(cid:37)
(cid:39)(cid:76)(cid:72)(cid:3)(cid:47)(cid:72)(cid:85)(cid:81)(cid:74)(cid:85)(cid:88)(cid:83)(cid:83)(cid:72)(cid:81)(cid:3)(cid:90)(cid:72)(cid:85)(cid:71)(cid:72)(cid:81)(cid:3)(cid:89)(cid:82)(cid:85)(cid:3)(cid:71)(cid:72)(cid:85)(cid:3)(cid:72)(cid:85)(cid:86)(cid:87)(cid:72)(cid:81)(cid:3)(cid:54)(cid:87)(cid:88)(cid:81)(cid:71)(cid:72)(cid:3)(cid:89)(cid:82)(cid:81)(cid:3)(cid:71)(cid:72)(cid:81)
(cid:47)(cid:72)(cid:75)(cid:85)(cid:78)(cid:85)(cid:108)(cid:73)(cid:87)(cid:72)(cid:81)(cid:3)(cid:93)(cid:88)(cid:80)(cid:3)(cid:54)(cid:72)(cid:79)(cid:69)(cid:86)(cid:87)(cid:87)(cid:72)(cid:86)(cid:87)(cid:3)(cid:89)(cid:82)(cid:80)(cid:3)(cid:54)(cid:70)(cid:75)(cid:88)(cid:79)(cid:75)(cid:82)(cid:73)(cid:3)(cid:68)(cid:69)(cid:74)(cid:72)(cid:75)(cid:82)(cid:79)(cid:87)(cid:17)
(cid:39)(cid:68)(cid:86)(cid:3)(cid:57)(cid:82)(cid:85)(cid:87)(cid:85)(cid:72)(cid:73)(cid:73)(cid:72)(cid:81)(cid:3)(cid:71)(cid:72)(cid:85)(cid:3)(cid:51)(cid:68)(cid:87)(cid:72)(cid:81)(cid:3)(cid:73)(cid:129)(cid:85)(cid:3)(cid:71)(cid:76)(cid:72)(cid:3)(cid:78)(cid:82)(cid:80)(cid:80)(cid:72)(cid:81)(cid:71)(cid:72)(cid:81)(cid:3)(cid:24)(cid:17)(cid:3)(cid:46)(cid:79)(cid:68)(cid:86)(cid:86)(cid:72)(cid:81)(cid:3)(cid:73)(cid:76)(cid:81)(cid:71)(cid:72)(cid:87)(cid:3)(cid:76)(cid:81)
(cid:71)(cid:72)(cid:85)(cid:3)(cid:26)(cid:17)(cid:3)(cid:54)(cid:87)(cid:88)(cid:81)(cid:71)(cid:72)(cid:3)(cid:76)(cid:80)(cid:3)(cid:74)(cid:85)(cid:129)(cid:81)(cid:72)(cid:81)(cid:3)(cid:46)(cid:79)(cid:68)(cid:86)(cid:86)(cid:72)(cid:81)(cid:93)(cid:76)(cid:80)(cid:80)(cid:72)(cid:85)(cid:3)(cid:86)(cid:87)(cid:68)(cid:87)(cid:87)(cid:17)
(cid:36)(cid:69)(cid:90)(cid:72)(cid:86)(cid:72)(cid:81)(cid:71)(cid:72)(cid:3)(cid:46)(cid:79)(cid:68)(cid:86)(cid:86)(cid:72)(cid:81)(cid:29) (cid:19)(cid:25)(cid:41)(cid:3)(cid:11)(cid:20)(cid:16)(cid:21)(cid:12)(cid:15)(cid:3)(cid:19)(cid:25)(cid:41)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:19)(cid:25)(cid:41)(cid:3)(cid:11)(cid:24)(cid:16)(cid:25)(cid:12)(cid:15)(cid:3)(cid:19)(cid:28)(cid:39)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:19)(cid:28)(cid:39)(cid:3)(cid:11)(cid:24)(cid:16)(cid:25)(cid:12)(cid:15)(cid:3)(cid:19)(cid:28)(cid:39)(cid:3)(cid:11)(cid:20)(cid:16)(cid:21)(cid:12)(cid:15)(cid:3)(cid:52)(cid:22)(cid:18)(cid:52)(cid:23)
(cid:37)(cid:79)(cid:82)(cid:70)(cid:78)(cid:76)(cid:72)(cid:85)(cid:87)(cid:72)(cid:3)(cid:53)(cid:108)(cid:88)(cid:80)(cid:72)(cid:29)
(cid:36)(cid:20)(cid:27)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:36)(cid:20)(cid:27)(cid:3)(cid:11)(cid:24)(cid:16)(cid:25)(cid:12)(cid:15)(cid:3)(cid:36)(cid:20)(cid:28)(cid:3)(cid:11)(cid:20)(cid:16)(cid:21)(cid:12)(cid:15)(cid:3)(cid:36)(cid:22)(cid:28)(cid:3)(cid:11)(cid:20)(cid:19)(cid:16)(cid:20)(cid:21)(cid:12)(cid:15)(cid:3)(cid:43)(cid:21)(cid:22)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:24)(cid:16)(cid:25)(cid:12)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:20)(cid:16)(cid:21)(cid:12)(cid:15)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:20)(cid:16)(cid:21)(cid:12)(cid:15)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:22)(cid:16)(cid:23)(cid:12)(cid:15)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:11)(cid:24)(cid:16)(cid:25)(cid:12)
(cid:54)(cid:87)(cid:71)(cid:17)
(cid:36)(cid:85)(cid:87)
(cid:46)(cid:79)(cid:68)(cid:86)(cid:86)(cid:72)
(cid:41)(cid:68)(cid:70)(cid:75) (cid:53)(cid:68)(cid:88)(cid:80)
(cid:11)(cid:41)(cid:68)(cid:70)(cid:75)(cid:12)
(cid:11)(cid:53)(cid:68)(cid:88)(cid:80)(cid:12)
(cid:57)(cid:72)(cid:85)(cid:87)(cid:85)(cid:72)(cid:87) (cid:43)(cid:76)(cid:81)(cid:90)(cid:72)(cid:76)(cid:86)(cid:72)(cid:3)(cid:4)
(cid:57)(cid:72)(cid:85)(cid:87)(cid:85)(cid:17)
(cid:57)(cid:72)(cid:85)(cid:87)(cid:85)(cid:17)
(cid:57)(cid:85)
(cid:57)(cid:85)
(cid:36)(cid:21)(cid:24)
(cid:36)(cid:21)(cid:24)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:24)(cid:40)
(cid:54)(cid:51)
(cid:55)(cid:43)(cid:36)(cid:15)(cid:3)(cid:40)(cid:20)(cid:19)(cid:24) (cid:54)(cid:51)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:25)(cid:37)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:25)(cid:37)
(cid:40)(cid:46)
(cid:40)(cid:46)
(cid:40)(cid:20)(cid:19)(cid:20)
(cid:40)(cid:20)(cid:19)(cid:20)
(cid:20)(cid:16)(cid:21)
(cid:22)(cid:16)(cid:23)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:24)(cid:16)(cid:25)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:22)(cid:3)(cid:16)(cid:3)(cid:23)
(cid:69)(cid:72)(cid:86)(cid:17)
(cid:19)(cid:25)(cid:41)
(cid:19)(cid:25)(cid:41)
(cid:19)(cid:25)(cid:41)
(cid:19)(cid:26)(cid:36)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)
(cid:40)(cid:49) (cid:40)(cid:20)(cid:19)(cid:26)
(cid:20)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:26)(cid:37)
(cid:54)(cid:51)
(cid:55)(cid:43)(cid:54)(cid:21)(cid:15)(cid:3)
(cid:57)(cid:85)
(cid:57)(cid:85)
(cid:40)(cid:46)
(cid:40)(cid:46)
(cid:40)(cid:49)
(cid:54)(cid:51)
(cid:39)(cid:40)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:26)(cid:40)
(cid:39)(cid:40) (cid:49)(cid:20)(cid:20)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:27)(cid:39)(cid:41)
(cid:40)(cid:46)(cid:16) (cid:40)(cid:21)(cid:19)(cid:28)(cid:15)(cid:3)
(cid:40)(cid:46)(cid:16)(cid:69)(cid:76)(cid:79)(cid:76)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:57)(cid:72)(cid:85)(cid:68)(cid:81)(cid:86)(cid:87)(cid:17)
(cid:19)(cid:28)(cid:39)
(cid:19)(cid:28)(cid:39)
(cid:19)(cid:28)(cid:39)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:28)(cid:40)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:19)(cid:28)(cid:40)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:41)(cid:21)
(cid:41)(cid:21)
(cid:36)(cid:19)(cid:24)
(cid:36)(cid:19)(cid:24)
(cid:41)(cid:21)
(cid:41)(cid:21)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:20)(cid:19)(cid:36)(cid:37)(cid:38)(cid:39)(cid:40)(cid:41) (cid:44)(cid:49)(cid:16) (cid:36)(cid:22)(cid:28)(cid:15)(cid:3)(cid:36)(cid:22)(cid:27) (cid:44)(cid:49)(cid:16)(cid:58)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:20)(cid:19)(cid:36)(cid:37)(cid:38)(cid:39)(cid:40)(cid:41) (cid:49)(cid:36) (cid:49)(cid:20)(cid:24)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:20)(cid:19)(cid:36)(cid:37)(cid:38)(cid:39)(cid:40)(cid:41) (cid:40)(cid:54)(cid:16) (cid:36)(cid:22)(cid:22)(cid:15)(cid:3)(cid:36)(cid:22)(cid:21) (cid:40)(cid:54)(cid:16)(cid:58)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:20)(cid:19)(cid:36)(cid:37)(cid:38)(cid:39)(cid:40)(cid:41) (cid:44)(cid:49)(cid:16) (cid:36)(cid:22)(cid:28)(cid:15)(cid:3)(cid:36)(cid:22)(cid:27) (cid:44)(cid:49)(cid:16)(cid:58)
(cid:36)(cid:22)(cid:28)
(cid:49)(cid:36)(cid:58)(cid:44)(cid:16)(cid:58) (cid:49)(cid:21)(cid:24)
(cid:36)(cid:22)(cid:22)
(cid:36)(cid:22)(cid:28)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:16)(cid:57)(cid:87)(cid:85)(cid:17) (cid:40)
(cid:40)(cid:49)(cid:16) (cid:36)(cid:22)(cid:20)
(cid:40)(cid:49)(cid:16)(cid:57)(cid:47)(cid:46)(cid:21) (cid:36)(cid:22)(cid:21)
(cid:20)
(cid:21)
(cid:20)
(cid:22)
(cid:23)
(cid:24)(cid:3)(cid:16)(cid:3)(cid:25)
(cid:27)(cid:3)(cid:16)(cid:3)(cid:28)
(cid:20)(cid:16)(cid:21)
(cid:22)(cid:16)(cid:23)
(cid:24)(cid:16)(cid:25)
(cid:22)
(cid:23)
(cid:22)
(cid:22)(cid:3)(cid:16)(cid:3)(cid:23)
(cid:22)(cid:3)(cid:16)(cid:3)(cid:23)
(cid:23)
(cid:22)(cid:3)(cid:16)(cid:3)(cid:23)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)(cid:36)(cid:20)(cid:28) (cid:42)(cid:50)(cid:47)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)(cid:36)(cid:20)(cid:27) (cid:57)(cid:54)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:15)(cid:3)(cid:36)(cid:20)(cid:27) (cid:42)(cid:50)
(cid:39)(cid:72)(cid:88)(cid:87)(cid:86)(cid:70)(cid:75)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:48)(cid:68)(cid:87)(cid:75)(cid:72)(cid:80)(cid:68)(cid:87)(cid:76)(cid:78)(cid:3)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:48)(cid:88)(cid:86)(cid:76)(cid:78)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:55)(cid:72)(cid:86)(cid:87)(cid:88)(cid:81)(cid:74)(cid:3)(cid:76)(cid:81)(cid:3)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:3)(cid:40)(cid:20)(cid:19)(cid:24)
(cid:55)(cid:72)(cid:86)(cid:87)(cid:88)(cid:81)(cid:74)(cid:3)(cid:76)(cid:81)(cid:3)
(cid:53)(cid:68)(cid:88)(cid:80)(cid:3)(cid:40)(cid:20)(cid:19)(cid:27)
(cid:37)(cid:76)(cid:79)(cid:76)(cid:3)(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:39)(cid:72)(cid:88)(cid:87)(cid:86)(cid:70)(cid:75)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)(cid:3)(cid:40)(cid:81)(cid:74)(cid:79)(cid:76)(cid:86)(cid:70)(cid:75)
(cid:36)(cid:21)(cid:24)
(cid:36)(cid:21)(cid:24)
(cid:55)(cid:43)(cid:36)
(cid:40)(cid:21)(cid:19)(cid:21)
(cid:40)(cid:21)(cid:19)(cid:21)
(cid:40)(cid:20)(cid:19)(cid:26)
(cid:55)(cid:43)(cid:54)(cid:21)
(cid:40)(cid:21)(cid:19)(cid:27)
(cid:40)(cid:21)(cid:19)(cid:28)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:50)(cid:81)(cid:79)(cid:76)(cid:81)(cid:72)
(cid:36)(cid:22)(cid:27)
(cid:36)(cid:22)(cid:27)
(cid:54)(cid:39)(cid:47)
(cid:54)(cid:39)(cid:47)
(cid:53)(cid:40)(cid:44)
(cid:38)(cid:60)
(cid:38)(cid:60)
(cid:58)(cid:37)(cid:43)
(cid:41)(cid:43)
(cid:58)(cid:56)
(cid:48)(cid:50)
(cid:36)(cid:47)(cid:37)
(cid:47)(cid:54)(cid:55)
(cid:48)(cid:60)
(cid:48)(cid:60)
(cid:55)(cid:43)(cid:56)
(cid:54)(cid:53)(cid:54)
(cid:37)(cid:36)(cid:36)
(cid:55)(cid:43)(cid:56)
(cid:54)(cid:55)(cid:56)
(cid:21)(cid:17)(cid:3)(cid:43)(cid:45)(cid:16)(cid:51)(cid:25)(cid:3)(cid:3)(cid:3)(cid:21)(cid:27)(cid:17)(cid:25)(cid:17)(cid:21)(cid:19)(cid:21)(cid:20)(cid:3)(cid:37)(cid:3)(cid:11)(cid:21)(cid:25)(cid:12)(cid:3)(cid:3)(cid:3)(cid:36)(cid:88)(cid:74)(cid:88)(cid:86)(cid:87)(cid:76)(cid:81)(cid:72)(cid:85)(cid:86)(cid:70)(cid:75)(cid:88)(cid:79)(cid:72)(cid:3)(cid:41)(cid:85)(cid:76)(cid:72)(cid:71)(cid:69)(cid:72)(cid:85)(cid:74)(cid:3)(cid:3)(cid:3)(cid:39)(cid:37)(cid:97)(cid:24)(cid:20)(cid:26)(cid:23)(cid:97)(cid:21)(cid:19)(cid:21)(cid:19)(cid:16)(cid:21)(cid:19)(cid:21)(cid:20)(cid:97)(cid:21)
(cid:54)(cid:72)(cid:76)(cid:87)(cid:72)(cid:3)(cid:3)(cid:3)(cid:20)(cid:3)(cid:18)(cid:3)(cid:20)
Update: Code:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
lang = {
3: " ",
4: "!",
11: "(",
12: ")",
97: "~",
108: "ä",
129: "ü",
}
ind = 68
for cha in "abcdefghijklmnopqrstuvwxyz":
lang[ind] = cha
ind += 1
ind = 36
for cha in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
lang[ind] = cha
ind += 1
ind = 3
for cha in " !\"#$%&'()*+,-./0123456789:":
lang[ind] = cha
ind += 1
def to_acctual_characters(text: str):
ret = ""
for number in text.replace("(cid:", ";").replace(")", "")[1:].split(";"):
if int(number.replace("\n", "")) in lang:
ret = ret + lang[int(number.replace("\n", ""))]
else:
ret = ret + "(cid:" + number.replace("\n", "") + ")"
if "\n" in number:
ret = ret + "\n"
return ret
for page_layout in extract_pages("vp.pdf"):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(to_acctual_characters(element.get_text()))
Now the output is finally readable, but this is just by translating every (cid:#) to the right character (made by experimenting) the translation key is partwise similar to some font-examples i found, but at some points not identical. I don't know much about character encodings and through search I couldn't find any, that would match the number in the (cid:#) directly to the right characters since for example A is in any encodings I found bound to 41 and in this case, it's 36.
here's another document that has the same situation. the offset for most (but not all) of the character IDs are (i think) 29 (U
is mapped to 8
, or (cid:56)
).
uploaded here too in case uscourts.gov
drops the file: Cleaned-Application 7-9-21 redacted.pdf
Note that this file doesn't appear to be "fixed" by mutool
or gs
in the way that #368 suggested might work for other files. However, https://smallpdf.com/ (which uses solid framework's pdf reading tools iiuc) does seem to be able to extract the correct values when converting to an MS Word doc, so it doesn't seem to be impossible to do. Maybe they have some clever heuristics?
This one also produces a lot of cids. I couldn't figure out if there's any offset, but smallpdf and other web services can handle it.
The font types are
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
CIPOHP+AdvPS6F00 Type 1C Custom yes yes no 161 0
CIPOJB+AdvPS6F0B Type 1C Custom yes yes no 159 0
CIPOLC+AdvPS6F01 Type 1C Custom yes yes no 174 0
CIPOLE+AdvPS836F Type 1C Custom yes yes no 172 0
CIPOLG+AdvMathSymb Type 1C Custom yes yes no 185 0
CIPOMI+AdvGreekM Type 1C Custom yes yes no 182 0
CIPOPI+AdvPS586D Type 1C Custom yes yes no 191 0
CJACLE+AdvPS7DA6 Type 1C Custom yes yes no 198 0
CJAEED+AdvMathExtr Type 1C Custom yes yes no 80 0
CJDBLP+AdvPS48994E Type 1C Custom yes yes no 81 0
CJDBPD+AdvPS7DB7 Type 1C Custom yes yes no 82 0
CJLKLB+AdvPS3F926E Type 1C Custom yes yes no 83 0
Here is another way to deal with cids inspired by @CodeSpoof but using regex.
def default_cid_map() -> Dict[int, str]:
cid_map = {
34: "?",
97: "~",
108: "ä",
129: "ü",
180: '"',
181: '"',
183: "'",
}
for i, char in enumerate("abcdefghijklmnopqrstuvwxyz"):
cid_map[68 + i] = char
for i, char in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
cid_map[36 + i] = char
for i, char in enumerate(" !\"#$%&'()*+,-./0123456789:"):
cid_map[3 + i] = char
return cid_map
def remove_cids(text: str) -> str:
return re.sub(r"\(cid:\d+\)", "", text)
def replace_cids(text: str, cid_map: Dict[int, str]) -> str:
def _replace_cid(m: re.Match) -> str:
cid = int(m.group(1))
if cid in cid_map:
return cid_map[cid]
return m.group()
return re.sub(r"\(cid:(\d+)\)", _replace_cid, text)
@CodeSpoof can you try with my fork?
just do pip install git+https://github.com/krishnasism/pdfminer.six.git@master#egg=pdfminer-six
you can verify the last 2 commits. We are actively working on this to fix some of our own files.
If it looks fine, we could research a bit more here and try to open a pr to this repo