mirror of
https://github.com/jsvine/pdfplumber.git
synced 2026-08-29 08:34:23 +08:00
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:
+18
-10
@@ -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.
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user