La API pública está disponible. Convierte Markdown a imágenes con 50 solicitudes con marca de agua al mes.
Volver al Blog
domingo, 2 de agosto de 2026

Cómo convertir varios archivos Markdown a PDF en lote

Cómo convertir varios archivos Markdown a PDF en lote

Respuesta rápida

Tres tareas comunes de lote:

  1. Un Markdown → un PDF, repetido para muchos archivos: md-to-pdf *.md (CLI npm).
  2. Muchos Markdown → un PDF combinado (libro, informe con capítulos): pandoc chapter*.md -o book.pdf.
  3. Muchos Markdown → un PDF en cada commit: workflow de GitHub Actions con la CLI npm.

El /markdown-to-pdf del navegador es para un archivo; los lotes necesitan CLI. Esta guía recorre los tres escenarios con comandos copiables y trampas.

Escenario 1 — N → N (un PDF por archivo Markdown)

Caso simple. Tienes chapter01.md, chapter02.md, ..., y quieres chapter01.pdf, chapter02.pdf, ...

npm install -g md-to-pdf
md-to-pdf 'chapters/*.md'

Listo — por defecto escribe un .pdf junto a cada .md. Añade un stylesheet para controlar el aspecto:

md-to-pdf 'chapters/*.md' --stylesheet ./style.css

Para cientos de archivos, paraleliza:

find chapters -name '*.md' -print0 | xargs -0 -P 4 -I {} md-to-pdf '{}'

Empieza con poca concurrencia y auméntala observando CPU y memoria; cada worker puede iniciar un proceso de navegador.

Escenario 2 — N → 1 (varios .md en un PDF)

Libros, informes técnicos, docs de onboarding multi-archivo.

Pandoc (mejor para capítulos ordenados)

pandoc chapter01.md chapter02.md chapter03.md -o book.pdf

Trampa: el orden de nombres importa. Pandoc concatena por orden de argumento, no alfabético:

pandoc chapter*.md -o book.pdf  # alphabetical order, fine if you've zero-padded

Con índice:

pandoc chapter*.md --toc -o book.pdf

Con salto de página LaTeX entre capítulos:

pandoc chapter*.md --toc --top-level-division=chapter -o book.pdf

Cat-y-convertir (con cualquier herramienta Markdown→PDF)

Sin Pandoc, concatena primero:

: > combined.md
for f in chapter*.md; do
  cat "$f" >> combined.md
  printf '\n\n<div style="page-break-before: always;"></div>\n\n' >> combined.md
done
md-to-pdf combined.md

El <div> inserta salto entre capítulos. Burdo pero fiable.

Escenario 3 — CI/CD (PDF en cada commit)

Workflow de GitHub Actions que produce PDFs en cada push a main:

# .github/workflows/build-pdfs.yml
name: Build PDFs
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 24
      - run: npm install -g md-to-pdf
      - run: md-to-pdf 'docs/**/*.md'
      - uses: actions/upload-artifact@v4
        with:
          name: pdfs
          path: 'docs/**/*.pdf'

Corre md-to-pdf sobre todos los Markdown bajo docs/, sube los PDFs como artefacto. Cambia a tag push para adjuntarlos a un Release.

Trampas comunes

  1. Rutas de imagen rotas en el PDF combinado. Si chapter01.md referencia ./images/a.png, al concatenar la ruta se rompe. Usa rutas absolutas, embebe imágenes como data URI o usa --resource-path=. en Pandoc.
  2. Conflictos de front-matter. Cada .md puede tener su YAML. Pandoc toma el primero; md-to-pdf por archivo lee el suyo. Quita el front-matter antes de concatenar si choca.
  3. Números de página se reinician entre capítulos. Pandoc lo maneja con --top-level-division=chapter; cat-and-convert no (los números son continuos, lo habitual para un libro).
  4. Fuentes Unicode y CJK. Con Pandoc y XeLaTeX define una fuente instalada, por ejemplo --pdf-engine=xelatex -V mainfont:"Source Han Serif CN". Chromium local usa fuentes de su runtime; en servicios alojados prueba los caracteres reales.
  5. Memoria en lotes grandes. El renderizado con navegador consume recursos. Limita la concurrencia, vigila memoria y divide trabajos enormes en bloques reanudables.

Cuándo web vs CLI

  • Un archivo ocasional/markdown-to-pdf. Más rápido que instalar npm.
  • Mismo template, decenas de archivos, una vezmd-to-pdf CLI.
  • Mismo template, muchos archivos, en cada commit → CLI en CI.
  • Libros, informes, multi-capítulo → Pandoc con --top-level-division=chapter --toc.
  • Templates heterogéneos por capítulo → PDFs por archivo (Escenario 1) y luego pdfunite o qpdf.

Más sobre tradeoffs en comparativa de métodos y en code highlighting en PDF.

Fusionar PDFs ya hechos

Si ya generaste PDFs separados y solo quieres concatenar sin re-renderizar:

# pdfunite (poppler-utils)
pdfunite chapter01.pdf chapter02.pdf chapter03.pdf book.pdf

# or qpdf
qpdf --empty --pages chapter*.pdf -- book.pdf

# or ghostscript
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=book.pdf chapter*.pdf

Fusionar evita volver a renderizar y conserva la calidad; el tiempo depende del número y tamaño de archivos, almacenamiento y herramienta.

Preguntas frecuentes

¿Puedo batch con el /markdown-to-pdf web?

La web es de archivo único. Para lotes, CLI; para uso puntual, web.

¿Cómo conservo resaltado en lote?

La CLI hereda lo que pases con --stylesheet. Mismo tema en todos. Ver Markdown a PDF con resaltado.

¿Límite del PDF combinado?

No existe un límite universal de páginas: influyen memoria, imágenes, fuentes, renderizador y lector PDF. Prueba documentos grandes representativos, define tiempos máximos en CI y divide manuales enormes.

¿Pandoc preserva Mermaid en batch?

No nativamente. Necesita pandoc-mermaid-filter o convertir Mermaid a SVG primero.

Cierre

La herramienta correcta depende del producto:

  • 1 a 1 PDF → md-to-pdf '*.md'
  • N a 1 libro → pandoc chapter*.md --toc -o book.pdf
  • Build continuo → GitHub Actions + npm CLI
  • Concatenar PDFs existentes → pdfunite o qpdf

Para un lote único sin nada instalado, el camino más fácil es: web /markdown-to-pdf por archivo, luego pdfunite.

Fuentes verificadas para esta actualización

Los límites y comandos anteriores se comprobaron con estas fuentes primarias actuales:

Prueba el flujo

Abre MarkdownToImage, renderiza Markdown y elige el formato adecuado. Antes de automatizar un lote, prueba un documento representativo.

Markdown a PDF en lote: CLI y CI | Markdown2Image | MarkdownToImage