725190010c
Aggiunge la possibilità di convertire un documento Markdown in PDF
direttamente lato server, senza richiedere al chiamante di avere
md-to-pdf, pandoc o altri tool sull'host. Il PDF è restituito come
stringa base64 nella risposta JSON-RPC, pronto a essere salvato,
allegato o spedito al cliente.
- pdf_renderer.py: nuovo modulo che parsea il frontmatter YAML del
Markdown (incluso il blocco pdf_options stile Puppeteer/md-to-pdf),
rende il body in HTML via markdown-it-py (supporta tabelle e
HTML inline) e produce il PDF tramite Chromium headless gestito
da Playwright. Le pdf_options camelCase (printBackground,
displayHeaderFooter, headerTemplate, ...) vengono tradotte negli
argomenti snake_case di page.pdf().
- mcp_tools.py: nuovo tool `document_to_pdf(markdown)` che ritorna
`{pdf_b64, size_bytes}`; `document_generate` esteso con il
parametro `output_format ∈ {md, pdf, both}` per emettere il PDF
contestualmente alla generazione del Markdown.
- pyproject.toml + uv.lock: aggiunte le dipendenze playwright>=1.48
e markdown-it-py[plugins]>=3.0.
- mcp-docugen.Dockerfile: nuova fase di runtime che installa le
librerie native richieste da Chromium (libnss3, libgbm1, ecc.) e
scarica il binario Chromium di Playwright in /opt/ms-playwright.
- 7 nuovi test unit (83 totali) che coprono lo split del frontmatter,
il rendering Markdown→HTML con tabelle, la traduzione delle
pdf_options camelCase→snake_case e l'errore su YAML invalido. Il
test E2E che richiede Chromium è marcato skip in unit; lo smoke
via MCP conferma generazione PDF da 134 KB / 4 pagine.
README aggiornato con le tre strade di conversione (server-side,
client-side, bundling) e la stima del nuovo costo immagine.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.4 KiB
Docker
41 lines
1.4 KiB
Docker
ARG BASE_TAG=latest
|
|
|
|
FROM arca-base:${BASE_TAG} AS builder
|
|
COPY services/mcp-docugen ./services/mcp-docugen
|
|
COPY themes ./themes
|
|
RUN uv sync --frozen --no-dev --package mcp-docugen
|
|
|
|
FROM python:3.11-slim AS runtime
|
|
LABEL org.opencontainers.image.source="https://git.tielogic.xyz/Adriano/ArcaSuite" \
|
|
arca.service="mcp-docugen"
|
|
|
|
WORKDIR /app
|
|
COPY --from=builder /app /app
|
|
ENV PATH="/app/.venv/bin:$PATH"
|
|
|
|
# Chromium runtime libs + Playwright browser bundle for PDF rendering.
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates wget xdg-utils \
|
|
libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
|
|
libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
|
|
libgbm1 libasound2 libatspi2.0-0 libpangocairo-1.0-0 \
|
|
libpango-1.0-0 libcairo2 libgtk-3-0 fonts-liberation fonts-inter \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright
|
|
RUN python -m playwright install chromium
|
|
|
|
RUN useradd -m -u 1000 app && \
|
|
mkdir -p /data && chown app:app /data && \
|
|
chown -R app:app /opt/ms-playwright
|
|
USER app
|
|
VOLUME ["/data"]
|
|
|
|
ENV HOST=0.0.0.0 PORT=9100 DATA_DIR=/data
|
|
EXPOSE 9100
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --retries=3 --start-period=15s \
|
|
CMD python -c "import httpx, os; httpx.get(f'http://localhost:{os.environ.get(\"PORT\",\"9100\")}/health').raise_for_status()"
|
|
|
|
CMD ["mcp-docugen"]
|