Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ Next release
``licensedcode-data``.
https://github.com/aboutcode-org/scancode-toolkit/pull/5056

- Fix a regression in PDF text extraction that silently stopped after the
first page, so copyright/license detection missed text on later pages.
https://github.com/aboutcode-org/scancode-toolkit/pull/5260

v33.0.0rc1 - 2026-05-14
------------------------

Expand Down
4 changes: 2 additions & 2 deletions src/textcode/pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,5 @@ def get_text_lines(location, max_pages=5):
interpreter.process_page(page)
if max_pages and page_num == max_pages:
break
extracted_text.seek(0)
return extracted_text.readlines()
extracted_text.seek(0)
return extracted_text.readlines()
Comment on lines 43 to +47
Binary file added tests/textcode/data/pdf/multi_page.pdf
Binary file not shown.
27 changes: 27 additions & 0 deletions tests/textcode/test_pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,33 @@ def get_text(location):

assert result == expected

def test_get_text_lines_extracts_all_pages_up_to_max_pages(self):
# regression test: text extraction must not stop after the first page
test_file = self.get_test_loc('pdf/multi_page.pdf')
result = pdf.get_text_lines(test_file)
text = b''.join(result)
assert b'This is page 1 of a multi-page test document.' in text
assert b'This notice is on page 2.' in text
assert b'The last page 5 of this test document.' in text
# the default max_pages=5 must still be honored
assert b'Page 6' not in text

def test_get_text_lines_returns_lines_when_max_pages_is_one(self):
# regression test: reaching max_pages must not return None
test_file = self.get_test_loc('pdf/multi_page.pdf')
result = pdf.get_text_lines(test_file, max_pages=1)
assert result
text = b''.join(result)
assert b'This is page 1 of a multi-page test document.' in text
assert b'page 2' not in text

def test_get_text_lines_extracts_all_pages_when_max_pages_is_zero(self):
test_file = self.get_test_loc('pdf/multi_page.pdf')
result = pdf.get_text_lines(test_file, max_pages=0)
text = b''.join(result)
assert b'Page 6 is beyond the default max_pages limit.' in text
assert b'Page 7 is also beyond the default max_pages limit.' in text

def test_pdfminer_can_parse_faulty_broadcom_doc(self):
# test for https://github.com/euske/pdfminer/issues/118
test_file = self.get_test_loc('pdf/pdfminer_bug_118/faulty.pdf')
Expand Down
Loading