From d3b334c10f12d86e8e75135a9acee36d331b2517 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Thu, 15 Nov 2018 16:22:53 -0800 Subject: [PATCH] Test case: true type font without Unicode mapping --- src/ocrmypdf/pdfinfo/__init__.py | 11 +++++++---- tests/resources/README.rst | 5 +++++ tests/resources/truetype_font_nomapping.pdf | Bin 0 -> 7742 bytes tests/test_pdfinfo.py | 10 ++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 tests/resources/truetype_font_nomapping.pdf diff --git a/src/ocrmypdf/pdfinfo/__init__.py b/src/ocrmypdf/pdfinfo/__init__.py index a084aa66..74d2f3a1 100644 --- a/src/ocrmypdf/pdfinfo/__init__.py +++ b/src/ocrmypdf/pdfinfo/__init__.py @@ -588,12 +588,12 @@ def _pdf_get_pageinfo(pdf, pageno: int, infile, xmltext): return pageinfo -def _pdf_get_all_pageinfo(infile, detailed_page_analysis, log=None): +def _pdf_get_all_pageinfo(infile, detailed_analysis=False, log=None): if not log: log = Mock() pdf = pikepdf.open(infile) - if detailed_page_analysis: + if detailed_analysis: pages_xml = None else: pages_xml = ghosttext.extract_text_xml(infile, pdf, pageno=None, log=log) @@ -601,17 +601,18 @@ def _pdf_get_all_pageinfo(infile, detailed_page_analysis, log=None): pages = [] for n in range(len(pdf.pages)): page_xml = pages_xml[n] if pages_xml else None - page = PageInfo(pdf, n, infile, page_xml) + page = PageInfo(pdf, n, infile, page_xml, detailed_analysis) pages.append(page) return pages, pdf class PageInfo: - def __init__(self, pdf, pageno, infile, xmltext): + def __init__(self, pdf, pageno, infile, xmltext, detailed_analysis=False): self._pageno = pageno self._infile = infile self._pageinfo = _pdf_get_pageinfo(pdf, pageno, infile, xmltext) + self._detailed_analysis = detailed_analysis @property def pageno(self): @@ -623,6 +624,8 @@ class PageInfo: @property def has_corrupt_text(self): + if not self._detailed_analysis: + raise NotImplementedError('Did not do detailed analysis') return any(tbox.is_corrupt for tbox in self._pageinfo['textboxes']) @property diff --git a/tests/resources/README.rst b/tests/resources/README.rst index dc64622d..0f95e881 100644 --- a/tests/resources/README.rst +++ b/tests/resources/README.rst @@ -139,6 +139,11 @@ licensed under the specified license. - @jbarlow83 - @jbarlow83 - CC-BY-SA 4.0 + * - truetype_font_nomapping.pdf + - example of a PDF with an embedded subsetted TrueType font with no Unicode mapping + - @jbarlow83 + - @jbarlow83 + - CC-BY-SA 4.0 * - trivial.pdf - smallest possible valid PDF-1.3 with all required fields - @jbarlow83 diff --git a/tests/resources/truetype_font_nomapping.pdf b/tests/resources/truetype_font_nomapping.pdf new file mode 100644 index 0000000000000000000000000000000000000000..506e653ca37a22fa8df1cbafb6c79815b9f956c5 GIT binary patch literal 7742 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