Feature exclusive du fork
egyptian— Cette application n'existe pas dans Mayan EDMS upstream. Elle ajoute un driver de métadonnées de fichier qui extrait automatiquement les codes-barres (QR Code, Code128, EAN, etc.) des pages de documents.
image_barcode_extract est un driver de file metadata : il s'intègre dans le système de métadonnées de fichier de Mayan et extrait les codes-barres trouvés dans les pages des documents. Le résultat est stocké dans les métadonnées de fichier et peut optionnellement être écrit dans les métadonnées documentaires (champ barcode).
Fonctionnement :
FileMetadataEntry avec le préfixe barcode:L'application n'est pas activée par défaut. Elle doit être déclarée dans COMMON_EXTRA_APPS.
Dans config.yml :
COMMON_EXTRA_APPS:
- mayan.apps.image_barcode_extract.apps.ImageBarcodeExtractApp
Via variable d'environnement Docker :
MAYAN_COMMON_EXTRA_APPS=mayan.apps.image_barcode_extract.apps.ImageBarcodeExtractApp
Redémarrer Mayan après activation :
# Docker
docker compose restart app worker_b
# Bare-metal
sudo systemctl restart mayan-frontend mayan-worker-b
zxingcpp est une implémentation moderne de ZXing en C++ avec binding Python. Elle gère mieux les codes-barres inclinés ou déformés.
pip install "zxing-cpp>=2.2.0" "Pillow>=10.0.0"
Via Docker (MAYAN_PIP_INSTALLS) :
MAYAN_PIP_INSTALLS="zxing-cpp>=2.2.0"
# docker-compose.yml
environment:
MAYAN_PIP_INSTALLS: "zxing-cpp>=2.2.0"
pyzbar est une bibliothèque mature basée sur libzbar. Elle nécessite un paquet système.
# Dépendance système
apt-get install libzbar0
# Package Python
pip install pyzbar "Pillow>=10.0.0"
Via Docker :
environment:
MAYAN_APT_INSTALLS: "libzbar0"
MAYAN_PIP_INSTALLS: "pyzbar"
| Format | Description |
|---|---|
QR_CODE |
QR Code 2D |
CODE_128 |
Code 128 (usage général) |
CODE_39 |
Code 39 |
CODE_93 |
Code 93 |
EAN_13 |
EAN-13 (produits) |
EAN_8 |
EAN-8 |
UPC_A |
UPC-A |
UPC_E |
UPC-E |
PDF_417 |
PDF417 2D |
AZTEC |
Aztec Code 2D |
DATA_MATRIX |
Data Matrix 2D |
ITF |
Interleaved 2 of 5 |
| Format | Description |
|---|---|
CODE128 |
Code 128 |
CODE39 |
Code 39 |
EAN13 |
EAN-13 |
EAN8 |
EAN-8 |
UPCA |
UPC-A |
UPCE |
UPC-E |
I25 |
Interleaved 2 of 5 |
QRCODE |
QR Code |
CODABAR |
Codabar |
Différence clé : zxingcpp gère les codes-barres inclinés, partiellement masqués ou faiblement contrastés. pyzbar est plus rapide sur les codes bien imprimés et droits.
Le driver traite les fichiers avec ces types MIME :
| Type MIME | Format |
|---|---|
application/pdf |
PDF (converti page par page en PNG) |
image/jpeg |
JPEG |
image/png |
PNG |
image/tiff |
TIFF |
image/bmp |
BMP |
image/gif |
GIF |
image/webp |
WebP |
Les pages PDF sont converties en images à 150 DPI avant l'extraction.
Le scope détermine quelles pages scanner et combien de codes-barres retenir.
| Scope | Comportement | Cas d'usage |
|---|---|---|
first_page |
Scanne uniquement la page 1, retourne le 1er code trouvé | Documents avec code en page de garde |
last_page |
Scanne uniquement la dernière page, retourne le 1er code | Documents avec code en dernière page |
first_found |
Défaut — Scanne toutes les pages dans l'ordre, s'arrête au 1er code trouvé | Cas général |
last_found |
Scanne toutes les pages, retourne le dernier code trouvé | Code de validation en page finale |
all_pages |
Scanne toutes les pages, collecte tous les codes uniques | Documents multi-références |
Exemple : Un bon de commande a un QR code en page 1 (numéro de commande) et un Code128 en page 3 (numéro de lot) :
first_found → retourne le QR code page 1last_found → retourne le Code128 page 3all_pages → retourne les deux, séparés par |La configuration se fait individuellement par type de document dans l'interface Mayan.
Administration → Types de documents → [Type] → Drivers de métadonnées de fichier → Barcode extractor → Modifier
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
scope |
Choix | first_found |
Quelles pages scanner |
library |
Choix | zxingcpp |
Bibliothèque de décodage |
metadata_type_name |
Texte | barcode |
Nom du type de métadonnée documentaire à renseigner |
metadata_type_nameSi renseigné, le driver écrit la valeur du code-barres dans un champ de métadonnée documentaire (distinct des métadonnées de fichier). Ce champ doit :
MetadataType avec le même nom (ex. barcode)Laisser vide pour ne stocker que dans les métadonnées de fichier.
Après traitement, les entrées suivantes apparaissent dans l'onglet Métadonnées de fichier du document :
| Clé | Exemple | Toujours créé | Description |
|---|---|---|---|
barcode:value |
WO-2024-00123 |
Si trouvé | Valeur principale du code-barres |
barcode:type |
CODE_128 |
Si trouvé | Format du code-barres |
barcode:page |
1 |
Si trouvé | Numéro de page où trouvé |
barcode:scope |
first_found |
Toujours | Scope utilisé |
barcode:library |
zxingcpp |
Toujours | Bibliothèque utilisée |
barcode:all_values |
WO-2024::CODE_128::p1 \| QR456::QR_CODE::p3 |
Si all_pages + plusieurs |
Tous les codes trouvés (format value::type::pN) |
Par défaut, le driver est appelé automatiquement lors de l'upload d'un nouveau fichier :
Upload fichier
→ signal_post_document_file_upload
→ task_document_file_metadata_process (Celery)
→ task_metadata_driver_process [barcode_extractor] (en parallèle)
→ Entrées FileMetadataEntry créées
→ (optionnel) DocumentMetadata mise à jour
| Action | Navigation |
|---|---|
| Fichier individuel | Document → Fichier → Actions → Soumettre pour métadonnées de fichier |
| Plusieurs fichiers | Liste documents → sélection → Soumettre pour métadonnées |
| Par type de document | Administration → Outils → Traitement métadonnées par type |
POST /api/v4/documents/{document_id}/files/{file_id}/metadata/process
curl -X POST \
-H "Authorization: Token <token>" \
"https://mayan.example.com/api/v4/documents/42/files/7/metadata/process"
# → 202 Accepted
from mayan.apps.documents.models import DocumentFile
doc_file = DocumentFile.objects.get(pk=7)
doc_file.submit_for_file_metadata_processing()
Créer le type de métadonnée :
Administration → Types de métadonnées → Créer
Nom : barcode, Label : Code-barres
Associer au type de document :
Administration → Types de documents → [Type] → Métadonnées → Ajouter → barcode
Configurer le driver :
Drivers de métadonnées → Barcode extractor → metadata_type_name = barcode
Après extraction, le champ barcode du document est automatiquement renseigné avec la valeur trouvée. Ce champ est :
# Lister les drivers configurés pour un fichier
curl -H "Authorization: Token <token>" \
"https://mayan.example.com/api/v4/documents/42/files/7/metadata/drivers/"
# Voir les entrées du driver barcode
curl -H "Authorization: Token <token>" \
"https://mayan.example.com/api/v4/documents/42/files/7/metadata/drivers/{driver_id}/entries/"
# Réponse exemple :
[
{"key": "barcode:value", "value": "WO-2024-00123"},
{"key": "barcode:type", "value": "CODE_128"},
{"key": "barcode:page", "value": "1"},
{"key": "barcode:scope", "value": "first_found"},
{"key": "barcode:library", "value": "zxingcpp"}
]
| Permission | Description |
|---|---|
file_metadata_view |
Voir les métadonnées de fichier (résultats barcode) |
file_metadata_submit |
Soumettre manuellement pour extraction |
file_metadata_document_type_setup |
Configurer le driver par type de document |
literals.py (PAGE_RENDER_DPI = 300)pyzbar à zxingcpp (ou inversement)from mayan.apps.image_barcode_extract.utils import decode_image
results = decode_image('/tmp/page1.png', library='zxingcpp')
print(results) # [{'value': '...', 'type': 'CODE_128'}] ou []
ERROR: Barcode library 'zxingcpp' not available: No module named 'zxingcpp'
Installer le package : pip install zxing-cpp>=2.2.0
ERROR: Barcode library 'pyzbar' not available: ...libzbar.so...
Installer le paquet système : apt-get install libzbar0
# Dans l'interface
Document → Fichier → Journal d'erreurs
# Via shell
from mayan.apps.logging.models import GlobalErrorLogPartitionEntry
for e in GlobalErrorLogPartitionEntry.objects.filter(text__icontains='barcode').order_by('-datetime')[:10]:
print(e.datetime, e.text[:200])
| Fichier | Rôle |
|---|---|
apps.py |
Configuration Django, registration du driver |
drivers.py |
Classe BarcodeExtractorDriver (FileMetadataDriver) |
utils.py |
Logique d'extraction : decode_image(), scopes, BarcodeResult |
literals.py |
Constantes : PAGE_RENDER_DPI=150, scopes, DRIVER_INTERNAL_NAME |
dependencies.py |
Déclaration de la dépendance zxing-cpp |