natural-pdf 0.1.7__py3-none-any.whl → 0.1.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- natural_pdf/__init__.py +3 -0
- natural_pdf/analyzers/layout/base.py +1 -5
- natural_pdf/analyzers/layout/gemini.py +61 -51
- natural_pdf/analyzers/layout/layout_analyzer.py +40 -11
- natural_pdf/analyzers/layout/layout_manager.py +26 -84
- natural_pdf/analyzers/layout/layout_options.py +7 -0
- natural_pdf/analyzers/layout/pdfplumber_table_finder.py +142 -0
- natural_pdf/analyzers/layout/surya.py +46 -123
- natural_pdf/analyzers/layout/tatr.py +51 -4
- natural_pdf/analyzers/text_structure.py +3 -5
- natural_pdf/analyzers/utils.py +3 -3
- natural_pdf/classification/manager.py +422 -0
- natural_pdf/classification/mixin.py +163 -0
- natural_pdf/classification/results.py +80 -0
- natural_pdf/collections/mixins.py +111 -0
- natural_pdf/collections/pdf_collection.py +434 -15
- natural_pdf/core/element_manager.py +83 -0
- natural_pdf/core/highlighting_service.py +13 -22
- natural_pdf/core/page.py +578 -93
- natural_pdf/core/pdf.py +912 -460
- natural_pdf/elements/base.py +134 -40
- natural_pdf/elements/collections.py +712 -109
- natural_pdf/elements/region.py +722 -69
- natural_pdf/elements/text.py +4 -1
- natural_pdf/export/mixin.py +137 -0
- natural_pdf/exporters/base.py +3 -3
- natural_pdf/exporters/paddleocr.py +5 -4
- natural_pdf/extraction/manager.py +135 -0
- natural_pdf/extraction/mixin.py +279 -0
- natural_pdf/extraction/result.py +23 -0
- natural_pdf/ocr/__init__.py +5 -5
- natural_pdf/ocr/engine_doctr.py +346 -0
- natural_pdf/ocr/engine_easyocr.py +6 -3
- natural_pdf/ocr/ocr_factory.py +24 -4
- natural_pdf/ocr/ocr_manager.py +122 -26
- natural_pdf/ocr/ocr_options.py +94 -11
- natural_pdf/ocr/utils.py +19 -6
- natural_pdf/qa/document_qa.py +0 -4
- natural_pdf/search/__init__.py +20 -34
- natural_pdf/search/haystack_search_service.py +309 -265
- natural_pdf/search/haystack_utils.py +99 -75
- natural_pdf/search/search_service_protocol.py +11 -12
- natural_pdf/selectors/parser.py +431 -230
- natural_pdf/utils/debug.py +3 -3
- natural_pdf/utils/identifiers.py +1 -1
- natural_pdf/utils/locks.py +8 -0
- natural_pdf/utils/packaging.py +8 -6
- natural_pdf/utils/text_extraction.py +60 -1
- natural_pdf/utils/tqdm_utils.py +51 -0
- natural_pdf/utils/visualization.py +18 -0
- natural_pdf/widgets/viewer.py +4 -25
- {natural_pdf-0.1.7.dist-info → natural_pdf-0.1.9.dist-info}/METADATA +17 -3
- natural_pdf-0.1.9.dist-info/RECORD +80 -0
- {natural_pdf-0.1.7.dist-info → natural_pdf-0.1.9.dist-info}/WHEEL +1 -1
- {natural_pdf-0.1.7.dist-info → natural_pdf-0.1.9.dist-info}/top_level.txt +0 -2
- docs/api/index.md +0 -386
- docs/assets/favicon.png +0 -3
- docs/assets/favicon.svg +0 -3
- docs/assets/javascripts/custom.js +0 -17
- docs/assets/logo.svg +0 -3
- docs/assets/sample-screen.png +0 -0
- docs/assets/social-preview.png +0 -17
- docs/assets/social-preview.svg +0 -17
- docs/assets/stylesheets/custom.css +0 -65
- docs/document-qa/index.ipynb +0 -435
- docs/document-qa/index.md +0 -79
- docs/element-selection/index.ipynb +0 -915
- docs/element-selection/index.md +0 -229
- docs/finetuning/index.md +0 -176
- docs/index.md +0 -170
- docs/installation/index.md +0 -69
- docs/interactive-widget/index.ipynb +0 -962
- docs/interactive-widget/index.md +0 -12
- docs/layout-analysis/index.ipynb +0 -818
- docs/layout-analysis/index.md +0 -185
- docs/ocr/index.md +0 -209
- docs/pdf-navigation/index.ipynb +0 -314
- docs/pdf-navigation/index.md +0 -97
- docs/regions/index.ipynb +0 -816
- docs/regions/index.md +0 -294
- docs/tables/index.ipynb +0 -658
- docs/tables/index.md +0 -144
- docs/text-analysis/index.ipynb +0 -370
- docs/text-analysis/index.md +0 -105
- docs/text-extraction/index.ipynb +0 -1478
- docs/text-extraction/index.md +0 -292
- docs/tutorials/01-loading-and-extraction.ipynb +0 -194
- docs/tutorials/01-loading-and-extraction.md +0 -95
- docs/tutorials/02-finding-elements.ipynb +0 -340
- docs/tutorials/02-finding-elements.md +0 -149
- docs/tutorials/03-extracting-blocks.ipynb +0 -147
- docs/tutorials/03-extracting-blocks.md +0 -48
- docs/tutorials/04-table-extraction.ipynb +0 -114
- docs/tutorials/04-table-extraction.md +0 -50
- docs/tutorials/05-excluding-content.ipynb +0 -270
- docs/tutorials/05-excluding-content.md +0 -109
- docs/tutorials/06-document-qa.ipynb +0 -332
- docs/tutorials/06-document-qa.md +0 -91
- docs/tutorials/07-layout-analysis.ipynb +0 -288
- docs/tutorials/07-layout-analysis.md +0 -66
- docs/tutorials/07-working-with-regions.ipynb +0 -413
- docs/tutorials/07-working-with-regions.md +0 -151
- docs/tutorials/08-spatial-navigation.ipynb +0 -508
- docs/tutorials/08-spatial-navigation.md +0 -190
- docs/tutorials/09-section-extraction.ipynb +0 -2434
- docs/tutorials/09-section-extraction.md +0 -256
- docs/tutorials/10-form-field-extraction.ipynb +0 -512
- docs/tutorials/10-form-field-extraction.md +0 -201
- docs/tutorials/11-enhanced-table-processing.ipynb +0 -54
- docs/tutorials/11-enhanced-table-processing.md +0 -9
- docs/tutorials/12-ocr-integration.ipynb +0 -604
- docs/tutorials/12-ocr-integration.md +0 -175
- docs/tutorials/13-semantic-search.ipynb +0 -1328
- docs/tutorials/13-semantic-search.md +0 -77
- docs/visual-debugging/index.ipynb +0 -2970
- docs/visual-debugging/index.md +0 -157
- docs/visual-debugging/region.png +0 -0
- natural_pdf/templates/finetune/fine_tune_paddleocr.md +0 -415
- natural_pdf/templates/spa/css/style.css +0 -334
- natural_pdf/templates/spa/index.html +0 -31
- natural_pdf/templates/spa/js/app.js +0 -472
- natural_pdf/templates/spa/words.txt +0 -235976
- natural_pdf/widgets/frontend/viewer.js +0 -88
- natural_pdf-0.1.7.dist-info/RECORD +0 -145
- notebooks/Examples.ipynb +0 -1293
- pdfs/.gitkeep +0 -0
- pdfs/01-practice.pdf +0 -543
- pdfs/0500000US42001.pdf +0 -0
- pdfs/0500000US42007.pdf +0 -0
- pdfs/2014 Statistics.pdf +0 -0
- pdfs/2019 Statistics.pdf +0 -0
- pdfs/Atlanta_Public_Schools_GA_sample.pdf +0 -0
- pdfs/needs-ocr.pdf +0 -0
- {natural_pdf-0.1.7.dist-info → natural_pdf-0.1.9.dist-info}/licenses/LICENSE +0 -0
docs/text-analysis/index.md
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
# Text Analysis
|
2
|
-
|
3
|
-
Analyzing the properties of text elements, such as their font, size, style, and color, can be crucial for understanding document structure and extracting specific information. Natural PDF provides tools to access and analyze these properties.
|
4
|
-
|
5
|
-
## Introduction
|
6
|
-
|
7
|
-
Beyond just the sequence of characters, the *style* of text carries significant meaning. Headings are often larger and bolder, important terms might be italicized, and different sections might use distinct fonts. This page covers how to access and utilize this stylistic information.
|
8
|
-
|
9
|
-
## Accessing Font Information
|
10
|
-
|
11
|
-
Every `TextElement` (representing characters or words) holds information about its font properties.
|
12
|
-
|
13
|
-
```python
|
14
|
-
from natural_pdf import PDF
|
15
|
-
|
16
|
-
# Load the PDF
|
17
|
-
pdf = PDF("https://github.com/jsoma/natural-pdf/raw/refs/heads/main/pdfs/01-practice.pdf")
|
18
|
-
|
19
|
-
# Select the first page
|
20
|
-
page = pdf.pages[0]
|
21
|
-
```
|
22
|
-
|
23
|
-
```python
|
24
|
-
# Find the first word element
|
25
|
-
word = page.find('word')
|
26
|
-
|
27
|
-
print(f"Text:", word.text)
|
28
|
-
print(f"Font Name:", word.fontname) # Font reference (e.g., F1) or name
|
29
|
-
print(f"Size:", word.size)
|
30
|
-
print(f"Color:", word.color) # Non-stroking color
|
31
|
-
print(f"Is Bold:", word.bold)
|
32
|
-
print(f"Is Italic:", word.italic)
|
33
|
-
```
|
34
|
-
|
35
|
-
- `fontname`: Often an internal reference (like 'F1', 'F2') or a basic name.
|
36
|
-
- `size`: Font size in points.
|
37
|
-
- `color`: The non-stroking color, typically a tuple representing RGB or Grayscale values (e.g., `(0.0, 0.0, 0.0)` for black).
|
38
|
-
- `bold`, `italic`: Boolean flags indicating if the font style is bold or italic (heuristically determined based on font name conventions).
|
39
|
-
|
40
|
-
## Working with Text Styles
|
41
|
-
|
42
|
-
You can directly select text based on its style using pseudo-classes in selectors:
|
43
|
-
|
44
|
-
```python
|
45
|
-
# Find all bold text elements
|
46
|
-
bold_text = page.find_all('text:bold')
|
47
|
-
|
48
|
-
# Find all italic text elements
|
49
|
-
italic_text = page.find_all('text:italic')
|
50
|
-
|
51
|
-
# Find text that is both bold and larger than 12pt
|
52
|
-
bold_headings = page.find_all('text:bold[size>=12]')
|
53
|
-
|
54
|
-
print(f"Found {len(bold_text)} bold elements.")
|
55
|
-
print(f"Found {len(italic_text)} italic elements.")
|
56
|
-
print(f"Found {len(bold_headings)} bold headings.")
|
57
|
-
```
|
58
|
-
|
59
|
-
## Analyzing Fonts on a Page
|
60
|
-
|
61
|
-
You can use `analyze_text_styles` to assign labels to text based on font sizes, bold/italic and font names.
|
62
|
-
|
63
|
-
```python
|
64
|
-
page.analyze_text_styles()
|
65
|
-
page.text_style_labels
|
66
|
-
```
|
67
|
-
|
68
|
-
One they're assigned, you can filter based on `style_label` instead of going bit-by-bit.
|
69
|
-
|
70
|
-
```python
|
71
|
-
page.find_all('text[style_label="10.0pt Bold Helvetica"]')
|
72
|
-
```
|
73
|
-
|
74
|
-
## Visualizing Text Properties
|
75
|
-
|
76
|
-
Use highlighting to visually inspect text properties. Grouping by attributes like `fontname` or `size` can be very insightful. In the example below we go right to grouping by the `style_label`, which combines font name, size and variant.
|
77
|
-
|
78
|
-
```python
|
79
|
-
page.find_all('text').highlight(group_by='style_label', replace=True).to_image(width=700)
|
80
|
-
```
|
81
|
-
|
82
|
-
This allows you to quickly see patterns in font usage across the page layout.
|
83
|
-
|
84
|
-
## Weird font names
|
85
|
-
|
86
|
-
Oftentimes font names aren't what you're used to – Arial, Helvetica, etc – the PDF has given them weird, weird names. Relax, it's okay, they're normal fonts.
|
87
|
-
|
88
|
-
```python
|
89
|
-
from natural_pdf import PDF
|
90
|
-
|
91
|
-
# Load the PDF
|
92
|
-
pdf = PDF("https://github.com/jsoma/natural-pdf/raw/refs/heads/main/pdfs/Atlanta_Public_Schools_GA_sample.pdf")
|
93
|
-
|
94
|
-
# Select the first page
|
95
|
-
page = pdf.pages[0]
|
96
|
-
page.to_image(width=700)
|
97
|
-
```
|
98
|
-
|
99
|
-
Look!
|
100
|
-
|
101
|
-
```python
|
102
|
-
page.find_all('text')[0].fontname
|
103
|
-
```
|
104
|
-
|
105
|
-
The part before the `+` is the variant – bold, italic, etc – while the part after it is the "real" font name.
|