Código abierto · Ejemplo práctico
Reparar el texto árabe de un PDF: un ejemplo práctico
Un certificado de muestra cuyo árabe se ve bien en pantalla pero se copia como cuadros y letras equivocadas, reparado con arabic-pdf-repair en un solo comando. Descarga los dos archivos, compara lo que pegan y ejecuta el mismo código con tus PDF.
1. Descarga los archivos de muestra
Los dos archivos son un certificado de una página creado para este ejemplo: los nombres y datos son ficticios. La capa de texto del original está rota como la dejaban las viejas herramientas de Windows; el archivo reparado es el original tras el comando de abajo. Las páginas se ven exactamente igual.
Original (certificate.pdf)Reparado (certificate.repaired.pdf)
2. Copia el texto del original
Estas son sus primeras líneas tal como las extrae pdf.js, el lector de PDF de Firefox y de muchas aplicaciones web. Cada □ es un carácter de control: invisible o un cuadro, según dónde lo pegues.
□دة إ □□م دورة
□ □□ ا□□ر□□□□دة □□ر □□□□
□ □ إدارة ا□□□□□ □□ن
□ري
□□□"! ا□□رة □"
'□ أ □% □□$□ح دورة3. Repáralo con un comando
Con Node.js 20 o posterior, sin instalar nada. El comando nombra cada fuente que reparó y escribe la copia reparada junto al original, que nunca modifica:
$ npx arabic-pdf-repair certificate.pdf
fixed CertArabic: 65 codes
wrote certificate.repaired.pdf4. Copia el texto otra vez
Las mismas líneas, copiadas de certificate.repaired.pdf:
شهادة إتمام دورة
مركز ريادة للتدريب المهني
تشهد إدارة المركز بأن
سارة يوسف المنصوري
قد أتمت بنجاح دورة
أساسيات تحرير المستندات الرقميةLa búsqueda también funciona: la palabra التعلم no aparece en el original y aparece una vez en el archivo reparado.
5. La misma reparación en tu código
En Node.js, instala el paquete (npm install arabic-pdf-repair) y pasa los bytes del archivo a repairTextLayer. Devuelve el archivo reparado y las fuentes reparadas, o null si no hay nada que reparar:
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 biblioteca no usa ninguna API de Node.js, así que también funciona en el navegador o en un web worker, con un archivo que elige el usuario, sin subirlo:
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
});Por qué el original se copia como texto ilegible
- Un PDF dibuja cada letra como una forma (un glifo) de una fuente. Para copiarla, el lector necesita una tabla en el archivo, llamada ToUnicode, que indica qué letra representa cada forma.
- La fuente del original no tiene esa tabla. Sus glifos solo llevan los nombres de glifos árabes de Microsoft (afii62753 en adelante), que los lectores no reconocen como letras, así que al copiar salen caracteres de control y letras sueltas.
- arabic-pdf-repair lee esos nombres, escribe la tabla que falta y no cambia nada más: los mismos glifos en los mismos lugares, la misma página.
Siguientes pasos
- Qué más repara (texto Windows-1256 que se copia como ÇáÚÑÈíÉ, fuentes Diwan XT, archivos cifrados) y su licencia: la página de arabic-pdf-repair.
- Una página escaneada es una imagen, sin texto que reparar: usa el OCR de GenPDF.
- Para cambiar las palabras de un PDF árabe, no solo copiarlas: editar texto árabe en un PDF con GenPDF.