Files
fn_registry/functions/browser/cdp_print_pdf.go
T
Egutierrez 9798aed2cf feat(browser): cdp_collect_console + cdp_print_pdf + cdp_select_option + cdp_set_file_input
Cuatro primitivas CDP nuevas para el dominio browser, base de nuevas tools del
browser_mcp:
- cdp_collect_console: snapshot temporal de console + exceptions + log entries
- cdp_print_pdf: Page.printToPDF -> []byte
- cdp_select_option: selecciona <option> en un <select> y dispara input/change
- cdp_set_file_input: sube archivos a un <input type=file> via DOM.setFileInputFiles

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 20:21:46 +02:00

78 lines
2.6 KiB
Go

package browser
import (
"encoding/base64"
"fmt"
)
// CdpPrintPDFOpts configura la generacion del PDF via Page.printToPDF.
type CdpPrintPDFOpts struct {
// Landscape orienta la pagina en horizontal cuando es true (vertical por defecto).
Landscape bool
// PrintBackground incluye los graficos de fondo (colores e imagenes CSS) cuando es true.
PrintBackground bool
// Scale es el factor de escala del renderizado (1.0 = tamano natural).
// Si es <= 0 se usa 1.0. Chrome acepta el rango [0.1, 2].
Scale float64
// PaperWidthIn es el ancho del papel en pulgadas. 0 deja el default del navegador (8.5in).
PaperWidthIn float64
// PaperHeightIn es el alto del papel en pulgadas. 0 deja el default del navegador (11in).
PaperHeightIn float64
}
// CdpPrintPDF genera un PDF de la pagina actual via el metodo CDP Page.printToPDF
// y devuelve los bytes del PDF ya decodificados, sin tocar el disco.
//
// Usa transferMode "ReturnAsBase64" (el default de CDP): Chrome devuelve el PDF
// completo como string base64 en el campo "data" de la respuesta, que esta
// funcion decodifica a []byte. Es robusto ante paginas grandes porque sendCDP
// espera la respuesta completa por el WebSocket antes de decodificar.
//
// Las opciones se traducen a los params de Page.printToPDF: Landscape,
// PrintBackground y Scale siempre se envian (con Scale forzado a 1.0 si opts pide
// <= 0). PaperWidthIn/PaperHeightIn solo se envian cuando son > 0, dejando el
// tamano de papel por defecto del navegador en caso contrario.
//
// Es la primitiva reutilizable de impresion a PDF: util para devolver el PDF al
// LLM como document content (bytes) o para que un caller lo persista a disco.
func CdpPrintPDF(c *CDPConn, opts CdpPrintPDFOpts) ([]byte, error) {
if c == nil {
return nil, fmt.Errorf("cdp print pdf: conexion nula")
}
scale := opts.Scale
if scale <= 0 {
scale = 1.0
}
params := map[string]any{
"transferMode": "ReturnAsBase64",
"landscape": opts.Landscape,
"printBackground": opts.PrintBackground,
"scale": scale,
}
if opts.PaperWidthIn > 0 {
params["paperWidth"] = opts.PaperWidthIn
}
if opts.PaperHeightIn > 0 {
params["paperHeight"] = opts.PaperHeightIn
}
result, err := c.sendCDP("Page.printToPDF", params)
if err != nil {
return nil, fmt.Errorf("cdp print pdf: %w", err)
}
dataStr, ok := result["data"].(string)
if !ok {
return nil, fmt.Errorf("cdp print pdf: campo data ausente en respuesta")
}
pdfData, err := base64.StdEncoding.DecodeString(dataStr)
if err != nil {
return nil, fmt.Errorf("cdp print pdf: decodificar base64: %w", err)
}
return pdfData, nil
}