Inkwell
Quickstart on Colab
Overview
Inkwell is a modular Python library for extracting information from PDF documents documents with state of the art Vision Language Models. We make use of layout understanding models to improve accuracy of Vision Language models.
Inkwell uses the following models, with more integrations in the work
- Layout Detection: Faster RCNN, LayoutLMv3, Paddle
- Table Detection: Table Transformer
- Table Data Extraction: Phi3.5-Vision, Qwen2 VL 2B, Table Transformer, OpenAI GPT4o Mini
- OCR: Tesseract, PaddleOCR, Phi3.5-Vision, Qwen2 VL 2B
Installation
pip install py-inkwell[inference]
In addition, install detectron2
pip install git+https://github.com/facebookresearch/detectron2.git
Install Tesseract
For Ubuntu -
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
and, Mac OS
brew install tesseract
For GPUs, install flash attention and vllm for faster inference.
pip install flash-attn --no-build-isolation
pip install vllm
Basic Usage
Parse Pages
from inkwell.pipeline import Pipeline
pipeline = Pipeline()
document = pipeline.process("/path/to/file.pdf")
Extract Page Elements
pages = document.pages
Every Page has the following fragment objects -
- Figures
- Tables
- Text
Figures
Each figure fragment's content has the following attributes -
- bbox - The bounding box of the figure
- text - The text in the figure, extracted using OCR
- image - The cropped image of the figure
figures = page.figure_fragments()
for figure in figures:
figure_image = figure.content.image
figure_bbox = figure.content.bbox
figure_text = figure.content.text
Table
Each table fragment's content has the following attributes -
- data - The data in the table, extracted using Table Extractor
- bbox - The bounding box of the table
- image - The image of the table, extracted using OCR
tables = page.table_fragments()
for table in tables:
table_data = table.content.data
table_bbox = table.content.bbox
table_image = table.content.image
Text
Each text fragment's content has the following attributes -
- text - The text in the text block
- bbox - The bounding box of the text block
- image - The image of the text block
text_blocks = page.text_fragments()
for text_block in text_blocks:
text_block_text = text_block.content.text
text_block_bbox = text_block.content.bbox
text_block_image = text_block.content.image
Complete Example
We will take the following PDF and extract text, tables and images from this separtely.
from inkwell.pipeline import Pipeline
pipeline = Pipeline()
document = pipeline.process("/path/to/file.pdf")
pages = document.pages
for page in pages:
figures = page.figure_fragments()
tables = page.table_fragments()
text_blocks = page.text_fragments()
# Check the content of the image fragments
for figure in figures:
figure_image = figure.content.image
figure_text = figure.content.text
# Check the content of the table fragments
for table in tables:
table_image = table.content.image
table_data = table.content.data
# Check the content of the text blocks
for text_block in text_blocks:
text_block_image = text_block.content.image
text_block_text = text_block.content.text
Using Qwen2/Phi3.5/OpenAI Vision Models
We have defined a default config class here. You can add vision-language models to the config to use them instead of the default models.
from inkwell.pipeline import DefaultPipelineConfig, Pipeline
from inkwell.ocr import OCRType
from inkwell.table_extractor import TableExtractorType
# using Qwen2 2B Vision OCR anf Table Extractor
config = DefaultPipelineConfig(
ocr_detector=OCRType.QWEN2_2B_VISION,
table_extractor=TableExtractorType.QWEN2_2B_VISION
)
# using Phi3.5 Vision OCR and Table Extractor
config = DefaultPipelineConfig(
ocr_detector=OCRType.PHI3_VISION,
table_extractor=TableExtractorType.PHI3_VISION
)
# using OpenAI GPT4o Mini OCR and Table Extractor (Requires API Key)
config = DefaultPipelineConfig(
ocr_detector=OCRType.OPENAI_GPT4O_MINI,
table_extractor=TableExtractorType.OPENAI_GPT4O_MINI
)
pipeline = Pipeline(config=config)
Advanced Customizations
You can add custom detectors and other components to the pipeline yourself - follow the instructions in the Custom Components notebook
Acknowledgements
We derived inspiration from several open-source libraries in our implementation, like Layout Parser and Deepdoctection. We would like to thank the contributors to these libraries for their work.
Metadata
Release files for py-inkwell 0.0.39
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| py_inkwell-0.0.39.tar.gz | 19.2 MB | With provenance | Details for py_inkwell-0.0.39.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| py_inkwell-0.0.39-py3-none-any.whl | Python 3 | none | any | Details for py_inkwell-0.0.39-py3-none-any.whl |
Total release size: 38.4 MB
Release files / py_inkwell-0.0.39.tar.gz
| Download URL | py_inkwell-0.0.39.tar.gz |
|---|---|
| Size | 19.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
46daf3b2a1c0341b7b200b1225b8adcff8b022c8cc5b78181018f97c2e5e1bb6
|
|
BLAKE2b-256 checksum How to use checksums |
e543b5b115f6d0545145b7e75b675e182c651deaba0b7573024fb363a103e37b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.1.1 CPython/3.12.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2024.
Transparency logRelease files / py_inkwell-0.0.39-py3-none-any.whl
| Download URL | py_inkwell-0.0.39-py3-none-any.whl |
|---|---|
| Size | 19.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
89d4437687a34069c493e1bf2bdd2d2c710b72cea463b2a6a42522e72fee2732
|
|
BLAKE2b-256 checksum How to use checksums |
da1643c52beeb7cefcc7024088a831d9beb0d390adf9b0c68edf70b50bb96198
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.1.1 CPython/3.12.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2024.
Transparency logSecurity for py-inkwell 0.0.39
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for py_inkwell-0.0.39.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 31, 2024.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.