[{"data":1,"prerenderedAt":1953},["ShallowReactive",2],{"blog-es-go-pdf-fpdf-archived":3},{"id":4,"title":5,"author":6,"body":9,"date":706,"description":1940,"draft":1941,"extension":1942,"howTo":1943,"image":1943,"meta":1944,"navigation":792,"path":1945,"seo":1946,"stem":1947,"tags":1948,"updated":1943,"__hash__":1952},"blogEs/es/blog/006.go-pdf-fpdf-archived.md","go-pdf/fpdf también archivado. El stack Go PDF de 2026.",{"name":7,"url":8},"gpdf team","https://gpdf.dev",{"type":10,"value":11,"toc":1924},"minimark",[12,17,47,51,70,73,90,102,106,109,144,151,155,161,177,184,193,199,203,206,391,394,407,419,425,431,434,438,445,448,490,493,731,747,751,767,770,775,1127,1132,1542,1561,1571,1575,1582,1679,1686,1692,1695,1703,1706,1755,1758,1762,1769,1778,1785,1789,1801,1807,1817,1836,1845,1851,1855,1858,1875,1889,1893,1920],[13,14,16],"h2",{"id":15},"tldr","TL;DR",[18,19,20,21,25,26,29,30,34,35,38,39,42,43,46],"p",{},"Los dos forks mantenidos del linaje ",[22,23,24],"code",{},"fpdf"," ya son de solo lectura. ",[22,27,28],{},"jung-kurt/gofpdf"," se archivó en ",[31,32,33],"strong",{},"septiembre de 2021","; el fork de la comunidad ",[22,36,37],{},"go-pdf/fpdf"," lo hizo en ",[31,40,41],{},"2025",". No viene ningún \"próximo mantenedor\". Para proyectos nuevos, ",[31,44,45],{},"gpdf"," es el valor por defecto moderno: Go puro, cero dependencias externas, CJK nativo, 10–30× más rápido en cargas habituales. Este post es un mapa del panorama en 2026 y una respuesta honesta a cuándo gpdf es la elección correcta y cuándo no.",[13,48,50],{"id":49},"la-situación","La situación",[18,52,53,54,57,58,62,63,66,67,69],{},"Un compañero tecleó ",[22,55,56],{},"go get github.com/go-pdf/fpdf"," la semana pasada y se quedó mirando el banner de GitHub: ",[59,60,61],"em",{},"\"This repository has been archived by the owner. It is now read-only.\""," Se suponía que esta era la versión ",[59,64,65],{},"arreglada"," — el fork de la comunidad de ",[22,68,28],{}," que iba a mantener vivo el linaje después de que el original se archivara en 2021.",[18,71,72],{},"Está archivado también. El README recomienda ahora mirar en otra parte.",[18,74,75,76,79,80,82,83,85,86,89],{},"Si llevas cinco años montando servicios en Go que emiten PDFs — facturas, informes, etiquetas de envío, documentos de facturación electrónica — la librería al fondo de tu ",[22,77,78],{},"go.mod"," casi con certeza ha sido una de estas dos. Las respuestas de Stack Overflow apuntan a ",[22,81,28],{},". Los tutoriales más recientes apuntan a ",[22,84,37],{},". ",[31,87,88],{},"Ahora las dos son una deuda de cadena de suministro",": sin triaje de CVE, sin trabajo de compatibilidad con nuevas versiones de Go, sin arreglos de rendimiento, sin actualizaciones de la especificación.",[18,91,92,93,98,99],{},"Este post no es otra guía de migración línea por línea — ",[94,95,97],"a",{"href":96},"/es/blog/gofpdf-migration","esa ya la escribimos",". Es la versión larga de la pregunta que la guía de migración no responde: ",[31,100,101],{},"¿qué funciona realmente para generar PDF con Go en 2026, y cómo hemos llegado aquí?",[13,103,105],{"id":104},"lo-que-archivado-te-cuesta-en-la-práctica","Lo que \"archivado\" te cuesta en la práctica",[18,107,108],{},"La palabra \"archivado\" en GitHub suena suave. En la práctica, para una librería en tu grafo de imports, significa cuatro cosas muy concretas:",[110,111,112,119,129,135],"ol",{},[113,114,115,118],"li",{},[31,116,117],{},"Sin parches de seguridad."," Si aparece un fallo de seguridad de memoria en el parser de TTF, nadie va a mergear el fix upstream. Puedes forkearlo tú. La mayoría de los equipos no lo harán.",[113,120,121,124,125,128],{},[31,122,123],{},"Sin compatibilidad hacia adelante con el toolchain de Go."," La semántica de variables de bucle de Go 1.25 funciona bien con gofpdf hoy. Algo alrededor de ",[22,126,127],{},"for range",", o una deprecación de la stdlib, puede romper el build mañana. Y el que parcheará un fork de un repo en solo lectura serás tú.",[113,130,131,134],{},[31,132,133],{},"Sin actualizaciones de la especificación."," PDF 2.0 (ISO 32000-2) salió en 2020. gofpdf implementa en su mayor parte PDF 1.7. Cosas como archivos asociados a nivel de página, metadatos XMP ricos o firmas digitales modernas (PAdES-B-LT) están ausentes o se parchean con pegamento de terceros.",[113,136,137,140,141,143],{},[31,138,139],{},"Sin progreso en CJK."," El camino Unicode de gofpdf se retrofittó sobre un diseño de fuentes de un byte. Funciona, pero empotra fuentes completas en lugar de subsets en la mayoría de las configuraciones reales, y ciertos TTF de CJK producen colisiones de glyph-id con salida corrupta. ",[22,142,37],{}," heredó la misma arquitectura.",[18,145,146,147,150],{},"Seguridad y compatibilidad hacia adelante son las que muerden en conversaciones de compliance. \"Nuestra librería PDF está archivada y no recibe parches de CVE\" no es una respuesta que el auditor quiera oír. ",[31,148,149],{},"Si manejas facturas electrónicas dentro del ámbito de la AEAT o la Agencia Tributaria en LatAm, esto tampoco se puede posponer",".",[13,152,154],{"id":153},"por-qué-murieron-ambos-forks","Por qué murieron ambos forks",[18,156,157,158],{},"Es tentador explicar los archivados como burnout del mantenedor — una sola persona cansada de revisar PRs, un bus factor de uno que se desconecta. Eso es parte, pero no es toda la historia. ",[31,159,160],{},"La arquitectura hacía difícil seguir el ritmo.",[18,162,163,165,166,169,170,169,173,176],{},[22,164,28],{}," era un port de FPDF, una librería PHP de 2002. El original PHP empujaba un cursor por la página y emitía contenido procedural: ",[22,167,168],{},"SetXY(x, y)",", ",[22,171,172],{},"Cell(w, h, text)",[22,174,175],{},"Ln(h)",". Ese modelo era un ajuste razonable para el PHP de 2002, donde la alternativa era PostScript crudo o toolkits propietarios. Al portarse a Go, mantuvo el cursor, mantuvo las tablas de fuentes de un byte, mantuvo la gestión manual de saltos de página.",[18,178,179,180,183],{},"Cada año, la brecha entre lo que la gente quería generar y lo que el modelo de cursor podía expresar crecía. Las facturas son tablas. Los informes son cuadrículas con chrome repetitivo. Las etiquetas de envío son códigos QR más texto en idioma local. El cursor se envolvió en helpers, los helpers en tutoriales, y para 2023 la mayor parte del código que la gente escribía ",[59,181,182],{},"contra"," gofpdf no era gofpdf — era una capa de pegamento por equipo que intentaba fingir que el cursor era un motor de layout.",[18,185,186,188,189,192],{},[22,187,37],{}," heredó todo esto. El fork refactorizó los internos y arregló bugs antiguos, pero ",[31,190,191],{},"no podía cambiar la API pública"," sin romper todos los proyectos aguas abajo. La forma de la librería estaba congelada en el PHP de 2002, y el coste de mantener esa forma crecía más rápido que el beneficio.",[18,194,195,198],{},[31,196,197],{},"Así que",": dos mantenedores, dos archivados, una razón arquitectónica. Reconstruir en 2026 significa elegir un enfoque que encaje con cómo se producen PDFs hoy — que se parece mucho más a construir una página web que a manejar un plotter.",[13,200,202],{"id":201},"el-panorama-go-pdf-en-2026","El panorama Go PDF en 2026",[18,204,205],{},"Antes de recomendar nada, aquí está el campo. Usaré \"mantenido\" de forma laxa para decir \"un commit en los últimos 6 meses e issues con respuesta\".",[207,208,209,234],"table",{},[210,211,212],"thead",{},[213,214,215,219,222,225,228,231],"tr",{},[216,217,218],"th",{},"Librería",[216,220,221],{},"Estado (2026-04)",[216,223,224],{},"Licencia",[216,226,227],{},"CJK nativo",[216,229,230],{},"Cero deps",[216,232,233],{},"Notas",[235,236,237,261,281,301,325,346,369],"tbody",{},[213,238,239,244,249,252,255,258],{},[240,241,242],"td",{},[22,243,28],{},[240,245,246],{},[31,247,248],{},"Archivada 2021",[240,250,251],{},"MIT",[240,253,254],{},"Retrofit",[240,256,257],{},"Sí",[240,259,260],{},"La original. Todavía el primer resultado de búsqueda en casi todos los idiomas.",[213,262,263,267,272,274,276,278],{},[240,264,265],{},[22,266,37],{},[240,268,269],{},[31,270,271],{},"Archivada 2025",[240,273,251],{},[240,275,254],{},[240,277,257],{},[240,279,280],{},"Fork comunitario de la anterior. Misma arquitectura, mismo techo.",[213,282,283,288,291,293,296,298],{},[240,284,285],{},[22,286,287],{},"signintech/gopdf",[240,289,290],{},"Mantenida",[240,292,251],{},[240,294,295],{},"Parcial",[240,297,257],{},[240,299,300],{},"Bajo nivel. Escribes coordenadas. Bueno para overlays de formularios.",[213,302,303,309,311,313,316,319],{},[240,304,305,308],{},[22,306,307],{},"johnfercher/maroto"," v2",[240,310,290],{},[240,312,251],{},[240,314,315],{},"Vía gofpdf",[240,317,318],{},"No",[240,320,321,322,324],{},"Builder con grid, pero depende de ",[22,323,37],{}," por debajo.",[213,326,327,332,334,339,341,343],{},[240,328,329],{},[22,330,331],{},"unidoc/unipdf",[240,333,290],{},[240,335,336],{},[31,337,338],{},"Comercial",[240,340,257],{},[240,342,318],{},[240,344,345],{},"SDK PDF completo. Licencia de pago obligatoria para uso comercial.",[213,347,348,354,356,359,361,366],{},[240,349,350,353],{},[22,351,352],{},"chromedp"," + Chromium",[240,355,290],{},[240,357,358],{},"MIT + Chrome",[240,360,257],{},[240,362,363],{},[31,364,365],{},"No — trae un navegador",[240,367,368],{},"HTML→PDF vía Chrome headless. Runtime enorme.",[213,370,371,375,377,379,384,388],{},[240,372,373],{},[22,374,45],{},[240,376,290],{},[240,378,251],{},[240,380,381],{},[31,382,383],{},"Nativo",[240,385,386],{},[31,387,257],{},[240,389,390],{},"Reimplementación en Go puro. API builder, grid de 12 columnas.",[18,392,393],{},"Lo que la tabla deja ver sin ejecutar nada:",[18,395,396,399,400,402,403,406],{},[31,397,398],{},"Todo lo mantenido es comercial, trae un runtime enorme o se apoya en un cimiento a punto de quedar obsoleto."," ",[22,401,287],{}," es la excepción — genuinamente mantenida y de pocas dependencias — pero es una librería a nivel de coordenadas. Vuelves a ",[22,404,405],{},"SetXY"," con otro nombre de paquete.",[18,408,409,412,413,415,416,418],{},[31,410,411],{},"Maroto v2 es un builder con grid y una buena API."," El problema es que al fondo de su ",[22,414,78],{}," está ",[22,417,37],{},". Todo techo de rendimiento y toda limitación de CJK en fpdf es también techo para Maroto. Una v3 mayor podría liberarse de eso — todavía no ha salido.",[18,420,421,424],{},[31,422,423],{},"unipdf es rico en funcionalidad pero no compatible con MIT para uso comercial."," Pagas por asiento o por despliegue. Es una elección válida si tus ingresos lo soportan; para un side project OSS o una startup temprana, las cuentas de la licencia no salen.",[18,426,427,430],{},[31,428,429],{},"chromedp funciona, pero estás enviando un navegador."," Una imagen base de 100 MB se convierte en una de 1 GB+. El arranque en frío en serverless es doloroso. Las fuentes igualmente hay que instalarlas en el contenedor. La ventaja es que puedes reutilizar plantillas de React; la desventaja es que estás corriendo Chromium para renderizar una factura.",[18,432,433],{},"El hueco es obvio: una librería en Go puro, sin deps, con CJK nativo, orientada a grid, que no requiere licencia comercial ni runtime de navegador. Eso es gpdf.",[13,435,437],{"id":436},"qué-es-gpdf","Qué es gpdf",[18,439,440,441,444],{},"gpdf (",[22,442,443],{},"github.com/gpdf-dev/gpdf",") es una reimplementación limpia. No es un fork. El writer del formato PDF, el motor de layout y el subsetter de TrueType están todos escritos desde cero en Go puro.",[18,446,447],{},"Las tres propiedades que importan para la mayoría de equipos:",[449,450,451,464,481],"ul",{},[113,452,453,399,456,459,460,463],{},[31,454,455],{},"Go puro, sin CGO.",[22,457,458],{},"go build"," es estático. ",[22,461,462],{},"GOOS=linux GOARCH=arm64 go build"," funciona desde una MacBook sin configuración de toolchain. Las imágenes Docker se mantienen pequeñas — un contenedor distroless de 12 MB lo corre.",[113,465,466,399,469,472,473,476,477,480],{},[31,467,468],{},"Cero dependencias externas.",[22,470,471],{},"go mod graph"," tras ",[22,474,475],{},"go get github.com/gpdf-dev/gpdf"," muestra una sola línea: gpdf. El core usa solo ",[22,478,479],{},"std",". (Los add-ons opcionales para HTML→PDF o firmas digitales traen pequeñas dependencias, y son opt-in.)",[113,482,483,399,486,489],{},[31,484,485],{},"CJK nativo.",[22,487,488],{},"WithFont"," registra una fuente TrueType al construir el documento. El subset embedding pasa en tiempo de render. Una factura de 200 caracteres en japonés carga ~30 KB de subset de fuente, no 5 MB de fuente completa.",[18,491,492],{},"La forma de la API es declarativa. Describes un árbol de filas y columnas; el motor de layout las coloca. El grid es de 12 columnas — el mismo idioma que Bootstrap lleva enviando desde 2011. Si has escrito una línea de HTML/CSS, la API de gpdf te resulta familiar:",[494,495,500],"pre",{"className":496,"code":497,"language":498,"meta":499,"style":499},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","page := doc.AddPage()\npage.AutoRow(func(r *template.RowBuilder) {\n    r.Col(8, func(c *template.ColBuilder) {\n        c.Text(\"Factura #2026-0416\", template.FontSize(18), template.Bold())\n    })\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"2026-04-16\", template.AlignRight())\n    })\n})\n","go","",[22,501,502,527,563,603,653,659,691,720,725],{"__ignoreMap":499},[503,504,507,511,515,518,520,524],"span",{"class":505,"line":506},"line",1,[503,508,510],{"class":509},"sTEyZ","page ",[503,512,514],{"class":513},"sMK4o",":=",[503,516,517],{"class":509}," doc",[503,519,150],{"class":513},[503,521,523],{"class":522},"s2Zo4","AddPage",[503,525,526],{"class":513},"()\n",[503,528,530,533,535,538,541,545,548,552,554,557,560],{"class":505,"line":529},2,[503,531,532],{"class":509},"page",[503,534,150],{"class":513},[503,536,537],{"class":522},"AutoRow",[503,539,540],{"class":513},"(func(",[503,542,544],{"class":543},"sHdIc","r",[503,546,547],{"class":513}," *",[503,549,551],{"class":550},"sBMFI","template",[503,553,150],{"class":513},[503,555,556],{"class":550},"RowBuilder",[503,558,559],{"class":513},")",[503,561,562],{"class":513}," {\n",[503,564,566,569,571,574,577,581,584,587,590,592,594,596,599,601],{"class":505,"line":565},3,[503,567,568],{"class":509},"    r",[503,570,150],{"class":513},[503,572,573],{"class":522},"Col",[503,575,576],{"class":513},"(",[503,578,580],{"class":579},"sbssI","8",[503,582,583],{"class":513},",",[503,585,586],{"class":513}," func(",[503,588,589],{"class":543},"c",[503,591,547],{"class":513},[503,593,551],{"class":550},[503,595,150],{"class":513},[503,597,598],{"class":550},"ColBuilder",[503,600,559],{"class":513},[503,602,562],{"class":513},[503,604,606,609,611,614,616,619,623,625,627,630,632,635,637,640,643,645,647,650],{"class":505,"line":605},4,[503,607,608],{"class":509},"        c",[503,610,150],{"class":513},[503,612,613],{"class":522},"Text",[503,615,576],{"class":513},[503,617,618],{"class":513},"\"",[503,620,622],{"class":621},"sfazB","Factura #2026-0416",[503,624,618],{"class":513},[503,626,583],{"class":513},[503,628,629],{"class":509}," template",[503,631,150],{"class":513},[503,633,634],{"class":522},"FontSize",[503,636,576],{"class":513},[503,638,639],{"class":579},"18",[503,641,642],{"class":513},"),",[503,644,629],{"class":509},[503,646,150],{"class":513},[503,648,649],{"class":522},"Bold",[503,651,652],{"class":513},"())\n",[503,654,656],{"class":505,"line":655},5,[503,657,658],{"class":513},"    })\n",[503,660,662,664,666,668,670,673,675,677,679,681,683,685,687,689],{"class":505,"line":661},6,[503,663,568],{"class":509},[503,665,150],{"class":513},[503,667,573],{"class":522},[503,669,576],{"class":513},[503,671,672],{"class":579},"4",[503,674,583],{"class":513},[503,676,586],{"class":513},[503,678,589],{"class":543},[503,680,547],{"class":513},[503,682,551],{"class":550},[503,684,150],{"class":513},[503,686,598],{"class":550},[503,688,559],{"class":513},[503,690,562],{"class":513},[503,692,694,696,698,700,702,704,707,709,711,713,715,718],{"class":505,"line":693},7,[503,695,608],{"class":509},[503,697,150],{"class":513},[503,699,613],{"class":522},[503,701,576],{"class":513},[503,703,618],{"class":513},[503,705,706],{"class":621},"2026-04-16",[503,708,618],{"class":513},[503,710,583],{"class":513},[503,712,629],{"class":509},[503,714,150],{"class":513},[503,716,717],{"class":522},"AlignRight",[503,719,652],{"class":513},[503,721,723],{"class":505,"line":722},8,[503,724,658],{"class":513},[503,726,728],{"class":505,"line":727},9,[503,729,730],{"class":513},"})\n",[18,732,733,734,738,739,742,743,746],{},"Más sobre el grid en ",[94,735,737],{"href":736},"/es/blog/12-column-grid","¿Cómo funciona la cuadrícula de 12 columnas de gpdf?",". Versión en una frase: ",[22,740,741],{},"Col(span, fn)"," toma un span de 1 a 12, y ",[22,744,745],{},"span / 12"," es la fracción de la fila que ocupa.",[13,748,750],{"id":749},"el-diff-mínimo-go-pdffpdf-gpdf","El diff mínimo go-pdf/fpdf → gpdf",[18,752,753,754,756,757,759,760,762,763,766],{},"Si vienes específicamente de ",[22,755,37],{}," (no de ",[22,758,28],{},"), la buena noticia es que las superficies de API son casi idénticas — ",[22,761,37],{}," es un fork que apenas cambió nada a nivel de call site. La migración a gpdf es la misma que recorre nuestra ",[94,764,765],{"href":96},"guía de gofpdf",", con un renombrado de ruta de import.",[18,768,769],{},"El diff más pequeño posible — un handler HTTP que \"devuelve un PDF\":",[18,771,772],{},[31,773,774],{},"Before — go-pdf/fpdf:",[494,776,778],{"className":496,"code":777,"language":498,"meta":499,"style":499},"package main\n\nimport (\n    \"net/http\"\n\n    \"github.com/go-pdf/fpdf\"\n)\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n    pdf := fpdf.New(\"P\", \"mm\", \"A4\", \"\")\n    pdf.AddPage()\n    pdf.SetFont(\"Arial\", \"B\", 16)\n    pdf.Cell(40, 10, \"Hello, World!\")\n\n    w.Header().Set(\"Content-Type\", \"application/pdf\")\n    if err := pdf.Output(w); err != nil {\n        http.Error(w, err.Error(), 500)\n    }\n}\n",[22,779,780,788,794,803,814,818,827,832,836,876,927,939,974,1005,1010,1047,1083,1115,1121],{"__ignoreMap":499},[503,781,782,785],{"class":505,"line":506},[503,783,784],{"class":513},"package",[503,786,787],{"class":550}," main\n",[503,789,790],{"class":505,"line":529},[503,791,793],{"emptyLinePlaceholder":792},true,"\n",[503,795,796,800],{"class":505,"line":565},[503,797,799],{"class":798},"s7zQu","import",[503,801,802],{"class":513}," (\n",[503,804,805,808,811],{"class":505,"line":605},[503,806,807],{"class":513},"    \"",[503,809,810],{"class":550},"net/http",[503,812,813],{"class":513},"\"\n",[503,815,816],{"class":505,"line":655},[503,817,793],{"emptyLinePlaceholder":792},[503,819,820,822,825],{"class":505,"line":661},[503,821,807],{"class":513},[503,823,824],{"class":550},"github.com/go-pdf/fpdf",[503,826,813],{"class":513},[503,828,829],{"class":505,"line":693},[503,830,831],{"class":513},")\n",[503,833,834],{"class":505,"line":722},[503,835,793],{"emptyLinePlaceholder":792},[503,837,838,841,844,846,849,852,854,857,859,862,864,867,869,872,874],{"class":505,"line":727},[503,839,840],{"class":513},"func",[503,842,843],{"class":522}," handler",[503,845,576],{"class":513},[503,847,848],{"class":543},"w",[503,850,851],{"class":550}," http",[503,853,150],{"class":513},[503,855,856],{"class":550},"ResponseWriter",[503,858,583],{"class":513},[503,860,861],{"class":543}," r",[503,863,547],{"class":513},[503,865,866],{"class":550},"http",[503,868,150],{"class":513},[503,870,871],{"class":550},"Request",[503,873,559],{"class":513},[503,875,562],{"class":513},[503,877,879,882,884,887,889,892,894,896,899,901,903,906,909,911,913,915,918,920,922,925],{"class":505,"line":878},10,[503,880,881],{"class":509},"    pdf ",[503,883,514],{"class":513},[503,885,886],{"class":509}," fpdf",[503,888,150],{"class":513},[503,890,891],{"class":522},"New",[503,893,576],{"class":513},[503,895,618],{"class":513},[503,897,898],{"class":621},"P",[503,900,618],{"class":513},[503,902,583],{"class":513},[503,904,905],{"class":513}," \"",[503,907,908],{"class":621},"mm",[503,910,618],{"class":513},[503,912,583],{"class":513},[503,914,905],{"class":513},[503,916,917],{"class":621},"A4",[503,919,618],{"class":513},[503,921,583],{"class":513},[503,923,924],{"class":513}," \"\"",[503,926,831],{"class":513},[503,928,930,933,935,937],{"class":505,"line":929},11,[503,931,932],{"class":509},"    pdf",[503,934,150],{"class":513},[503,936,523],{"class":522},[503,938,526],{"class":513},[503,940,942,944,946,949,951,953,956,958,960,962,965,967,969,972],{"class":505,"line":941},12,[503,943,932],{"class":509},[503,945,150],{"class":513},[503,947,948],{"class":522},"SetFont",[503,950,576],{"class":513},[503,952,618],{"class":513},[503,954,955],{"class":621},"Arial",[503,957,618],{"class":513},[503,959,583],{"class":513},[503,961,905],{"class":513},[503,963,964],{"class":621},"B",[503,966,618],{"class":513},[503,968,583],{"class":513},[503,970,971],{"class":579}," 16",[503,973,831],{"class":513},[503,975,977,979,981,984,986,989,991,994,996,998,1001,1003],{"class":505,"line":976},13,[503,978,932],{"class":509},[503,980,150],{"class":513},[503,982,983],{"class":522},"Cell",[503,985,576],{"class":513},[503,987,988],{"class":579},"40",[503,990,583],{"class":513},[503,992,993],{"class":579}," 10",[503,995,583],{"class":513},[503,997,905],{"class":513},[503,999,1000],{"class":621},"Hello, World!",[503,1002,618],{"class":513},[503,1004,831],{"class":513},[503,1006,1008],{"class":505,"line":1007},14,[503,1009,793],{"emptyLinePlaceholder":792},[503,1011,1013,1016,1018,1021,1024,1027,1029,1031,1034,1036,1038,1040,1043,1045],{"class":505,"line":1012},15,[503,1014,1015],{"class":509},"    w",[503,1017,150],{"class":513},[503,1019,1020],{"class":522},"Header",[503,1022,1023],{"class":513},"().",[503,1025,1026],{"class":522},"Set",[503,1028,576],{"class":513},[503,1030,618],{"class":513},[503,1032,1033],{"class":621},"Content-Type",[503,1035,618],{"class":513},[503,1037,583],{"class":513},[503,1039,905],{"class":513},[503,1041,1042],{"class":621},"application/pdf",[503,1044,618],{"class":513},[503,1046,831],{"class":513},[503,1048,1050,1053,1056,1058,1061,1063,1066,1068,1070,1073,1075,1078,1081],{"class":505,"line":1049},16,[503,1051,1052],{"class":798},"    if",[503,1054,1055],{"class":509}," err ",[503,1057,514],{"class":513},[503,1059,1060],{"class":509}," pdf",[503,1062,150],{"class":513},[503,1064,1065],{"class":522},"Output",[503,1067,576],{"class":513},[503,1069,848],{"class":509},[503,1071,1072],{"class":513},");",[503,1074,1055],{"class":509},[503,1076,1077],{"class":513},"!=",[503,1079,1080],{"class":513}," nil",[503,1082,562],{"class":513},[503,1084,1086,1089,1091,1094,1096,1098,1100,1103,1105,1107,1110,1113],{"class":505,"line":1085},17,[503,1087,1088],{"class":509},"        http",[503,1090,150],{"class":513},[503,1092,1093],{"class":522},"Error",[503,1095,576],{"class":513},[503,1097,848],{"class":509},[503,1099,583],{"class":513},[503,1101,1102],{"class":509}," err",[503,1104,150],{"class":513},[503,1106,1093],{"class":522},[503,1108,1109],{"class":513},"(),",[503,1111,1112],{"class":579}," 500",[503,1114,831],{"class":513},[503,1116,1118],{"class":505,"line":1117},18,[503,1119,1120],{"class":513},"    }\n",[503,1122,1124],{"class":505,"line":1123},19,[503,1125,1126],{"class":513},"}\n",[18,1128,1129],{},[31,1130,1131],{},"After — gpdf:",[494,1133,1135],{"className":496,"code":1134,"language":498,"meta":499,"style":499},"package main\n\nimport (\n    \"net/http\"\n\n    \"github.com/gpdf-dev/gpdf\"\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(document.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"Hello, World!\", template.FontSize(16), template.Bold())\n        })\n    })\n\n    w.Header().Set(\"Content-Type\", \"application/pdf\")\n    if err := doc.Render(w); err != nil {\n        http.Error(w, err.Error(), 500)\n    }\n}\n",[22,1136,1137,1143,1147,1153,1161,1165,1173,1182,1191,1195,1199,1231,1249,1271,1306,1311,1315,1330,1355,1387,1428,1434,1439,1444,1475,1505,1532,1537],{"__ignoreMap":499},[503,1138,1139,1141],{"class":505,"line":506},[503,1140,784],{"class":513},[503,1142,787],{"class":550},[503,1144,1145],{"class":505,"line":529},[503,1146,793],{"emptyLinePlaceholder":792},[503,1148,1149,1151],{"class":505,"line":565},[503,1150,799],{"class":798},[503,1152,802],{"class":513},[503,1154,1155,1157,1159],{"class":505,"line":605},[503,1156,807],{"class":513},[503,1158,810],{"class":550},[503,1160,813],{"class":513},[503,1162,1163],{"class":505,"line":655},[503,1164,793],{"emptyLinePlaceholder":792},[503,1166,1167,1169,1171],{"class":505,"line":661},[503,1168,807],{"class":513},[503,1170,443],{"class":550},[503,1172,813],{"class":513},[503,1174,1175,1177,1180],{"class":505,"line":693},[503,1176,807],{"class":513},[503,1178,1179],{"class":550},"github.com/gpdf-dev/gpdf/document",[503,1181,813],{"class":513},[503,1183,1184,1186,1189],{"class":505,"line":722},[503,1185,807],{"class":513},[503,1187,1188],{"class":550},"github.com/gpdf-dev/gpdf/template",[503,1190,813],{"class":513},[503,1192,1193],{"class":505,"line":727},[503,1194,831],{"class":513},[503,1196,1197],{"class":505,"line":878},[503,1198,793],{"emptyLinePlaceholder":792},[503,1200,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229],{"class":505,"line":929},[503,1202,840],{"class":513},[503,1204,843],{"class":522},[503,1206,576],{"class":513},[503,1208,848],{"class":543},[503,1210,851],{"class":550},[503,1212,150],{"class":513},[503,1214,856],{"class":550},[503,1216,583],{"class":513},[503,1218,861],{"class":543},[503,1220,547],{"class":513},[503,1222,866],{"class":550},[503,1224,150],{"class":513},[503,1226,871],{"class":550},[503,1228,559],{"class":513},[503,1230,562],{"class":513},[503,1232,1233,1236,1238,1241,1243,1246],{"class":505,"line":941},[503,1234,1235],{"class":509},"    doc ",[503,1237,514],{"class":513},[503,1239,1240],{"class":509}," gpdf",[503,1242,150],{"class":513},[503,1244,1245],{"class":522},"NewDocument",[503,1247,1248],{"class":513},"(\n",[503,1250,1251,1254,1256,1259,1261,1264,1266,1268],{"class":505,"line":976},[503,1252,1253],{"class":509},"        gpdf",[503,1255,150],{"class":513},[503,1257,1258],{"class":522},"WithPageSize",[503,1260,576],{"class":513},[503,1262,1263],{"class":509},"document",[503,1265,150],{"class":513},[503,1267,917],{"class":509},[503,1269,1270],{"class":513},"),\n",[503,1272,1273,1275,1277,1280,1282,1284,1286,1289,1291,1293,1295,1298,1300,1303],{"class":505,"line":1007},[503,1274,1253],{"class":509},[503,1276,150],{"class":513},[503,1278,1279],{"class":522},"WithMargins",[503,1281,576],{"class":513},[503,1283,1263],{"class":509},[503,1285,150],{"class":513},[503,1287,1288],{"class":522},"UniformEdges",[503,1290,576],{"class":513},[503,1292,1263],{"class":509},[503,1294,150],{"class":513},[503,1296,1297],{"class":522},"Mm",[503,1299,576],{"class":513},[503,1301,1302],{"class":579},"20",[503,1304,1305],{"class":513},"))),\n",[503,1307,1308],{"class":505,"line":1012},[503,1309,1310],{"class":513},"    )\n",[503,1312,1313],{"class":505,"line":1049},[503,1314,793],{"emptyLinePlaceholder":792},[503,1316,1317,1320,1322,1324,1326,1328],{"class":505,"line":1085},[503,1318,1319],{"class":509},"    page ",[503,1321,514],{"class":513},[503,1323,517],{"class":509},[503,1325,150],{"class":513},[503,1327,523],{"class":522},[503,1329,526],{"class":513},[503,1331,1332,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353],{"class":505,"line":1117},[503,1333,1334],{"class":509},"    page",[503,1336,150],{"class":513},[503,1338,537],{"class":522},[503,1340,540],{"class":513},[503,1342,544],{"class":543},[503,1344,547],{"class":513},[503,1346,551],{"class":550},[503,1348,150],{"class":513},[503,1350,556],{"class":550},[503,1352,559],{"class":513},[503,1354,562],{"class":513},[503,1356,1357,1360,1362,1364,1366,1369,1371,1373,1375,1377,1379,1381,1383,1385],{"class":505,"line":1123},[503,1358,1359],{"class":509},"        r",[503,1361,150],{"class":513},[503,1363,573],{"class":522},[503,1365,576],{"class":513},[503,1367,1368],{"class":579},"12",[503,1370,583],{"class":513},[503,1372,586],{"class":513},[503,1374,589],{"class":543},[503,1376,547],{"class":513},[503,1378,551],{"class":550},[503,1380,150],{"class":513},[503,1382,598],{"class":550},[503,1384,559],{"class":513},[503,1386,562],{"class":513},[503,1388,1390,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413,1415,1418,1420,1422,1424,1426],{"class":505,"line":1389},20,[503,1391,1392],{"class":509},"            c",[503,1394,150],{"class":513},[503,1396,613],{"class":522},[503,1398,576],{"class":513},[503,1400,618],{"class":513},[503,1402,1000],{"class":621},[503,1404,618],{"class":513},[503,1406,583],{"class":513},[503,1408,629],{"class":509},[503,1410,150],{"class":513},[503,1412,634],{"class":522},[503,1414,576],{"class":513},[503,1416,1417],{"class":579},"16",[503,1419,642],{"class":513},[503,1421,629],{"class":509},[503,1423,150],{"class":513},[503,1425,649],{"class":522},[503,1427,652],{"class":513},[503,1429,1431],{"class":505,"line":1430},21,[503,1432,1433],{"class":513},"        })\n",[503,1435,1437],{"class":505,"line":1436},22,[503,1438,658],{"class":513},[503,1440,1442],{"class":505,"line":1441},23,[503,1443,793],{"emptyLinePlaceholder":792},[503,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473],{"class":505,"line":1446},24,[503,1448,1015],{"class":509},[503,1450,150],{"class":513},[503,1452,1020],{"class":522},[503,1454,1023],{"class":513},[503,1456,1026],{"class":522},[503,1458,576],{"class":513},[503,1460,618],{"class":513},[503,1462,1033],{"class":621},[503,1464,618],{"class":513},[503,1466,583],{"class":513},[503,1468,905],{"class":513},[503,1470,1042],{"class":621},[503,1472,618],{"class":513},[503,1474,831],{"class":513},[503,1476,1478,1480,1482,1484,1486,1488,1491,1493,1495,1497,1499,1501,1503],{"class":505,"line":1477},25,[503,1479,1052],{"class":798},[503,1481,1055],{"class":509},[503,1483,514],{"class":513},[503,1485,517],{"class":509},[503,1487,150],{"class":513},[503,1489,1490],{"class":522},"Render",[503,1492,576],{"class":513},[503,1494,848],{"class":509},[503,1496,1072],{"class":513},[503,1498,1055],{"class":509},[503,1500,1077],{"class":513},[503,1502,1080],{"class":513},[503,1504,562],{"class":513},[503,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530],{"class":505,"line":1507},26,[503,1509,1088],{"class":509},[503,1511,150],{"class":513},[503,1513,1093],{"class":522},[503,1515,576],{"class":513},[503,1517,848],{"class":509},[503,1519,583],{"class":513},[503,1521,1102],{"class":509},[503,1523,150],{"class":513},[503,1525,1093],{"class":522},[503,1527,1109],{"class":513},[503,1529,1112],{"class":579},[503,1531,831],{"class":513},[503,1533,1535],{"class":505,"line":1534},27,[503,1536,1120],{"class":513},[503,1538,1540],{"class":505,"line":1539},28,[503,1541,1126],{"class":513},[18,1543,1544,1545,1547,1548,1551,1552,1555,1556,1560],{},"Tres líneas de código de cursor se convierten en tres llamadas de builder. La estructura aparece en la fuente en lugar de esconderse dentro del orden de llamadas a ",[22,1546,983],{},". Para CJK, añade ",[22,1549,1550],{},"gpdf.WithFont(\"NotoSansJP\", ttfBytes)"," — sin ",[22,1553,1554],{},"AddUTF8Font",", sin ruta del filesystem, sin flag UTF-8. Ver ",[94,1557,1559],{"href":1558},"/es/blog/embed-japanese-font","¿Cómo incrusto una fuente japonesa en gpdf?"," para el recorrido completo.",[18,1562,1563,1564,1567,1568,1570],{},"La ",[94,1565,1566],{"href":96},"guía de migración de gofpdf"," tiene cinco pares before/after más, cubriendo tablas, cabeceras/pies repetidos, numeración de páginas y posicionamiento absoluto. Todo lo que hay allí aplica literalmente a usuarios de ",[22,1569,37],{}," — basta con cambiar la ruta de import.",[13,1572,1574],{"id":1573},"la-foto-de-benchmarks","La foto de benchmarks",[18,1576,1577,1578,1581],{},"\"Rápido\" es fácil de afirmar y difícil de ganar. La tabla de abajo es de ",[22,1579,1580],{},"gpdf/_benchmark/benchmark_test.go"," en un Apple M1 con Go 1.25. Las cargas son lo que realmente hace el código de producción — no micro-benchmarks elegidos para adular a una librería.",[207,1583,1584,1602],{},[210,1585,1586],{},[213,1587,1588,1591,1593,1596,1599],{},[216,1589,1590],{},"Benchmark",[216,1592,45],{},[216,1594,1595],{},"gofpdf",[216,1597,1598],{},"gopdf",[216,1600,1601],{},"Maroto v2",[235,1603,1604,1623,1642,1660],{},[213,1605,1606,1609,1614,1617,1620],{},[240,1607,1608],{},"Página simple (hello)",[240,1610,1611],{},[31,1612,1613],{},"13 µs",[240,1615,1616],{},"132 µs",[240,1618,1619],{},"423 µs",[240,1621,1622],{},"237 µs",[213,1624,1625,1628,1633,1636,1639],{},[240,1626,1627],{},"Tabla 4×10 de líneas",[240,1629,1630],{},[31,1631,1632],{},"108 µs",[240,1634,1635],{},"241 µs",[240,1637,1638],{},"835 µs",[240,1640,1641],{},"8.6 ms",[213,1643,1644,1647,1652,1655,1657],{},[240,1645,1646],{},"Informe de 100 páginas",[240,1648,1649],{},[31,1650,1651],{},"683 µs",[240,1653,1654],{},"11.7 ms",[240,1656,1641],{},[240,1658,1659],{},"19.8 ms",[213,1661,1662,1665,1670,1673,1676],{},[240,1663,1664],{},"Factura CJK compleja",[240,1666,1667],{},[31,1668,1669],{},"133 µs",[240,1671,1672],{},"254 µs",[240,1674,1675],{},"997 µs",[240,1677,1678],{},"10.4 ms",[18,1680,1681,1682,1685],{},"A 13 µs por página simple, un core produce ~75.000 PDFs hello-world por segundo. A 108 µs por factura, ~9.000 por segundo. ",[31,1683,1684],{},"El punto no es presumir de cifras","; es que puedes dejar de pensar en si cachear o pasar a cola asíncrona la generación de PDF. Para la mayoría de cargas, generar en la ruta de la petición está bien.",[18,1687,1688,1689,1691],{},"Maroto v2 sale lento en la tabla porque empuja ",[22,1690,37],{}," por debajo y añade su propio paso de layout encima. No es crítica de la API de Maroto — la API está bien — es el coste estructural de sentarse sobre la base fpdf. Cuando Maroto v3 suelte la dependencia de fpdf, esta columna cambiará.",[18,1693,1694],{},"El benchmark de 100 páginas merece insistencia. El writer de gpdf emite contenido a medida que las filas se maquetan; gofpdf bufferiza más estado por página. Para cargas pesadas en paginación (informes mensuales, catálogos, exportaciones de compliance), la diferencia es de minutos contra segundos en la zona alta de tamaños.",[13,1696,1698,1699,1702],{"id":1697},"cuándo-gpdf-no-es-la-elección-correcta","Cuándo gpdf ",[59,1700,1701],{},"no"," es la elección correcta",[18,1704,1705],{},"Todo post de migración tiene que responder \"¿cuándo no cambiar?\" Respuestas honestas:",[449,1707,1708,1721,1730,1742],{},[113,1709,1710,1713,1714,1717,1718,1720],{},[31,1711,1712],{},"AcroForm / formularios rellenables."," Si tu caso es generar PDFs que los usuarios abren en Acrobat y rellenan, el soporte de campos de formulario en gpdf es aún mínimo. ",[22,1715,1716],{},"unidoc"," es más completo aquí; ",[22,1719,287],{}," tiene soporte parcial de AcroForm. Una futura versión de gpdf cerrará el hueco, pero hoy es un hueco.",[113,1722,1723,399,1726,1729],{},[31,1724,1725],{},"Rutas vectoriales arbitrarias y dibujo complejo.",[22,1727,1728],{},"c.Line()"," dibuja una regla horizontal en una columna. Si necesitas béziers, rutas personalizadas o rellenos con gradiente para gráficos o dibujos técnicos, gpdf no está ahí. (Imágenes de gráficos pre-renderizadas van bien — esto es sobre primitivas de dibujo, no sobre incrustación.)",[113,1731,1732,1737,1738,1741],{},[31,1733,1734,1735,150],{},"Bases de código gofpdf existentes con mucho ",[22,1736,405],{}," Si tu código es 2.000 líneas de manipulación de cursor, la migración es una reescritura, no un find-and-replace. El código reescrito casi siempre es más corto, pero \"casi siempre\" es poco consuelo el día que vence el plazo. La ",[94,1739,1740],{"href":96},"guía de migración"," estima el esfuerzo con honestidad.",[113,1743,1744,1747,1748,1751,1752,1754],{},[31,1745,1746],{},"Necesitas HTML → PDF con soporte CSS completo ya."," gpdf tiene un subconjunto de HTML en el add-on ",[22,1749,1750],{},"gpdf-pro",", pero la paridad total de CSS con Chromium no es un objetivo. Si tu plantilla es un componente React complicado, ",[22,1753,352],{}," o una API comercial encaja más directo.",[18,1756,1757],{},"Si ninguno te muerde, gpdf es el default. Si alguno sí, lo habitual es correr las dos librerías en paralelo — gpdf para los PDFs nuevos, la anterior para el caso raro — y migrar el caso raro más tarde cuando gpdf lo cubra.",[13,1759,1761],{"id":1760},"el-ángulo-de-compliance","El ángulo de compliance",[18,1763,1764,1765,1768],{},"Algo que no se discute lo suficiente en posts de ecosistema: ",[31,1766,1767],{},"las dependencias archivadas aparecen en auditorías SOC 2 e ISO 27001",". El auditor quiere saber que el código de terceros en tu cadena de suministro se mantiene activamente. \"Archivada en 2021\" dispara un finding. \"Archivada en 2025\" dispara un finding. \"Fork que mantenemos internamente\" dispara preguntas de seguimiento sobre cómo parchearás un zero-day.",[18,1770,1771,1772,85,1775,1777],{},"Esta es en buena parte la razón por la que equipos de compañías más grandes nos han preguntado calladamente cuándo gpdf alcanzará un v1 estable. La respuesta es: ",[31,1773,1774],{},"ya lo hizo",[22,1776,443],{}," tiene tag, semver estable, y la superficie de API v1 está congelada. El proyecto tiene contacto de seguridad, política de disclosure responsable, y CI corriendo contra Go 1.22 hasta 1.26.",[18,1779,1780,1781,1784],{},"No migras ",[59,1782,1783],{},"por"," la auditoría. Migras porque la auditoría está a punto de pedírtelo de todas formas.",[13,1786,1788],{"id":1787},"faq","FAQ",[18,1790,1791,1794,1795,1797,1798,1800],{},[31,1792,1793],{},"¿\"El stack Go PDF moderno\" es solo gpdf o varias librerías?","\nPara la mayoría de equipos es gpdf en solitario — una sola librería cubre creación de documento, CJK, tablas, grids, paginación y salida. Los equipos con requisitos de formularios rellenables combinan con ",[22,1796,287],{}," o ",[22,1799,1716],{}," para esos documentos específicamente. Los equipos con exportaciones muy pesadas en gráficos pre-renderizan los gráficos a PNG y los incrustan. \"Stack\" aquí es una lista corta, no una arquitectura en capas.",[18,1802,1803,1806],{},[31,1804,1805],{},"¿Puedo correr gpdf y go-pdf/fpdf en paralelo durante la migración?","\nSí. Son rutas de import y tipos distintos. Enruta endpoints nuevos a gpdf y deja los viejos en go-pdf/fpdf hasta tener tiempo de reescribirlos. No hay conflicto en runtime.",[18,1808,1809,1812,1813,1816],{},[31,1810,1811],{},"¿Habrá un go-pdf/fpdf v3 o un nuevo fork?","\nQuizá. La apuesta detrás de gpdf no es que nadie vaya a des-archivar el fork nunca — es que ",[31,1814,1815],{},"la arquitectura no escala a lo que se construye hoy",". Un fork nuevo heredaría las mismas limitaciones a menos que reescriba el modelo de layout, en cuyo caso se parece más a gpdf que a fpdf.",[18,1818,1819,1825,1826,169,1829,169,1832,1835],{},[31,1820,1821,1822,1824],{},"¿Qué tal ",[22,1823,287],{}," como alternativa moderna?","\nGenuinamente mantenida y cero deps. La API es a nivel de coordenadas — ",[22,1827,1828],{},"SetX",[22,1830,1831],{},"SetY",[22,1833,1834],{},"CellWithOption"," — encaja bien con overlays de formularios y plantillas fijas. Para documentos tipo factura con tablas y chrome repetitivo, acabas escribiendo un helper de layout encima, que es el mismo pozo en el que cayeron los usuarios de gofpdf. gpdf y gopdf no compiten realmente — resuelven problemas adyacentes.",[18,1837,1838,1841,1844],{},[31,1839,1840],{},"¿Tiene gpdf una versión comercial o hosteada?",[22,1842,1843],{},"gpdf-api"," está en camino — una API hosteada que acepta plantillas JSON y devuelve PDFs. Aún no pública. Cuando salga, este blog tendrá un post. La librería OSS seguirá siendo MIT, cero deps e independientemente útil.",[18,1846,1847,1850],{},[31,1848,1849],{},"¿Cuál es el orden de prioridades del roadmap?","\nRoadmap público de gpdf a 2026-04: (1) campos de formulario AcroForm, (2) compliance PDF/A-3 completo, (3) cobertura ampliada de HTML→PDF en gpdf-pro, (4) soporte de texto RTL (árabe, hebreo). Feedback sobre prioridades bienvenido en GitHub issues.",[13,1852,1854],{"id":1853},"prueba-gpdf","Prueba gpdf",[18,1856,1857],{},"gpdf es una librería Go para generar PDFs. Licencia MIT, cero dependencias externas, soporte CJK nativo.",[494,1859,1863],{"className":1860,"code":1861,"language":1862,"meta":499,"style":499},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[22,1864,1865],{"__ignoreMap":499},[503,1866,1867,1869,1872],{"class":505,"line":506},[503,1868,498],{"class":550},[503,1870,1871],{"class":621}," get",[503,1873,1874],{"class":621}," github.com/gpdf-dev/gpdf\n",[18,1876,1877,1883,1884],{},[94,1878,1882],{"href":1879,"rel":1880},"https://github.com/gpdf-dev/gpdf",[1881],"nofollow","⭐ Dale estrella en GitHub"," · ",[94,1885,1888],{"href":1886,"rel":1887},"https://gpdf.dev/es/docs/quickstart",[1881],"Lee la documentación",[13,1890,1892],{"id":1891},"siguientes-lecturas","Siguientes lecturas",[449,1894,1895,1901,1908,1913],{},[113,1896,1897,1900],{},[94,1898,1899],{"href":96},"gofpdf está archivada. Cómo migrar a gpdf."," — el mapeo API a API",[113,1902,1903,1907],{},[94,1904,1906],{"href":1905},"/es/blog/go-pdf-library-showdown-2026","Comparativa de librerías Go PDF 2026"," — benchmarks head-to-head más profundos y parrilla de features",[113,1909,1910,1912],{},[94,1911,737],{"href":736}," — el idioma builder que reemplaza el empuje de cursor",[113,1914,1915,1917,1918],{},[94,1916,1559],{"href":1558}," — CJK sin la danza de ",[22,1919,1554],{},[1921,1922,1923],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":499,"searchDepth":529,"depth":529,"links":1925},[1926,1927,1928,1929,1930,1931,1932,1933,1934,1936,1937,1938,1939],{"id":15,"depth":529,"text":16},{"id":49,"depth":529,"text":50},{"id":104,"depth":529,"text":105},{"id":153,"depth":529,"text":154},{"id":201,"depth":529,"text":202},{"id":436,"depth":529,"text":437},{"id":749,"depth":529,"text":750},{"id":1573,"depth":529,"text":1574},{"id":1697,"depth":529,"text":1935},"Cuándo gpdf no es la elección correcta",{"id":1760,"depth":529,"text":1761},{"id":1787,"depth":529,"text":1788},{"id":1853,"depth":529,"text":1854},{"id":1891,"depth":529,"text":1892},"jung-kurt/gofpdf se archivó en 2021 y go-pdf/fpdf en 2025. Este es el stack Go PDF que usamos en 2026 — gpdf, los trade-offs y el porqué.",false,"md",null,{},"/es/blog/go-pdf-fpdf-archived",{"title":5,"description":1940},"es/blog/006.go-pdf-fpdf-archived",[1949,1950,1951],"migration","comparison","benchmark","VybLOI6dwO_5WHEv8RpH5_g_XwezKH7jPYajfrRrVeQ",1776529274227]