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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