Open source · Exemple
Réparer le texte arabe d’un PDF : un exemple complet
Une attestation d’essai dont l’arabe s’affiche bien mais se copie en carrés et en lettres fausses, réparée par arabic-pdf-repair en une commande. Téléchargez les deux fichiers, comparez ce qu’ils donnent au collage et lancez le même code sur vos PDF.
1. Télécharger les fichiers d’essai
Les deux fichiers sont une attestation d’une page créée pour cet exemple : les noms et les détails sont fictifs. La couche de texte de l’original est cassée comme la laissaient les anciens outils Windows ; le fichier réparé est l’original après la commande ci-dessous. Les pages sont identiques.
2. Copier le texte de l’original
Voici ses premières lignes telles que les extrait pdf.js, le lecteur PDF de Firefox et de nombreuses applications web. Chaque □ est un caractère de contrôle : invisible ou affiché en carré selon l’endroit où vous collez.
□دة إ □□م دورة
□ □□ ا□□ر□□□□دة □□ر □□□□
□ □ إدارة ا□□□□□ □□ن
□ري
□□□"! ا□□رة □"
'□ أ □% □□$□ح دورة3. Le réparer en une commande
Avec Node.js 20 ou plus récent, sans rien installer. La commande nomme chaque police corrigée et écrit la copie réparée à côté de l’original, qu’elle ne modifie jamais :
$ npx arabic-pdf-repair certificate.pdf
fixed CertArabic: 65 codes
wrote certificate.repaired.pdf4. Copier à nouveau le texte
Les mêmes lignes, copiées depuis certificate.repaired.pdf :
شهادة إتمام دورة
مركز ريادة للتدريب المهني
تشهد إدارة المركز بأن
سارة يوسف المنصوري
قد أتمت بنجاح دورة
أساسيات تحرير المستندات الرقميةLa recherche fonctionne aussi : le mot التعلم est introuvable dans l’original et trouvé une fois dans le fichier réparé.
5. La même réparation dans votre code
Dans Node.js, installez le paquet (npm install arabic-pdf-repair) et passez les octets du fichier à repairTextLayer. Il renvoie le fichier réparé et les polices corrigées, ou null s’il n’y a rien à réparer :
import { readFile, writeFile } from "node:fs/promises";
import { repairTextLayer } from "arabic-pdf-repair";
const input = new Uint8Array(await readFile("certificate.pdf"));
const result = await repairTextLayer(input);
if (result) {
await writeFile("certificate.repaired.pdf", result.bytes);
console.log(result.fonts); // [{ name: "CertArabic", codes: 65 }]
}La bibliothèque n’utilise aucune API de Node.js : elle fonctionne aussi dans le navigateur ou un web worker, sur un fichier choisi par l’utilisateur, sans l’envoyer nulle part :
import { repairTextLayer } from "arabic-pdf-repair";
const picker = document.querySelector("input[type=file]");
picker.addEventListener("change", async () => {
const file = picker.files[0];
const result = await repairTextLayer(new Uint8Array(await file.arrayBuffer()));
if (!result) return; // nothing to repair
const url = URL.createObjectURL(new Blob([result.bytes], { type: "application/pdf" }));
window.open(url); // the repaired copy; the file never left the browser
});Pourquoi l’original se copie en charabia
- Un PDF dessine chaque lettre avec une forme (un glyphe) tirée d’une police. Pour la copier, le lecteur a besoin d’une table du fichier, appelée ToUnicode, qui dit quelle lettre représente chaque forme.
- La police de l’original n’a pas cette table. Ses glyphes ne portent que les noms de glyphes arabes de Microsoft (afii62753 et suivants), que les lecteurs ne reconnaissent pas comme des lettres : la copie donne des caractères de contrôle et des lettres au hasard.
- arabic-pdf-repair lit ces noms, écrit la table manquante et ne touche à rien d’autre : les mêmes glyphes aux mêmes endroits, donc la même page.
Pour aller plus loin
- Ce qu’elle corrige d’autre (texte Windows-1256 qui se copie en ÇáÚÑÈíÉ, polices Diwan XT, fichiers chiffrés) et sa licence : la page d’arabic-pdf-repair.
- Une page scannée est une image, sans texte à réparer : utilisez plutôt l’OCR de GenPDF.
- Pour changer les mots d’un PDF arabe, et pas seulement les copier : modifier le texte arabe d’un PDF avec GenPDF.