diff --git a/pdfplumber/pdf.py b/pdfplumber/pdf.py index 3d7edae..e225303 100644 --- a/pdfplumber/pdf.py +++ b/pdfplumber/pdf.py @@ -1,5 +1,6 @@ from pdfplumber.container import Container from pdfplumber.page import Page +from pdfplumber.utils import decode_text from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument @@ -22,6 +23,10 @@ class PDF(Container): self.metadata = {} for info in self.doc.info: self.metadata.update(info) + for k, v in self.metadata.items(): + if hasattr(v, "resolve"): + v = v.resolve() + self.metadata[k] = decode_text(v) self.device = PDFPageAggregator(rsrcmgr, laparams=self.laparams) self.interpreter = PDFPageInterpreter(rsrcmgr, self.device) atexit.register(self.close) diff --git a/pdfplumber/utils.py b/pdfplumber/utils.py index 4d3263c..a056af9 100644 --- a/pdfplumber/utils.py +++ b/pdfplumber/utils.py @@ -1,6 +1,19 @@ from pdfplumber import helpers from operator import itemgetter import itertools +from pdfminer.utils import PDFDocEncoding +import six + +def decode_text(s): + """ + Decodes a PDFDocEncoding string to Unicode. + Adds py3 compatability to pdfminer's version. + """ + if s.startswith(b'\xfe\xff'): + return six.text_type(s[2:], 'utf-16be', 'ignore') + else: + ords = (ord(c) if type(c) == str else c for c in s) + return ''.join(PDFDocEncoding[o] for o in ords) def is_dataframe(collection): cls = collection.__class__