Treat invalid/unparseable metadata values as warnings

Certain invalid values if parseable don't throw a warning and only unparseable (always invalid) throw
This commit is contained in:
Samkit Jain
2020-11-26 21:58:49 +05:30
parent d3b84da33c
commit 9f0a1ad7cd
3 changed files with 26 additions and 10 deletions
+18 -10
View File
@@ -2,6 +2,7 @@ from .container import Container
from .page import Page
from .utils import decode_text
import logging
import pathlib
import itertools
from pdfminer.pdfparser import PDFParser
@@ -12,6 +13,8 @@ from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
from pdfminer.psparser import PSLiteral
logger = logging.getLogger(__name__)
class PDF(Container):
cached_properties = Container.cached_properties + ["_pages"]
@@ -27,16 +30,21 @@ class PDF(Container):
for info in self.doc.info:
self.metadata.update(info)
for k, v in self.metadata.items():
if hasattr(v, "resolve"):
v = v.resolve()
if type(v) == list:
self.metadata[k] = list(map(decode_text, v))
elif isinstance(v, PSLiteral):
self.metadata[k] = decode_text(v.name)
elif isinstance(v, (str, bytes)):
self.metadata[k] = decode_text(v)
else:
self.metadata[k] = v
try:
if hasattr(v, "resolve"):
v = v.resolve()
if type(v) == list:
self.metadata[k] = list(map(decode_text, v))
elif isinstance(v, PSLiteral):
self.metadata[k] = decode_text(v.name)
elif isinstance(v, (str, bytes)):
self.metadata[k] = decode_text(v)
else:
self.metadata[k] = v
except Exception as e:
# This metadata value could not be parsed. Instead of failing the PDF read,
# treat it as a warning.
logger.warning(f'[WARNING] Metadata key "{k}" could not be parsed due to exception: {str(e)}')
self.device = PDFPageAggregator(rsrcmgr, laparams=self.laparams)
self.interpreter = PDFPageInterpreter(rsrcmgr, self.device)
Binary file not shown.
+8
View File
@@ -168,3 +168,11 @@ class Test(unittest.TestCase):
path = os.path.join(HERE, "pdfs/issue-297-example.pdf")
with pdfplumber.open(path) as pdf:
assert isinstance(pdf.metadata["Copies"], int)
def test_issue_316(self):
"""
Handle invalid metadata
"""
path = os.path.join(HERE, "pdfs/issue-316-example.pdf")
with pdfplumber.open(path) as pdf:
assert pdf.metadata