阅读文本 / Reading text
This paper uses synthetic samples to demonstrate the processing method. The code has been verified using examples in an isolated environment; this does not guarantee effectiveness for all real files or products. Before processing important files, please retain the original copies and verify them against the boundaries and acceptance criteria specified in the text.
Which problem does this paper address first?
Short or empty text is merely a signal for further verification and should not be directly equated with a scanned document. Below, we record page by page whether text has been extracted; blank pages, image-only pages, and pages with encoding anomalies require distinct follow-up assessments. PyPDF’s text extraction is not OCR.
self-contained synthetic example
dependencies are listed in the import section. The code constructs inputs in memory; runtime logs are provided separately and do not constitute a guarantee for all real-world files.
from io import BytesIO
import pymupdf
from pypdf import PdfReader
with pymupdf.open() as doc:
page = doc.new_page()
page.insert_text((50, 50), "Hi")
doc.new_page()
raw = doc.tobytes()
reader = PdfReader(BytesIO(raw))
records = []
for index, page in enumerate(reader.pages):
text = page.extract_text() or ""
records.append({"page": index + 1, "text": text,
"status": "text_present" if text.strip() else "review_empty_text"})
assert len(records) == 2
assert records[0]["status"] == "text_present"
assert records[0]["text"].strip() == "Hi"
assert records[1]["status"] == "review_empty_text"
When you use
pypdf
's
extract_text()
When processing a PDF containing visually legible text but obtaining only blank strings or sporadic gibberish, the first instinct is often to check the parameter settings: whether something has been overlooked.
extraction_mode="layout"
? Is it necessary to specify a rotation angle? However, in the vast majority of engineering practices, this is not a problem that can be solved through parameter tuning; rather, it stems from an inappropriate choice of tools. pypdf is essentially a parser for PDF Content Streams, reading the text object instructions embedded in the file. If the PDF is fundamentally an image (a scanned document), no matter how the extraction mode is adjusted, it cannot arbitrarily decode character encodings that do not exist.
Technical distinctions between text parsing and image recognition
Understanding this issue hinges on recognizing the original design intent of the PDF format. PDF was created for precise printing and visual presentation, not for structured data storage. Native digital PDFs contain font resources, encoding mapping tables, and absolutely positioned text-rendering instructions; pypdf reconstructs text by parsing these low-level instructions. The advantage of this mechanism lies in its determinism: it avoids confusing visually similar characters (such as
0
and
O
), can perfectly preserve special symbols and ligatures, and is unaffected by image noise.
In contrast, a scanned PDF is merely a container for images. The text that is visually visible exists in the file structure only as a pixel grid and does not constitute an entity that can be processed by
extract_text()
is the text object being read. Even if some scanned documents have been processed by OCR software and embedded with a hidden text layer (i.e., “double-layer PDFs”), pypdf can only extract the content of that layer. If the original OCR quality is poor, the text layer is missing, the encoding is corrupted, or it is severely misaligned with the image, the extraction results will be incomplete or even entirely empty. In such cases, further tuning of pypdf parameters is pointless; one must switch to an optical character recognition (OCR) workflow. The decision should not rely on visual inspection of whether the page contains text, but rather on programmatic detection of the actual presence and validity of the text layer.
synthesis example: Constructing a verifiable detection baseline
To demonstrate how to programmatically distinguish the aforementioned cases, we need to construct a standardized set of synthetic inputs for testing. Please note that the following code is intended solely as a logical demonstration and must be run in an environment where dependencies have been properly locked; it does not constitute an empirical report on specific production files. Readers should prepare test data according to the method outlined below:
Normal number PDF
: Use Word or LaTeX to export a document containing the text "Invoice #2024-001".
Pure-scanning PDF
: After scanning any paper document into JPEG, use a tool to encapsulate it into a single-page PDF, ensuring that no text layers are present.
boundary case sample
: Create a “pseudo-OCR” PDF containing a hidden text layer but with an empty string or all whitespace characters as its content, simulating a double-layered document that fails recognition.
text-layer usability testing code implementation
The following Python example demonstrates how to construct robust detection logic in memory. The code relies on
pypdf>=3.0.0
, please install the corresponding version in an isolated virtual environment. This script does not include actual file paths; readers must provide the aforementioned synthetic test files to replace the placeholder paths.
Acceptance Decision and Manual Review Boundary Table
code demonstration only addresses the binary judgment of “presence or absence of a text layer”; end-to-end performance must also account for additional real-world factors. The table below lists common observed phenomena and corresponding handling decisions, clearly defining the scope of applicability for automated workflows and the points at which human intervention is required:
specifically emphasizes: When a document contains both an optional text layer and an image layer, the integrity of the text layer cannot be taken at face value. Some scanners generate “dual-layer PDFs” in which the text layer covers only part of the content, or whose coordinate system is severely misaligned with the image. Such cases must be routed to manual review or undergo secondary verification via visual comparison algorithms. Automated processing can help triage, but it cannot guarantee semantic accuracy.
References and Next Steps
pypdf official text extraction documentation:
Extract Text from a PDF
pypdf Explanation of the difference between OCR and text extraction: As in the "OCR vs. Text Extraction" section of the same document
The decision on handling the specific exception
observation
What should be done
should not infer
short text
still retains the text
is not forced to perform OCR if it falls below the threshold
empty text
checks the page layout and content type
is not directly classified as a scanned document
parsing failed
records the exception phase
does not masquerade as a blank page
uses this checklist for document translation
file splitting, encryption, or attachment processing are part of delivery preparation; translation cannot replace these checks. Retain the original documents and the processing checklist, then reassess the translated manuscript’s page order, hyperlinks, and content integrity.
OmniDoc (Product Entry)
provides an entry point for translating multi-format documents, and the official website highlights its OCR, terminology database, and bilingual alignment features. For teams that wish to start processing directly from files, this is a path worth evaluating with real-world samples. Please use de-identified files that you are authorized to upload, and verify the results against the checklist provided in this document; we do not claim that OmniDoc utilizes the open-source libraries or internal algorithms referenced herein, nor do we substitute examples for formal product performance testing.
- 1 -
Updated 2026-10-09