pdfminer.six icon indicating copy to clipboard operation
pdfminer.six copied to clipboard

getting lots of (cid:#) instead of readable text

Open CodeSpoof opened this issue 3 years ago • 6 comments

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)

CodeSpoof avatar Jun 28 '21 15:06 CodeSpoof

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.

CodeSpoof avatar Jun 28 '21 16:06 CodeSpoof

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

dkg avatar Jul 14 '21 20:07 dkg

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?

dkg avatar Jul 14 '21 20:07 dkg

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

thorge avatar Jul 23 '21 14:07 thorge

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)

duklin avatar Dec 26 '21 12:12 duklin

@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

krishnasism avatar Feb 22 '24 15:02 krishnasism