Skip to content

Diphendara/MPCFillToPDF

Repository files navigation

Tutorial

Si buscas un tutorial mira aquí -> https://github.com/Diphendara/MPCFillToPDF/wiki/Tutorial

Sugerencias, bugs etc

Puedes buscarme en twitter/bsky como @diphendara o abrirme una issue por github

MPCFillToPDF

Convierte un archivo de proyecto de MPCFill (XML) en un PDF listo para imprimir en una imprenta local (A4, 3×3 cartas por página, doble cara).

El XML de MPCFill referencia imágenes alojadas en Google Drive. Esta herramienta las descarga, les quita el sangrado de MPC, las recoloca con un sangrado en espejo de 1 mm y monta el PDF con líneas de corte y marcas de impresora.

También soporta mazos de otros juegos de cartas descargándolos directamente desde webs especializadas (ver Webs soportadas).


Webs soportadas para diferentes TCG

One Piece Card Game

Web URL de ejemplo
onepiece.gg https://onepiece.gg/decks/nombre-del-mazo
deckbuilder.egmanevents.com https://deckbuilder.egmanevents.com/?deck=CARTA:X,... o https://deckbuilder.egmanevents.com/d/CODIGO
deckbuilder.cardkaizoku.com https://deckbuilder.cardkaizoku.com/?deck=2xOP01-001|3xOP01-002|...

Pega la URL del mazo en la pestaña One Piece de la interfaz gráfica y pulsa Añadir.


Riftbound TCG

Web URL de ejemplo
riftbound.gg https://riftbound.gg/decks/nombre-del-mazo/
piltoverarchive.com https://piltoverarchive.com/decks/view/<UUID>
riftmana.com https://riftmana.com/decks/nombre-del-mazo
riftbinder.com https://riftbinder.com/decks/<ID>
riftdex.com https://riftdex.com/deck/<UUID>

Pega la URL del mazo en la pestaña Riftbound de la interfaz gráfica y pulsa Añadir.

Nota: Solo se pueden descargar mazos públicos. Si el mazo no está disponible (privado o eliminado), aparecerá un mensaje de error.


Lorcana

Web URL de ejemplo
lorcana.gg https://lorcana.gg/decks/nombre-del-mazo/
inkdecks.com https://inkdecks.com/lorcana-metagame/deck-nombre-ID
dreamborn.ink https://dreamborn.ink/es/decks/ID

Pega la URL del mazo en la pestaña Lorcana de la interfaz gráfica y pulsa Añadir.

Nota: dreamborn.ink requiere que Google Chrome esté instalado, ya que la web usa protección anti-bots que solo un navegador real puede superar. El programa abre Chrome minimizado, carga la página y lo cierra automáticamente.


Clave de API de Google Drive (recomendado)

Las imágenes de los XMLs de MPCFill están alojadas en Google Drive. Sin configuración adicional, el programa las descarga usando gdown (peticiones anónimas), que puede recibir errores 429 — rate limit al descargar muchas imágenes seguidas.

Para evitarlo, configura una API Key de Google Drive (gratuita, no requiere OAuth ni cuenta de servicio):

  1. Ve a Google Cloud Console.
  2. Crea un proyecto (o usa uno existente).
  3. Activa la Google Drive API (Biblioteca → busca "Google Drive API" → Habilitar).
  4. Ve a CredencialesCrear credencialesClave de API.
  5. (Opcional pero recomendado) Restringe la clave a la Google Drive API.
  6. Copia el archivo config.example.json y renómbralo a config.json:
    cp config.example.json config.json
    
  7. Abre config.json y pega tu clave:
    {
      "google_drive_api_key": "AIza..."
    }

config.json está en .gitignore y nunca se sube al repositorio. Si no configuras la clave, el programa sigue funcionando con gdown como antes.


Instalación

1. Requisitos previos

  • Python 3.10 o superior (descarga oficial). Durante la instalación marca "Add Python to PATH".
  • Git (opcional, solo si clonas el repositorio).

Verifica:

python --version

2. Obtener el código

Clónalo:

git clone <url-del-repo> MPCFillToPDF
cd MPCFillToPDF

O descarga el ZIP del repositorio y descomprímelo.

3. Crear un entorno virtual (recomendado)

python -m venv .venv
.venv\Scripts\activate          # Windows
source .venv/bin/activate       # Linux/macOS

4. Instalar dependencias

pip install -r requirements.txt

Instala Pillow, reportlab y gdown.


Uso

Interfaz gráfica (GUI)

Lanza la ventana:

python -m gui.main

Aparece una ventana con:

  • Seleccionar XMLs… abre el explorador para elegir uno o varios .xml (Ctrl+click para varios).
  • Lista con los archivos en cola y botones para Quitar selección / Vaciar.
  • Conservar caché: si está marcado, no borra workdir/raw y workdir/bled al terminar (acelera futuras regeneraciones del mismo XML). Por defecto desactivado.
  • Generar PDF(s): arranca el proceso. Solo se activa cuando hay al menos un XML en la lista o un mazo añadido desde una web.
  • Estado + barra de progreso se actualizan durante la generación.

Antes de generar:

  • Si las barajas pueden fusionarse sin dejar huecos (suma múltiplo de 9), aparece un diálogo informativo con el plan.
  • Si alguna baraja dejará huecos en su PDF, aparece un diálogo de advertencia "¿Continuar de todos modos?".

Cuando termina, se abre automáticamente la carpeta out/ en el Explorador.

Empaquetar como .exe portable (Windows)

pip install pyinstaller
python build_exe.py

Genera dist/MPCFillToPDF.exe. El ejecutable es portable: en la carpeta donde lo dejes creará automáticamente out/ y workdir/ al ejecutarse por primera vez.


Cómo se evita pagar páginas con huecos

La imprenta cobra cada A4 entera aunque no esté llena. Como cada página tiene 3×3 = 9 cartas, si el total no es múltiplo de 9 la última página queda con espacios vacíos pagados.

El sistema lo gestiona así:

  1. Cuenta las cartas de cada XML antes de empezar.
  2. Si la suma de los XMLs no múltiplos de 9 sí es múltiplo de 9 → los fusiona en un único PDF llamado <a>_<b>_..._union.pdf. Cada carta conserva su reverso original.
  3. Si la suma sigue sin ser múltiplo de 9 → avisa de los huecos y pide confirmación.
  4. Cuando hay fusiones, escribe resumen.txt dentro de la carpeta de la ejecución con el desglose:
    PDF: mazo_a_mazo_b_union.pdf  (99 cartas)
      - 95 carta(s) de mazo_a.xml
      - 4 carta(s) de mazo_b.xml
    

Estructura del proyecto

MPCFillToPDF/
├── out/                  ← una subcarpeta por ejecución (DD_MM_YYYY_HH-MM-SS) con los PDFs y, si hay fusión, resumen.txt
├── workdir/              ← caché temporal: raw/ (descargas) y bled/ (recortes)
├── gui/
│   ├── main.py           ← entrada GUI (Tkinter)
│   └── paths.py          ← resolver out/ y workdir/ junto al .exe
├── src/
│   ├── parser.py         ← XML → estructura de cartas
│   ├── downloader.py     ← descarga desde Google Drive (gdown, 5 threads)
│   ├── cropper.py        ← quita bleed de MPC y añade espejo de 1 mm
│   ├── pdf_generator.py  ← maquetación + crop marks + barra de calibración
│   ├── pipeline.py       ← orquestador (run, run_merged)
│   ├── precheck.py       ← conteo, planificación de fusiones, manifiesto
│   ├── op_scraper.py     ← descarga mazos de One Piece desde webs especializadas
│   └── assets/           ← imágenes embebidas (color_bar.png, corner_mark.png)
├── resources/
│   └── backs/op/         ← reversos para cartas de One Piece (default.png, lider.png)
└── build_exe.py          ← script de empaquetado PyInstaller

Formato del PDF generado

  • A4 vertical, 3 columnas × 3 filas = 9 cartas por página.
  • Carta: 63,5 × 88,9 mm (tamaño estándar MPC).
  • Sangrado en espejo de 1 mm alrededor de cada carta.
  • Página n: frentes en orden de slot (0–8, izquierda → derecha, arriba → abajo).
  • Página nB: dorsos espejados horizontalmente para que el doble cara case.
  • Líneas de corte 1 pt en los márgenes (no cruzan el interior).
  • Marcas de registro en las 4 esquinas + barra CMYK arriba para calibración de imprenta.
  • Numeración de pareja en la esquina inferior derecha: 1, 1B, 2, 2B, …

About

Upload a MPCFill XML get a PDF

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors