Reconstrucción editorial · Adobe InDesign

Del PDF al
documento
editable

Cómo se reconstruye en InDesign una página a partir de su JSON y su XML, con todos sus componentes en su sitio, y cómo esa reconstrucción alimenta el Atlas de la diagramación.

Esta misma página extrae el JSON con pdf2json, lee con OCR las páginas que son imagen y prepara un paquete, todo en tu navegador. Un script con la librería porky lo convierte en un documento de InDesign con capas, estilos y estructura XML.

  • 2 instrumentos
  • 6 capas
  • 1 DTD
  • 0 errores de validación
Las seis capas del documento reconstruido, de abajo arriba: Original PDF, Rellenos, Líneas, Campos, Texto y OCR ORIGINAL PDF RELLENOS LÍNEAS CAMPOS TEXTO · XML OCR
Fig. 01 · Las seis capas que crea reconstruir.jsx. La página original queda debajo, bloqueada, como referencia; encima, cada componente reconstruido en su capa.

01 · Cargar un PDF

Suelta un PDF y mira cómo se convierte

Este bloque convierte el PDF en tu navegador y muestra cada etapa: el JSON que extrae pdf2json, el XML que genera XmlToJson, la separación por páginas y el OCR de las páginas que son imagen. Al terminar puedes ver el JSON y el XML aquí mismo, descargarlos o descargar el paquete para InDesign.

No hay que instalar ni encender nada, y el archivo no sale de tu equipo. Funciona igual abriendo la página desde tu carpeta o desde internet. Solo el OCR y la calibración tipográfica necesitan conexión la primera vez: descargan Tesseract y pdf.js.

02 · Introducción

Cómo funciona la reconstrucción

Un PDF guarda la página como resultado final: letras colocadas en coordenadas, trazos, rellenos e imágenes, sin la lógica con la que se diseñó. Reconstruirla en InDesign significa devolver cada componente a un objeto editable (un marco de texto con su estilo, un rectángulo con su color, una línea con su grosor) en la misma posición que tenía.

El proceso se reparte entre dos herramientas. El conversor de esta página lee el archivo con pdf2json y obtiene un JSON con la posición de cada texto, línea y relleno; si una página es una imagen (una portada fotografiada, un anuncio), la lee con OCR. Después calibra la tipografía con pdf.js, que mide el cuerpo y el ancho reales de cada texto. Con todo eso prepara un paquete de reconstrucción. Es el mismo código de la Biblioteca PDF, compilado para el navegador: con el mismo PDF, los dos dan el mismo JSON y el mismo XML.

En InDesign, el script reconstruir.jsx abre ese paquete. Usa la librería porky para crear páginas y marcos, y una capa de adaptación propia (atlas-porky.jsx) para todo lo que porky no resuelve: colores, capas, estilos de párrafo y el protocolo XML de InDesign. El resultado es un documento .indd con la estructura XML intacta, un .idml para versiones anteriores, vistas de control y un informe.

Ese informe y las medidas del documento vuelven al Atlas: cada reconstrucción aporta un perfil de diagramación (formato, cuerpo base, escala tipográfica, columnas, márgenes) que se suma a los datos con los que el Atlas describe revistas, periódicos y anuncios.

  1. Paso 1

    PDF original

    Revista, formulario o anuncio, tal como se publicó.

    original.pdf
  2. Paso 2

    JSON y OCR

    pdf2json extrae la geometría; Tesseract lee las páginas que son imagen; pdf.js calibra la tipografía.

    documento.json · ocr.json
  3. Paso 3

    Paquete InDesign

    Plan de geometría en puntos, XML de contenido con estilos, DTD y scripts.

    plan.json · documento.xml
  4. Paso 4

    Reconstrucción

    porky y la capa de adaptación crean páginas, capas, estilos y marcos, e importan el XML.

    reconstruir.jsx
  5. Paso 5

    Atlas

    El perfil medido y el informe de InDesign se incorporan al Atlas de la diagramación.

    pdf.reconstrucciones

03 · Guía de procedimientos

Usar la herramienta, paso a paso

Solo necesitas un navegador actualizado (Chrome, Edge o Firefox) y Adobe InDesign CS6 o posterior (probado en InDesign 2026). La conversión ocurre en esta página, sin subir archivos a ningún servidor.

  1. Convertir el PDF

    Arrastra el PDF al bloque Cargar un PDF o pulsa el botón. Se extrae el JSON, se genera el XML, se separa por páginas y las páginas sin texto se leen con OCR. Cada etapa se marca al terminar.

    Cargar PDF

    En revistas largas, pdf2json tarda unos segundos (se ve la página que va leyendo). Espera a que la etapa «OCR» diga «listo» antes de descargar las páginas o el paquete.
  2. Revisar el JSON y el XML

    En las pestañas JSON y XML del resultado ves el principio de cada archivo; descárgalos para verlos completos. Las páginas van en «Páginas (.zip)»: en las leídas con OCR verás la clave OCR con cada línea y su confianza.

  3. Descargar el paquete para InDesign

    Pulsa «InDesign (.zip)» para el documento entero, o escribe antes un rango de páginas (recomendado en revistas largas: cada página tarda entre 4 y 15 segundos en InDesign).

    El paquete se calibra con pdf.js, que se descarga la primera vez. Sin conexión se descarga igual, con los cuerpos de letra estimados.
  4. Instalar el paquete en InDesign

    Descomprime el ZIP. En InDesign abre Ventana › Utilidades › Scripts. Haz clic derecho en la carpeta Usuario › Mostrar en el Explorador y copia ahí la carpeta del paquete completa (con porky/, lib/ y datos/).

  5. Ejecutar la reconstrucción

    En el panel Scripts, doble clic en reconstruir.jsx. Una ventana muestra el avance página a página. Al terminar, un aviso resume los marcos creados, las fuentes faltantes y el resultado de la validación con la DTD.

    Opciones al inicio del script (CONFIG): colocar o no el PDF original, bloquear su capa, guardar .indd, exportar .idml, XML y vistas JPG.
  6. Revisar el documento

    Oculta la capa Original PDF para ver solo la reconstrucción. En Ver › Estructura › Mostrar estructura aparece el árbol XML: cada elemento Texto, OCR, Relleno o Linea está unido a su marco. Revisa salida/informe.json y las vistas vista-reconstruida-NNN.jpg.

  7. Corregir y sincronizar

    Si el OCR leyó mal una palabra, corrígela en datos/documento.xml y, con el documento abierto, ejecuta sincronizar.jsx: porky actualiza el contenido de cada elemento sin mover ni restilar nada.

04 · Instrumentos JSON y XML

Dónde y cómo, frente a qué

La reconstrucción separa la información en dos instrumentos complementarios. El JSON describe la geometría y el formato; el XML, el contenido y la estructura. Ninguno basta solo: el JSON sin XML produce marcos vacíos, y el XML sin JSON produce texto sin posición.

datos/plan.json

El JSON: dónde y cómo

Es el plano de la página. Convierte las unidades de pdf2json a puntos tipográficos y fija, para cada componente, su posición, su tamaño y su formato.

  • Tamaño de cada página, capas, colores y estilos de párrafo.
  • Textos: inicio, línea base, cuerpo real, estilo, color y ancho original.
  • Rellenos y campos: caja y color. Líneas: extremos, grosor y trazo.
  • Líneas de OCR: caja, cuerpo estimado y confianza.

Un texto del planpuntos

{
  "id": "p1-t3",
  "x": 115.216,
  "lineaBase": 41.184,
  "cuerpo": 7,
  "estilo": "Arial Regular 7 pt",
  "color": "#221f1f",
  "ancho": 155.32
}

datos/documento.xml

El XML: qué

Es el contenido con su estructura. Un elemento por componente, en el orden de la página, con los atributos que InDesign y porky entienden.

  • aid:pstyle: el estilo de párrafo que InDesign aplica al importar.
  • id: une cada elemento con su entrada del plan.
  • syncScript y syncIdentifier: el protocolo de sincronización de porky.
  • DOCTYPE: la DTD con la que InDesign valida la estructura.

El mismo texto en el XMLUTF-8

<Texto id="p1-t3"
       aid:pstyle="Arial Regular 7 pt"
       syncScript="sync/texto.jsx"
       syncIdentifier="p1-t3">Department of the
  Treasury, Internal Revenue Service</Texto>

Su utilidad en la recomposición del diseño

Separar geometría y contenido permite recomponer sin perder el original. El plan conserva la maqueta exacta; el XML puede corregirse, traducirse o depurarse y volver a entrar en los mismos marcos. Como cada elemento lleva su aid:pstyle, el texto llega con su jerarquía tipográfica: titular, subtítulo, cuerpo y pie quedan como estilos de párrafo reutilizables, no como formato suelto.

Para la reconstrucción del diseño, cada componente del PDF encuentra su objeto de InDesign:

En el PDF (pdf2json)En el plan JSONEn el XMLObjeto de InDesignCapa
Páginaancho, alto<Pagina>Página del tamaño originalTodas
La página completaoriginal.pagina<Original>PDF colocado (fotos, degradados, todo lo que no es texto)Original PDF
Fillsrellenos[]<Relleno>Rectángulo con color de rellenoRellenos
HLines, VLineslineas[]<Linea>Línea gráfica con grosor y colorLíneas
Fieldscampos[]<Campo>Rectángulo con contornoCampos
Textstextos[]<Texto>Marco de texto anclado a la línea base, con estilo de párrafoTexto
Imagen sin textoocr[]<OCR>Marco de texto con lo leído por TesseractOCR

Por qué hace falta calibrar. pdf2json mide en unidades de 16 pt y no guarda igual el cuerpo en todos los archivos: en unos PDF su valor TS son píxeles y en otros puntos. Por eso el paquete empareja cada texto con su medida en pdf.js (98 a 99 % de los textos) y toma de ahí el cuerpo y el ancho reales. Si la fuente original no está instalada, InDesign usa la de respaldo y ajusta la escala horizontal para que el texto ocupe lo mismo que en el original.

05 · Código de adaptación

porky y la capa de adaptación

porky (Schreiber & Freunde, licencia MIT) es una librería de ExtendScript para automatizar InDesign con datos JSON, XML y CSV. Ya no se mantiene, pero sus funciones de maquetación y sincronización siguen funcionando en InDesign 2026. lib/atlas-porky.jsx la adapta al formato de la Biblioteca PDF.

Qué aporta porkyQué hace en la reconstrucción
setPageSize(), addNewPage()Tamaño del documento y una página nueva por cada página del plan.
addFrame()Crea los marcos de texto y coloca el PDF original en su capa.
writeFile()Escribe informe.json en UTF-8.
recursiveSyncXMLElement()Recorre la estructura XML y actualiza el contenido de cada elemento con syncScript.
json2.jsDa a ExtendScript (que no lo trae) el objeto JSON para leer el plan.
Problema de porkyAdaptación en atlas-porky.jsx
console.log abre un socket en 127.0.0.1:6789 en cada mensajeSe reemplaza por un registro en memoria: sin el servidor de porky, cada marco tardaría segundos.
readFile lee con la codificación del sistemaLectura en UTF-8 para no estropear tildes ni comillas tipográficas.
Sin colores, capas ni estilosMuestras RGB por color, seis capas apiladas y un estilo de párrafo por fuente y cuerpo.
Sin líneas ni rectángulos con colorRellenos, líneas (con trazo discontinuo) y campos en su capa.
Sin el protocolo XML de InDesignimportXML con preferencias de importación, validación con la DTD, placeXML y markup.
Marcos con alto y ancho fijosLínea base fija (FIXED_HEIGHT), ajuste automático del ancho y escala horizontal calibrada.

reconstruir.jsx · un texto, de principio a finExtendScript

//@include "porky/bin/porky.jsx"
//@include "lib/atlas-porky.jsx"

var plan = atlas.leerJson(carpeta + "/datos/plan.json");      // JSON: dónde y cómo
var indice = atlas.importarXml(doc, carpeta + "/datos/documento.xml"); // XML: qué

doc.activeLayer = capas["Texto"];
var marco = addFrame(t.x, t.lineaBase - t.cuerpo * 0.8, ancho, alto, "");  // porky
marco.textFramePreferences.firstBaselineOffset = FirstBaseline.FIXED_HEIGHT;
indice[t.id].placeXML(marco);                // el texto entra con su aid:pstyle
atlas.ajustarAncho(marco, t.ancho);         // escala horizontal hasta el ancho original

06 · Protocolos XML de InDesign

Lo que exige InDesign al XML

InDesign no importa cualquier XML de forma útil. El paquete sigue sus protocolos para que la estructura se valide, los estilos se apliquen solos y el documento pueda exportarse y volver a sincronizarse.

datos/atlas-indesign.dtd · extractoDTD

<!ELEMENT Documento (Pagina+)>
<!ELEMENT Pagina (Original, Relleno*, Linea*, Campo*, Texto*, OCR*)>
<!ELEMENT Texto (#PCDATA)>
<!ATTLIST Texto
  id ID #REQUIRED
  aid:pstyle CDATA #IMPLIED
  syncScript CDATA #IMPLIED
  syncIdentifier CDATA #IMPLIED>

07 · Procedimientos

Generar los archivos y actualizar el Atlas

Este es el procedimiento completo para pasar de la carga del JSON y el XML a un documento de InDesign reconstruido y a un Atlas actualizado. Cada paso produce archivos que puedes revisar antes de seguir.

  1. Generar el paquete de reconstrucción

    El paquete reúne los dos instrumentos (JSON y XML), la DTD, el PDF original, los scripts y el perfil para el Atlas. Se descarga con «InDesign (.zip)» en el bloque Cargar un PDF; descomprímelo, por ejemplo, en C:\Reconstrucciones.

    Si el documento está en la Biblioteca PDF, también puedes generarlo desde su terminal: npm run cli -- indesign <id> --paginas 1-8 --salida C:\Reconstrucciones.
  2. Reconstruir en InDesign

    Copia la carpeta al panel Scripts y ejecuta reconstruir.jsx. Se crea salida/ con <id>.indd, <id>.idml, <id>-estructura.xml, vista-reconstruida-NNN.jpg e informe.json.

  3. Revisar el informe

    informe.json dice cuántos marcos se crearon por tipo, qué fuentes faltan, cuántos marcos desbordan, cuántos errores dio la validación con la DTD y cuánto tardó. Si algo falla, corrige el XML y usa sincronizar.jsx, o vuelve a generar el paquete.

  4. Incorporar la reconstrucción al Atlas

    Este paso escribe en la carpeta del Atlas, así que se hace con Node.js (22 o posterior) desde una terminal abierta en esa carpeta, con la carpeta del paquete:

    node actualizar.mjs --paquete "C:\Reconstrucciones\<id>-indesign"

    El comando hace tres cosas:

    • escribe el perfil del paquete (atlas/perfil.json, con las medidas de cada página) y el resumen de salida/informe.json en reconstrucciones/<id>.json;
    • añade o sustituye la entrada en diagramacion.json › pdf.reconstrucciones (antes guarda diagramacion.json.bak);
    • vuelve a incrustar los datos en index.html.
    Con un documento de la Biblioteca PDF vale también npm run cli -- atlas <id> --atlas "<carpeta del Atlas>" --informe "…\salida\informe.json".
  5. Comprobar en el Atlas

    Abre el lector PDF del Atlas: debajo de la calibración aparece el bloque Reconstrucciones en InDesign con el formato, el cuerpo base, las columnas, los márgenes, la escala tipográfica y el resumen de InDesign de cada documento.

Archivos del paquete

ArchivoQué es
reconstruir.jsxScript principal: crea el documento a partir de datos/.
sincronizar.jsxActualiza un documento ya reconstruido con el XML corregido (porky).
sync/texto.jsxScript de sincronización que porky ejecuta por elemento.
lib/atlas-porky.jsxCapa de adaptación entre porky y la Biblioteca PDF.
porky/Librería porky y su licencia MIT.
datos/plan.jsonJSON: geometría y formato de cada marco, en puntos.
datos/documento.xmlXML: contenido y estructura, con aid:pstyle y atributos de sincronización.
datos/atlas-indesign.dtdDTD para validar la estructura en InDesign.
datos/original.pdfEl PDF original, que se coloca en la capa «Original PDF».
atlas/perfil.jsonPerfil de diagramación del documento, con la forma de los perfiles del Atlas.

Por qué una lista aparte. Las revistas de pdf.corpus se interpretaron y evaluaron a mano para calibrar el lector. Los perfiles de las reconstrucciones son mediciones automáticas, así que van en pdf.reconstrucciones: amplían el corpus sin mezclarse con los datos de calibración.

08 · Resultados y límites

Probado en InDesign 2026

El procedimiento se ejecutó en InDesign 2026 (21.1) con un formulario de dos páginas (el IRS 1040EZ, de dominio público) y con cuatro páginas de una revista, incluida una portada que solo es imagen y se leyó con OCR.

670marcos · formulario
0errores DTD
0fuentes faltantes
26 s2 páginas
Página 1 del formulario 1040EZ reconstruida en InDesign, sin la capa del PDF original: rellenos verdes, líneas, campos y textos en su posición.
Fig. 02 · Reconstrucción sin la capa original. 303 textos, 65 rellenos, 250 líneas y 52 campos del formulario 1040EZ, creados como objetos de InDesign.
Detalle del encabezado del formulario con el original en rojo y la reconstrucción en cian; donde coinciden queda negro.
Fig. 03 · Superposición. Original en rojo y reconstrucción en cian: donde coinciden, el trazo queda negro. Inicios, líneas base y anchos de texto coinciden; la diferencia está en el dibujo de la fuente de respaldo.

Revista y sincronización. Cuatro páginas de la revista (portada solo imagen, dos páginas de anuncios y un artículo) dieron 205 textos y 22 líneas de OCR en 14,7 s, con 0 errores de validación. Después se corrigieron en el XML dos líneas mal leídas por el OCR y se ejecutó sincronizar.jsx sobre el documento guardado: porky cambió solo esas dos líneas, sin mover sus marcos ni alterar su estilo; el resto del contenido quedó igual.

Límites que conviene conocer