9798aed2cf
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>
78 lines
2.6 KiB
Go
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
|
|
}
|