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.

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.pdf

4. 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