Deterministyczny generator identyfikatorów dokumentów z OCR
Project description
DOC Document ID Generator
Deterministyczny generator identyfikatorów dokumentów z OCR. Generuje zawsze ten sam ID dla tego samego dokumentu, niezależnie od formatu źródłowego (skan, PDF, KSeF XML, obrazy).
🎯 Problem
Masz fakturę w trzech formatach:
- Skan JPG z telefonu
- PDF z emaila
- XML z KSeF
Jak uzyskać ten sam identyfikator dla wszystkich trzech?
✨ Rozwiązanie
from docid import get_document_id
# Wszystkie trzy zwrócą TEN SAM ID!
get_document_id("faktura_skan.jpg") # DOC-FV-A7B3C9D2E1F04856
get_document_id("faktura.pdf") # DOC-FV-A7B3C9D2E1F04856
get_document_id("faktura_ksef.xml") # DOC-FV-A7B3C9D2E1F04856
📦 Instalacja
Lokalna instalacja (rekomendowana)
# Klonuj repozytorium
git clone https://github.com/softreck/doc-pl.git
cd doc-pl/app/docid
# Utwórz środowisko wirtualne
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# lub venv\Scripts\activate # Windows
# Zainstaluj projekt
make install
Z PaddleOCR (zalecane dla CPU i5+)
pip install docid[paddle]
Z Tesseract (lżejsza alternatywa)
# Ubuntu/Debian
sudo apt install tesseract-ocr tesseract-ocr-pol
# Pakiet Python
pip install docid[tesseract]
Wszystkie silniki OCR
pip install docid[all]
🚀 Szybki start
Generator ID dla dokumentów biznesowych
from docid import generate_invoice_id, generate_receipt_id, generate_contract_id
# Faktura VAT
invoice_id = generate_invoice_id(
seller_nip="5213017228",
invoice_number="FV/2025/00142",
issue_date="2025-01-15",
gross_amount=1230.50
)
print(invoice_id) # DOC-FV-F0BE35240C77B2DB
# Paragon fiskalny
receipt_id = generate_receipt_id(
seller_nip="5213017228",
receipt_date="2025-01-15",
gross_amount=37.88,
cash_register_number="001"
)
print(receipt_id) # DOC-PAR-8142B3FC69D7778C
# Umowa
contract_id = generate_contract_id(
party1_nip="5213017228",
party2_nip="1234567890",
contract_date="2025-01-15",
contract_number="001/2025"
)
print(contract_id) # DOC-UMO-C54CB968D1342642
Uniwersalny generator ID (dowolne dokumenty)
from docid import generate_universal_document_id
# Dowolny dokument
doc_id = generate_universal_document_id("dokument.pdf")
print(doc_id) # UNIV-PDF-A6BECE56B7FE21DC
# Zdjęcie lub skan
doc_id = generate_universal_document_id("skan.jpg")
print(doc_id) # UNIV-IMG-4225A473A725978D
# Dokument z grafiką/wektorami
doc_id = generate_universal_document_id("grafika.png")
print(doc_id) # UNIV-IMG-E2E2131A335F0918
Pełne przetwarzanie z OCR
from docid import process_document, get_document_id
# Pełne przetwarzanie z ekstrakcją danych
result = process_document("faktura.pdf")
print(result.document_id) # DOC-FV-F0BE35240C77B2DB
print(result.extraction.issuer_nip) # 5213017228
print(result.extraction.invoice_number) # FV/2025/00142
# Tylko wygeneruj ID
doc_id = get_document_id("paragon.jpg")
print(doc_id) # DOC-PAR-8142B3FC69D7778C
# Weryfikacja ID
is_valid = verify_document_id("skan.png", "DOC-FV-F0BE35240C77B2DB")
print(is_valid) # True/False
🖥️ Interfejs CLI (docid-universal)
Projekt dostarcza potężne narzędzie CLI docid-universal, które udostępnia wszystkie funkcjonalności pakietu.
Podstawowe komendy
# Generowanie ID dla faktury (dane ręczne)
docid-universal generate invoice --nip 5213017228 --number FV/2025/00142 --date 2025-01-15 --amount 1230.50
# Generowanie uniwersalnego ID dla pliku
docid-universal universal dokument.pdf
# Przetwarzanie dokumentu z OCR i ekstrakcją danych
docid-universal process samples/invoices/faktura_full.jpg --format json
# Analiza cech pliku (rozmiar, hashe, metadane)
docid-universal analyze samples/invoices/faktura_full.png
# Porównanie dwóch dokumentów
docid-universal compare samples/invoices/faktura_full.jpg samples/invoices/faktura_full.pdf
Przetwarzanie wsadowe (Batch)
Możesz przetworzyć cały folder dokumentów i automatycznie wykryć duplikaty:
docid-universal batch ./scany --recursive --duplicates --output wyniki.json
Testowanie determinizmu
Sprawdź, czy generator zwraca zawsze ten sam ID dla tego samego pliku:
docid-universal test faktura.pdf --iterations 10
🌐 Usługa Web (REST API)
Możesz łatwo uruchomić docid jako usługę webową (wymaga fastapi i uvicorn):
Uruchomienie serwera
make run-web
# Serwer wystartuje na http://localhost:8000
Przykłady CURL
1. Generowanie ID z pliku:
curl -X POST -F "file=@faktura.pdf" http://localhost:8000/process
2. Weryfikacja ID:
curl -X POST -F "file=@skan.jpg" -F "document_id=DOC-FV-F0BE35240C77B2DB" http://localhost:8000/verify
3. Porównywanie plików:
curl -X POST -F "file1=@plik1.pdf" -F "file2=@plik2.png" http://localhost:8000/compare
🧪 Testy Jakości i OCR
Pakiet zawiera zaawansowane narzędzia do testowania odporności ID na zniekształcenia obrazu (szumy, kompresja stratna).
Test odporności na szumy
# Testuje determinizm ID przy dodawaniu szumu, rozmycia i zmianie jasności
python examples/quality_test.py samples/invoices/faktura_full.png --noise --iterations 5
Test formatów stratnych (JPG vs PNG)
# Sprawdza czy ID pozostaje spójne mimo kompresji stratnej
python examples/quality_test.py samples/invoices/faktura_full.png --formats
Uruchomienie przez Makefile
make test-quality FILE=samples/invoices/faktura_full.png
🛠️ Makefile - Wszystkie komendy
Instalacja i Budowanie
make install # Instalacja projektu
make install-all # Instalacja z wszystkimi zależnościami OCR
make build # Budowanie paczki (wymaga 'build')
make upload # Publikacja na PyPI (wymaga 'twine')
Testy i Narzędzia
make test # Uruchom wszystkie testy
make test-cli # Test interfejsu CLI
make test-universal # Test dokumentów uniwersalnych
make test-quality FILE=plik.png # Test jakości OCR
make run-web # Uruchom serwer API
📚 Przykłady użycia
1. Przetwarzanie faktur
from docid import process_document
# Przetwarzanie faktury PDF
result = process_document("faktura.pdf")
print(f"ID: {result.document_id}")
print(f"NIP: {result.extraction.issuer_nip}")
print(f"Kwota: {result.extraction.gross_amount}")
# Przetwarzanie skanu JPG
result = process_document("skan_faktury.jpg")
print(f"ID: {result.document_id}")
2. Porównywanie dokumentów
from docid import compare_universal_documents
# Porównaj dwa dokumenty
comparison = compare_universal_documents("dokument1.pdf", "dokument2.png")
print(f"Identyczne ID: {comparison['identical_ids']}")
print(f"Ten sam typ: {comparison['same_type']}")
print(f"Ten sam rozmiar: {comparison['same_size']}")
3. Weryfikacja ID
from docid import verify_document_id, verify_universal_document_id
# Weryfikacja ID dokumentu biznesowego
is_valid = verify_document_id("faktura.pdf", "DOC-FV-F0BE35240C77B2DB")
# Weryfikacja uniwersalnego ID
is_valid = verify_universal_document_id("dowolny_plik.jpg", "UNIV-IMG-4225A473A725978D")
4. Praca z kolekcją dokumentów
from pathlib import Path
from docid import generate_universal_document_id
# Przetwarzaj wszystkie pliki w folderze
documents_dir = Path("dokumenty")
for file_path in documents_dir.glob("*"):
if file_path.is_file():
doc_id = generate_universal_document_id(file_path)
print(f"{file_path.name}: {doc_id}")
🔍 Formaty plików i przetwarzanie
Obsługiwane formaty
| Format | Opis | Przetwarzanie | ID Generator |
|---|---|---|---|
| Dokumenty PDF | ✅ Pełne | Uniwersalny | |
| PNG | Obrazy bezstratne | ✅ OCR + Wizualne | Oba |
| JPG/JPEG | Obrazy stratne | ✅ OCR + Wizualne | Oba |
| XML | Struktura danych | ✅ Tekst | Biznesowy |
| HTML | Strony WWW | ✅ Tekst | Biznesowy |
| TXT | Czysty tekst | ✅ Tekst | Biznesowy |
📝 PNG i JPG - Przetwarzanie przez OCR
TAK! Formaty PNG i JPG są w pełni przetwarzane przez OCR:
from docid import process_document
# Przetwarzanie skanu PNG z OCR
result = process_document("skan_faktury.png")
print(result.document_id) # DOC-FV-F0BE35240C77B2DB
print(result.extraction.issuer_nip) # 5213017228
# Przetwarzanie zdjęcia JPG z OCR
result = process_document("zdjecie_paragonu.jpg")
print(result.document_id) # DOC-PAR-8142B3FC69D7778C
Co jest ekstrahowane z PNG/JPG:
-
OCR (PaddleOCR/Tesseract):
- Tekst z dokumentów
- NIP, numery faktur
- Kwoty, daty
- Struktura dokumentu
-
Analiza wizualna (Uniwersalny generator):
- Hash wizualny (resize 64x64)
- Histogram kolorów
- Wymiary obrazu
- Metadane pliku
Przykłady dla różnych formatów
# Ten sam dokument w różnych formatach - ten sam ID biznesowy
generate_invoice_id(...) # -> DOC-FV-F0BE35240C77B2DB
# Przetwarzanie przez OCR daje ten sam wynik
process_document("faktura.pdf") # -> DOC-FV-F0BE35240C77B2DB
process_document("faktura.png") # -> DOC-FV-F0BE35240C77B2DB
process_document("faktura.jpg") # -> DOC-FV-F0BE35240C77B2DB
process_document("faktura.xml") # -> DOC-FV-F0BE35240C77B2DB
# Różne ID uniwersalne dla różnych formatów
generate_universal_document_id("faktura.pdf") # -> UNIV-PDF-...
generate_universal_document_id("faktura.png") # -> UNIV-IMG-...
generate_universal_document_id("faktura.jpg") # -> UNIV-IMG-...
🧪 Testowanie
Uruchomienie testów
# Wszystkie testy
make test
# Testy deterministyczności
make test-samples
# Testy formatów
make test-complete-formats
# Testy uniwersalne
make test-universal
Struktura testów
tests/
├── test_document_id.py # Testy generatora ID
├── test_extractors.py # Testy ekstrakcji danych
└── conftest.py # Konfiguracja testów
Przykładowe wyniki testów
================================================================================
TEST WSZYSTKICH FORMATÓW - PDF, PNG, JPG, HTML, TXT, XML
================================================================================
FOLDER: FAKTURY (invoices/)
📄 faktura_full.pdf (.pdf ) [ 2242B] -> DOC-FV-F0BE35240C77B2DB
📄 faktura_full.xml (.xml ) [ 2077B] -> DOC-FV-F0BE35240C77B2DB
📄 faktura_full.html (.html) [ 3334B] -> DOC-FV-F0BE35240C77B2DB
📄 faktura_full.jpg (.jpg ) [ 28182B] -> DOC-FV-F0BE35240C77B2DB
📄 faktura_full.png (.png ) [ 32325B] -> DOC-FV-F0BE35240C77B2DB
📄 faktura_full.txt (.txt ) [ 2839B] -> DOC-FV-F0BE35240C77B2DB
📊 Podsumowanie folderu invoices:
Plików przetworzonych: 6
Unikalnych ID: 1
Wszystkie identyczne: True
✅ ID: DOC-FV-F0BE35240C77B2DB
📁 Struktura projektu
docid/
├── docid/ # Główny pakiet
│ ├── __init__.py # Eksporty API
│ ├── document_id.py # Generator ID biznesowy
│ ├── document_id_universal.py # Generator ID uniwersalny
│ ├── extractors.py # Ekstraktory danych
│ ├── ocr_processor.py # Przetwarzanie OCR
│ └── pipeline.py # Główny pipeline
├── samples/ # Przykładowe dokumenty
│ ├── invoices/ # Faktury (6 formatów)
│ ├── receipts/ # Paragony (6 formatów)
│ ├── contracts/ # Umowy (6 formatów)
│ └── universal/ # Dokumenty uniwersalne
├── tests/ # Testy jednostkowe
├── examples/ # Przykłady użycia
├── Makefile # Komendy projektu
├── pyproject.toml # Konfiguracja projektu
└── README.md # Dokumentacja
🔧 Konfiguracja
Silniki OCR
from docid import OCREngine, get_pipeline
# Użyj PaddleOCR (domyślnie)
pipeline = get_pipeline(ocr_engine=OCREngine.PADDLE)
# Użyj Tesseract
pipeline = get_pipeline(ocr_engine=OCREngine.TESSERACT)
Custom prefix
from docid import UniversalDocumentIDGenerator
generator = UniversalDocumentIDGenerator(prefix="MOJA")
doc_id = generator.generate_universal_id("plik.pdf")
# Wynik: MOJA-PDF-A6BECE56B7FE21DC
📈 Wydajność
Czas przetwarzania
| Format | Rozmiar | Czas | Metoda |
|---|---|---|---|
| PDF (tekst) | 10KB | ~50ms | Bez OCR |
| PDF (skan) | 1MB | ~500ms | OCR |
| PNG (600x400) | 50KB | ~200ms | OCR |
| JPG (1200x800) | 200KB | ~300ms | OCR |
Optymalizacja
# Wyłącz OCR dla czystych PDF
result = process_document("czysty_pdf.pdf", use_ocr=False)
# Użyj cache dla wielokrotnego przetwarzania
pipeline = get_pipeline()
pipeline.enable_cache = True
🤝 Współpraca
- Fork repozytorium
- Utwórz branch (
git checkout -b feature/NowaFunkcja) - Commit zmiany (
git commit -am 'Dodaj nową funkcję') - Push do brancha (
git push origin feature/NowaFunkcja) - Otwórz Pull Request
📄 Licencja
MIT License - zobacz LICENSE dla szczegółów.
🆘 Wsparcie
- 📧 Email: info@softreck.dev
- 🐛 Issues: GitHub Issues
- 📖 Dokumentacja: GitHub Wiki
🗺️ Roadmap
- Obsługa dodatkowych formatów (DOCX, XLSX)
- Integracja z bazami danych
- API REST
- Interfejs webowy
- Przetwarzanie wsadowe
- Chmura (AWS, Azure, GCP)
DOC Document ID Generator - Deterministyczne identyfikatory dla każdego dokumentu! 🚀
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docid-0.1.9.tar.gz.
File metadata
- Download URL: docid-0.1.9.tar.gz
- Upload date:
- Size: 50.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dbdf58d44495a174a37dc7701a72020ae6af3ff7fdde2ee67f3ec136b86a8a66
|
|
| MD5 |
bb19b5829fb3cf9bcd36a0adf4ccee8c
|
|
| BLAKE2b-256 |
107d565818318d1f72844800a209182a3e934b71b73fa7239ecd3ab59442b093
|
File details
Details for the file docid-0.1.9-py3-none-any.whl.
File metadata
- Download URL: docid-0.1.9-py3-none-any.whl
- Upload date:
- Size: 43.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b48011f0c8916bc2e0ffadb4e6c2f376da979659b9133f003e7d306710ff566
|
|
| MD5 |
d3678dcb9ec587052bb543bf2f290fc5
|
|
| BLAKE2b-256 |
01d4b15eaf12fb9d18d4808b2b817debced0981af362443de1d27056c737bddf
|