[{"data":1,"prerenderedAt":1954},["ShallowReactive",2],{"blog-pt-go-pdf-fpdf-archived":3},{"id":4,"title":5,"author":6,"body":9,"date":707,"description":1941,"draft":1942,"extension":1943,"howTo":1944,"image":1944,"meta":1945,"navigation":793,"path":1946,"seo":1947,"stem":1948,"tags":1949,"updated":1944,"__hash__":1953},"blogPt/pt/blog/006.go-pdf-fpdf-archived.md","go-pdf/fpdf também foi arquivado. O stack Go PDF de 2026.",{"name":7,"url":8},"gpdf team","https://gpdf.dev",{"type":10,"value":11,"toc":1925},"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,491,494,732,748,752,768,771,776,1128,1133,1543,1562,1572,1576,1583,1680,1687,1693,1696,1704,1707,1756,1759,1763,1770,1779,1786,1790,1802,1808,1818,1837,1846,1852,1856,1859,1876,1890,1894,1921],[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",{},"Os dois forks mantidos da linhagem ",[22,23,24],"code",{},"fpdf"," agora são somente leitura. ",[22,27,28],{},"jung-kurt/gofpdf"," foi arquivado em ",[31,32,33],"strong",{},"setembro de 2021","; o fork da comunidade ",[22,36,37],{},"go-pdf/fpdf"," seguiu em ",[31,40,41],{},"2025",". Não há um \"próximo mantenedor\" vindo aí. Para projetos novos, ",[31,44,45],{},"gpdf"," é o default moderno: Go puro, zero dependências externas, CJK nativo, 10–30× mais rápido em cargas comuns. Este post é um mapa do panorama em 2026 e uma resposta honesta sobre quando gpdf é a escolha certa e quando não é.",[13,48,50],{"id":49},"a-situação","A situação",[18,52,53,54,57,58,62,63,66,67,69],{},"Um colega digitou ",[22,55,56],{},"go get github.com/go-pdf/fpdf"," semana passada e parou no banner do GitHub: ",[59,60,61],"em",{},"\"This repository has been archived by the owner. It is now read-only.\""," Era para ser a versão ",[59,64,65],{},"consertada"," — o fork da comunidade de ",[22,68,28],{}," que deveria manter a linhagem viva depois que o original foi arquivado em 2021.",[18,71,72],{},"Também está arquivado. O README agora recomenda procurar outra biblioteca.",[18,74,75,76,79,80,82,83,85,86,89],{},"Se você passou os últimos cinco anos subindo serviços em Go que emitem PDFs — notas fiscais, relatórios, etiquetas de envio, documentos de conformidade — a biblioteca no fundo do seu ",[22,77,78],{},"go.mod"," quase certamente foi uma dessas duas. As respostas do Stack Overflow apontam para ",[22,81,28],{},". Os tutoriais mais recentes apontam para ",[22,84,37],{},". ",[31,87,88],{},"Agora as duas são passivo de cadeia de suprimentos",": sem triagem de CVE, sem trabalho de compatibilidade com novas versões de Go, sem correções de performance, sem atualizações da spec.",[18,91,92,93,98,99],{},"Este post não é mais um guia de migração linha por linha — ",[94,95,97],"a",{"href":96},"/pt/blog/gofpdf-migration","esse a gente já escreveu",". É a versão longa da pergunta que o guia de migração não responde: ",[31,100,101],{},"o que realmente funciona para gerar PDF em Go em 2026, e como o ecossistema chegou até aqui?",[13,103,105],{"id":104},"o-que-arquivado-custa-na-prática","O que \"arquivado\" custa na prática",[18,107,108],{},"A palavra \"archived\" no GitHub soa leve. Na prática, para uma biblioteca no seu grafo de imports, significa quatro coisas concretas:",[110,111,112,119,129,135],"ol",{},[113,114,115,118],"li",{},[31,116,117],{},"Sem correções de segurança."," Se aparece um problema de memory-safety no parser de TTF, ninguém vai fazer o merge do fix upstream. Você pode forkar e corrigir. A maioria dos times não vai.",[113,120,121,124,125,128],{},[31,122,123],{},"Sem compatibilidade para a frente com a toolchain Go."," A semântica de variável de laço do Go 1.25 funciona bem com gofpdf hoje. Alguma coisa em ",[22,126,127],{},"for range",", ou uma deprecação futura na stdlib, pode quebrar o build amanhã. E quem vai patchar o fork de um repo read-only é você.",[113,130,131,134],{},[31,132,133],{},"Sem atualizações de spec."," PDF 2.0 (ISO 32000-2) saiu em 2020. gofpdf implementa em grande parte PDF 1.7. Coisas como arquivos associados a nível de página, metadados XMP ricos e assinaturas digitais modernas (PAdES-B-LT) estão ausentes ou são ligadas por cola de terceiros.",[113,136,137,140,141,143],{},[31,138,139],{},"Sem progresso em CJK."," O caminho Unicode do gofpdf foi retrofitado sobre um design de fonte de um byte. Funciona, mas embute fontes completas em vez de subsets na maioria das configs reais, e certos TTFs de CJK produzem colisão de glyph-id com saída corrompida. ",[22,142,37],{}," herdou a mesma arquitetura.",[18,145,146,147,150],{},"Segurança e compatibilidade para a frente são as que mordem em conversas de compliance. \"Nossa biblioteca de PDF está arquivada e não recebe patches de CVE\" não é uma resposta que o auditor quer ouvir. ",[31,148,149],{},"Se você guarda NFes ou emite DANFEs no escopo da Receita Federal, esse ponto não dá mais para empurrar",".",[13,152,154],{"id":153},"por-que-os-dois-forks-morreram","Por que os dois forks morreram",[18,156,157,158],{},"É tentador explicar os arquivamentos como burnout de mantenedor — uma pessoa cansada de revisar PRs, um bus factor de um saindo do ar. É parte disso, mas não é tudo. ",[31,159,160],{},"A arquitetura dificultou o acompanhamento.",[18,162,163,165,166,169,170,169,173,176],{},[22,164,28],{}," era um port de FPDF — uma biblioteca PHP de 2002. O original em PHP empurrava um cursor pela página e cuspia conteúdo procedural: ",[22,167,168],{},"SetXY(x, y)",", ",[22,171,172],{},"Cell(w, h, text)",[22,174,175],{},"Ln(h)",". Aquele modelo era um acordo razoável para o PHP de 2002, onde a alternativa era PostScript cru ou toolkits proprietários. Portado para Go, manteve o cursor, manteve as tabelas de fonte de um byte, manteve o bookkeeping manual de quebra de página.",[18,178,179,180,183],{},"Ano após ano, a distância entre o que as pessoas queriam gerar e o que o modelo de cursor conseguia expressar só aumentou. Nota fiscal é tabela. Relatório é grid com chrome que repete. Etiqueta de envio é QR code mais texto em idioma local. O cursor foi embrulhado em helpers, os helpers em tutoriais, e lá por 2023 a maior parte do código que as pessoas escreviam ",[59,181,182],{},"contra"," gofpdf não era gofpdf — era uma camada de cola por time tentando fingir que o cursor era um motor de layout.",[18,185,186,188,189,192],{},[22,187,37],{}," herdou isso. O fork refatorou internos e corrigiu bugs antigos, mas ",[31,190,191],{},"não podia mudar a API pública"," sem quebrar todo projeto dependente. O formato da biblioteca estava congelado no PHP de 2002, e o custo de manter esse formato vivo crescia mais rápido do que o benefício.",[18,194,195,198],{},[31,196,197],{},"Então",": dois mantenedores, dois arquivamentos, uma razão arquitetural. Recomeçar em 2026 significa escolher uma abordagem que combine com como PDFs são produzidos hoje — que se parece muito mais com montar uma página web do que com dirigir um plotter.",[13,200,202],{"id":201},"o-panorama-go-pdf-em-2026","O panorama Go PDF em 2026",[18,204,205],{},"Antes de recomendar qualquer coisa, o campo inteiro. Vou usar \"mantida\" de forma frouxa para significar \"um commit nos últimos 6 meses e issues que recebem resposta\".",[207,208,209,234],"table",{},[210,211,212],"thead",{},[213,214,215,219,222,225,228,231],"tr",{},[216,217,218],"th",{},"Biblioteca",[216,220,221],{},"Status (2026-04)",[216,223,224],{},"Licença",[216,226,227],{},"CJK nativo",[216,229,230],{},"Zero 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],{},"Arquivada 2021",[240,250,251],{},"MIT",[240,253,254],{},"Retrofit",[240,256,257],{},"Sim",[240,259,260],{},"A original. Ainda é o primeiro resultado em quase todos os idiomas.",[213,262,263,267,272,274,276,278],{},[240,264,265],{},[22,266,37],{},[240,268,269],{},[31,270,271],{},"Arquivada 2025",[240,273,251],{},[240,275,254],{},[240,277,257],{},[240,279,280],{},"Fork da comunidade. Mesma arquitetura, mesmo teto.",[213,282,283,288,291,293,296,298],{},[240,284,285],{},[22,286,287],{},"signintech/gopdf",[240,289,290],{},"Mantida",[240,292,251],{},[240,294,295],{},"Parcial",[240,297,257],{},[240,299,300],{},"Baixo nível. Você escreve coordenadas. Bom para overlays de formulário.",[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],{},"Via gofpdf",[240,317,318],{},"Não",[240,320,321,322,324],{},"Builder com grid, mas depende de ",[22,323,37],{}," por baixo.",[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. Licença paga obrigatória 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],{},"Não — traz um browser",[240,367,368],{},"HTML→PDF via Chrome headless. Runtime gigante.",[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],{},"Reimplementação em Go puro. API builder, grid de 12 colunas.",[18,392,393],{},"A tabela sozinha já mostra algumas coisas:",[18,395,396,399,400,402,403,406],{},[31,397,398],{},"Tudo que está mantido é ou comercial, ou traz um runtime gigante, ou senta em cima de uma fundação prestes a ficar obsoleta."," A exceção é ",[22,401,287],{}," — genuinamente mantida e com poucas dependências — mas é uma biblioteca de nível de coordenadas. Você volta a ",[22,404,405],{},"SetXY"," com outro nome de pacote.",[18,408,409,412,413,415,416,418],{},[31,410,411],{},"Maroto v2 é um builder com grid e uma boa API."," O problema é que no fundo do ",[22,414,78],{}," está ",[22,417,37],{},". Todo teto de performance e toda limitação de CJK em fpdf também é teto do Maroto. Um v3 maior poderia se soltar disso — ainda não saiu.",[18,420,421,424],{},[31,422,423],{},"unipdf é rico em features mas não é MIT-compatível para uso comercial."," Você paga por assento ou por deploy. É uma escolha válida se sua receita sustenta; para um side project OSS ou uma startup no começo, a conta da licença não fecha.",[18,426,427,430],{},[31,428,429],{},"chromedp funciona, mas você está enviando um browser."," Uma imagem base de 100 MB vira uma de 1 GB+. Cold start em serverless é doloroso. Fontes ainda precisam estar instaladas no container. A vantagem é que você reaproveita templates de React; a desvantagem é rodar Chromium para renderizar uma NFe.",[18,432,433],{},"O buraco é óbvio: uma biblioteca em Go puro, zero deps, CJK nativo, grid-first, que não exige licença comercial nem runtime de browser. É isso que gpdf é.",[13,435,437],{"id":436},"o-que-é-gpdf","O que é gpdf",[18,439,440,441,444],{},"gpdf (",[22,442,443],{},"github.com/gpdf-dev/gpdf",") é uma reimplementação limpa. Não é um fork. O writer do formato PDF, o motor de layout e o subsetter TrueType — todos escritos do zero em Go puro.",[18,446,447],{},"As três propriedades que importam para a maioria dos times:",[449,450,451,465,482],"ul",{},[113,452,453,456,457,460,461,464],{},[31,454,455],{},"Go puro, sem CGO."," ",[22,458,459],{},"go build"," é estático. ",[22,462,463],{},"GOOS=linux GOARCH=arm64 go build"," roda de uma MacBook sem configurar toolchain. Imagens Docker ficam pequenas — um container distroless de 12 MB já roda.",[113,466,467,456,470,473,474,477,478,481],{},[31,468,469],{},"Zero dependências externas.",[22,471,472],{},"go mod graph"," depois de ",[22,475,476],{},"go get github.com/gpdf-dev/gpdf"," mostra uma linha só: o próprio gpdf. O core usa apenas ",[22,479,480],{},"std",". (Add-ons opcionais para HTML→PDF ou assinaturas digitais trazem dependências pequenas, e são opt-in.)",[113,483,484,456,487,490],{},[31,485,486],{},"CJK nativo.",[22,488,489],{},"WithFont"," registra uma fonte TrueType na construção do documento. Subset embedding acontece no tempo de render. Uma nota fiscal de 200 caracteres em japonês carrega ~30 KB de subset, não 5 MB de fonte completa.",[18,492,493],{},"A forma da API é declarativa. Você descreve uma árvore de linhas e colunas; o motor de layout posiciona. O grid é de 12 colunas — o mesmo idioma que o Bootstrap entrega desde 2011. Se você já escreveu uma linha de HTML/CSS, a API do gpdf é familiar:",[495,496,501],"pre",{"className":497,"code":498,"language":499,"meta":500,"style":500},"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(\"Nota Fiscal #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,502,503,528,564,604,654,660,692,721,726],{"__ignoreMap":500},[504,505,508,512,516,519,521,525],"span",{"class":506,"line":507},"line",1,[504,509,511],{"class":510},"sTEyZ","page ",[504,513,515],{"class":514},"sMK4o",":=",[504,517,518],{"class":510}," doc",[504,520,150],{"class":514},[504,522,524],{"class":523},"s2Zo4","AddPage",[504,526,527],{"class":514},"()\n",[504,529,531,534,536,539,542,546,549,553,555,558,561],{"class":506,"line":530},2,[504,532,533],{"class":510},"page",[504,535,150],{"class":514},[504,537,538],{"class":523},"AutoRow",[504,540,541],{"class":514},"(func(",[504,543,545],{"class":544},"sHdIc","r",[504,547,548],{"class":514}," *",[504,550,552],{"class":551},"sBMFI","template",[504,554,150],{"class":514},[504,556,557],{"class":551},"RowBuilder",[504,559,560],{"class":514},")",[504,562,563],{"class":514}," {\n",[504,565,567,570,572,575,578,582,585,588,591,593,595,597,600,602],{"class":506,"line":566},3,[504,568,569],{"class":510},"    r",[504,571,150],{"class":514},[504,573,574],{"class":523},"Col",[504,576,577],{"class":514},"(",[504,579,581],{"class":580},"sbssI","8",[504,583,584],{"class":514},",",[504,586,587],{"class":514}," func(",[504,589,590],{"class":544},"c",[504,592,548],{"class":514},[504,594,552],{"class":551},[504,596,150],{"class":514},[504,598,599],{"class":551},"ColBuilder",[504,601,560],{"class":514},[504,603,563],{"class":514},[504,605,607,610,612,615,617,620,624,626,628,631,633,636,638,641,644,646,648,651],{"class":506,"line":606},4,[504,608,609],{"class":510},"        c",[504,611,150],{"class":514},[504,613,614],{"class":523},"Text",[504,616,577],{"class":514},[504,618,619],{"class":514},"\"",[504,621,623],{"class":622},"sfazB","Nota Fiscal #2026-0416",[504,625,619],{"class":514},[504,627,584],{"class":514},[504,629,630],{"class":510}," template",[504,632,150],{"class":514},[504,634,635],{"class":523},"FontSize",[504,637,577],{"class":514},[504,639,640],{"class":580},"18",[504,642,643],{"class":514},"),",[504,645,630],{"class":510},[504,647,150],{"class":514},[504,649,650],{"class":523},"Bold",[504,652,653],{"class":514},"())\n",[504,655,657],{"class":506,"line":656},5,[504,658,659],{"class":514},"    })\n",[504,661,663,665,667,669,671,674,676,678,680,682,684,686,688,690],{"class":506,"line":662},6,[504,664,569],{"class":510},[504,666,150],{"class":514},[504,668,574],{"class":523},[504,670,577],{"class":514},[504,672,673],{"class":580},"4",[504,675,584],{"class":514},[504,677,587],{"class":514},[504,679,590],{"class":544},[504,681,548],{"class":514},[504,683,552],{"class":551},[504,685,150],{"class":514},[504,687,599],{"class":551},[504,689,560],{"class":514},[504,691,563],{"class":514},[504,693,695,697,699,701,703,705,708,710,712,714,716,719],{"class":506,"line":694},7,[504,696,609],{"class":510},[504,698,150],{"class":514},[504,700,614],{"class":523},[504,702,577],{"class":514},[504,704,619],{"class":514},[504,706,707],{"class":622},"2026-04-16",[504,709,619],{"class":514},[504,711,584],{"class":514},[504,713,630],{"class":510},[504,715,150],{"class":514},[504,717,718],{"class":523},"AlignRight",[504,720,653],{"class":514},[504,722,724],{"class":506,"line":723},8,[504,725,659],{"class":514},[504,727,729],{"class":506,"line":728},9,[504,730,731],{"class":514},"})\n",[18,733,734,735,739,740,743,744,747],{},"Mais sobre o grid em ",[94,736,738],{"href":737},"/pt/blog/12-column-grid","Como funciona o grid de 12 colunas do gpdf?",". Versão em uma frase: ",[22,741,742],{},"Col(span, fn)"," pega span de 1 a 12, e ",[22,745,746],{},"span / 12"," é a fração da linha que ele ocupa.",[13,749,751],{"id":750},"o-diff-mínimo-go-pdffpdf-gpdf","O diff mínimo go-pdf/fpdf → gpdf",[18,753,754,755,757,758,760,761,763,764,767],{},"Se você está vindo especificamente de ",[22,756,37],{}," (não de ",[22,759,28],{},"), a boa notícia é que as superfícies de API são quase idênticas — ",[22,762,37],{}," é um fork que mudou praticamente nada no call-site. A migração para gpdf é a mesma que o ",[94,765,766],{"href":96},"guia de gofpdf"," percorre, com uma troca no caminho do import.",[18,769,770],{},"O menor diff possível — um handler HTTP que \"gera um PDF\":",[18,772,773],{},[31,774,775],{},"Before — go-pdf/fpdf:",[495,777,779],{"className":497,"code":778,"language":499,"meta":500,"style":500},"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,780,781,789,795,804,815,819,828,833,837,877,928,940,975,1006,1011,1048,1084,1116,1122],{"__ignoreMap":500},[504,782,783,786],{"class":506,"line":507},[504,784,785],{"class":514},"package",[504,787,788],{"class":551}," main\n",[504,790,791],{"class":506,"line":530},[504,792,794],{"emptyLinePlaceholder":793},true,"\n",[504,796,797,801],{"class":506,"line":566},[504,798,800],{"class":799},"s7zQu","import",[504,802,803],{"class":514}," (\n",[504,805,806,809,812],{"class":506,"line":606},[504,807,808],{"class":514},"    \"",[504,810,811],{"class":551},"net/http",[504,813,814],{"class":514},"\"\n",[504,816,817],{"class":506,"line":656},[504,818,794],{"emptyLinePlaceholder":793},[504,820,821,823,826],{"class":506,"line":662},[504,822,808],{"class":514},[504,824,825],{"class":551},"github.com/go-pdf/fpdf",[504,827,814],{"class":514},[504,829,830],{"class":506,"line":694},[504,831,832],{"class":514},")\n",[504,834,835],{"class":506,"line":723},[504,836,794],{"emptyLinePlaceholder":793},[504,838,839,842,845,847,850,853,855,858,860,863,865,868,870,873,875],{"class":506,"line":728},[504,840,841],{"class":514},"func",[504,843,844],{"class":523}," handler",[504,846,577],{"class":514},[504,848,849],{"class":544},"w",[504,851,852],{"class":551}," http",[504,854,150],{"class":514},[504,856,857],{"class":551},"ResponseWriter",[504,859,584],{"class":514},[504,861,862],{"class":544}," r",[504,864,548],{"class":514},[504,866,867],{"class":551},"http",[504,869,150],{"class":514},[504,871,872],{"class":551},"Request",[504,874,560],{"class":514},[504,876,563],{"class":514},[504,878,880,883,885,888,890,893,895,897,900,902,904,907,910,912,914,916,919,921,923,926],{"class":506,"line":879},10,[504,881,882],{"class":510},"    pdf ",[504,884,515],{"class":514},[504,886,887],{"class":510}," fpdf",[504,889,150],{"class":514},[504,891,892],{"class":523},"New",[504,894,577],{"class":514},[504,896,619],{"class":514},[504,898,899],{"class":622},"P",[504,901,619],{"class":514},[504,903,584],{"class":514},[504,905,906],{"class":514}," \"",[504,908,909],{"class":622},"mm",[504,911,619],{"class":514},[504,913,584],{"class":514},[504,915,906],{"class":514},[504,917,918],{"class":622},"A4",[504,920,619],{"class":514},[504,922,584],{"class":514},[504,924,925],{"class":514}," \"\"",[504,927,832],{"class":514},[504,929,931,934,936,938],{"class":506,"line":930},11,[504,932,933],{"class":510},"    pdf",[504,935,150],{"class":514},[504,937,524],{"class":523},[504,939,527],{"class":514},[504,941,943,945,947,950,952,954,957,959,961,963,966,968,970,973],{"class":506,"line":942},12,[504,944,933],{"class":510},[504,946,150],{"class":514},[504,948,949],{"class":523},"SetFont",[504,951,577],{"class":514},[504,953,619],{"class":514},[504,955,956],{"class":622},"Arial",[504,958,619],{"class":514},[504,960,584],{"class":514},[504,962,906],{"class":514},[504,964,965],{"class":622},"B",[504,967,619],{"class":514},[504,969,584],{"class":514},[504,971,972],{"class":580}," 16",[504,974,832],{"class":514},[504,976,978,980,982,985,987,990,992,995,997,999,1002,1004],{"class":506,"line":977},13,[504,979,933],{"class":510},[504,981,150],{"class":514},[504,983,984],{"class":523},"Cell",[504,986,577],{"class":514},[504,988,989],{"class":580},"40",[504,991,584],{"class":514},[504,993,994],{"class":580}," 10",[504,996,584],{"class":514},[504,998,906],{"class":514},[504,1000,1001],{"class":622},"Hello, World!",[504,1003,619],{"class":514},[504,1005,832],{"class":514},[504,1007,1009],{"class":506,"line":1008},14,[504,1010,794],{"emptyLinePlaceholder":793},[504,1012,1014,1017,1019,1022,1025,1028,1030,1032,1035,1037,1039,1041,1044,1046],{"class":506,"line":1013},15,[504,1015,1016],{"class":510},"    w",[504,1018,150],{"class":514},[504,1020,1021],{"class":523},"Header",[504,1023,1024],{"class":514},"().",[504,1026,1027],{"class":523},"Set",[504,1029,577],{"class":514},[504,1031,619],{"class":514},[504,1033,1034],{"class":622},"Content-Type",[504,1036,619],{"class":514},[504,1038,584],{"class":514},[504,1040,906],{"class":514},[504,1042,1043],{"class":622},"application/pdf",[504,1045,619],{"class":514},[504,1047,832],{"class":514},[504,1049,1051,1054,1057,1059,1062,1064,1067,1069,1071,1074,1076,1079,1082],{"class":506,"line":1050},16,[504,1052,1053],{"class":799},"    if",[504,1055,1056],{"class":510}," err ",[504,1058,515],{"class":514},[504,1060,1061],{"class":510}," pdf",[504,1063,150],{"class":514},[504,1065,1066],{"class":523},"Output",[504,1068,577],{"class":514},[504,1070,849],{"class":510},[504,1072,1073],{"class":514},");",[504,1075,1056],{"class":510},[504,1077,1078],{"class":514},"!=",[504,1080,1081],{"class":514}," nil",[504,1083,563],{"class":514},[504,1085,1087,1090,1092,1095,1097,1099,1101,1104,1106,1108,1111,1114],{"class":506,"line":1086},17,[504,1088,1089],{"class":510},"        http",[504,1091,150],{"class":514},[504,1093,1094],{"class":523},"Error",[504,1096,577],{"class":514},[504,1098,849],{"class":510},[504,1100,584],{"class":514},[504,1102,1103],{"class":510}," err",[504,1105,150],{"class":514},[504,1107,1094],{"class":523},[504,1109,1110],{"class":514},"(),",[504,1112,1113],{"class":580}," 500",[504,1115,832],{"class":514},[504,1117,1119],{"class":506,"line":1118},18,[504,1120,1121],{"class":514},"    }\n",[504,1123,1125],{"class":506,"line":1124},19,[504,1126,1127],{"class":514},"}\n",[18,1129,1130],{},[31,1131,1132],{},"After — gpdf:",[495,1134,1136],{"className":497,"code":1135,"language":499,"meta":500,"style":500},"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,1137,1138,1144,1148,1154,1162,1166,1174,1183,1192,1196,1200,1232,1250,1272,1307,1312,1316,1331,1356,1388,1429,1435,1440,1445,1476,1506,1533,1538],{"__ignoreMap":500},[504,1139,1140,1142],{"class":506,"line":507},[504,1141,785],{"class":514},[504,1143,788],{"class":551},[504,1145,1146],{"class":506,"line":530},[504,1147,794],{"emptyLinePlaceholder":793},[504,1149,1150,1152],{"class":506,"line":566},[504,1151,800],{"class":799},[504,1153,803],{"class":514},[504,1155,1156,1158,1160],{"class":506,"line":606},[504,1157,808],{"class":514},[504,1159,811],{"class":551},[504,1161,814],{"class":514},[504,1163,1164],{"class":506,"line":656},[504,1165,794],{"emptyLinePlaceholder":793},[504,1167,1168,1170,1172],{"class":506,"line":662},[504,1169,808],{"class":514},[504,1171,443],{"class":551},[504,1173,814],{"class":514},[504,1175,1176,1178,1181],{"class":506,"line":694},[504,1177,808],{"class":514},[504,1179,1180],{"class":551},"github.com/gpdf-dev/gpdf/document",[504,1182,814],{"class":514},[504,1184,1185,1187,1190],{"class":506,"line":723},[504,1186,808],{"class":514},[504,1188,1189],{"class":551},"github.com/gpdf-dev/gpdf/template",[504,1191,814],{"class":514},[504,1193,1194],{"class":506,"line":728},[504,1195,832],{"class":514},[504,1197,1198],{"class":506,"line":879},[504,1199,794],{"emptyLinePlaceholder":793},[504,1201,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230],{"class":506,"line":930},[504,1203,841],{"class":514},[504,1205,844],{"class":523},[504,1207,577],{"class":514},[504,1209,849],{"class":544},[504,1211,852],{"class":551},[504,1213,150],{"class":514},[504,1215,857],{"class":551},[504,1217,584],{"class":514},[504,1219,862],{"class":544},[504,1221,548],{"class":514},[504,1223,867],{"class":551},[504,1225,150],{"class":514},[504,1227,872],{"class":551},[504,1229,560],{"class":514},[504,1231,563],{"class":514},[504,1233,1234,1237,1239,1242,1244,1247],{"class":506,"line":942},[504,1235,1236],{"class":510},"    doc ",[504,1238,515],{"class":514},[504,1240,1241],{"class":510}," gpdf",[504,1243,150],{"class":514},[504,1245,1246],{"class":523},"NewDocument",[504,1248,1249],{"class":514},"(\n",[504,1251,1252,1255,1257,1260,1262,1265,1267,1269],{"class":506,"line":977},[504,1253,1254],{"class":510},"        gpdf",[504,1256,150],{"class":514},[504,1258,1259],{"class":523},"WithPageSize",[504,1261,577],{"class":514},[504,1263,1264],{"class":510},"document",[504,1266,150],{"class":514},[504,1268,918],{"class":510},[504,1270,1271],{"class":514},"),\n",[504,1273,1274,1276,1278,1281,1283,1285,1287,1290,1292,1294,1296,1299,1301,1304],{"class":506,"line":1008},[504,1275,1254],{"class":510},[504,1277,150],{"class":514},[504,1279,1280],{"class":523},"WithMargins",[504,1282,577],{"class":514},[504,1284,1264],{"class":510},[504,1286,150],{"class":514},[504,1288,1289],{"class":523},"UniformEdges",[504,1291,577],{"class":514},[504,1293,1264],{"class":510},[504,1295,150],{"class":514},[504,1297,1298],{"class":523},"Mm",[504,1300,577],{"class":514},[504,1302,1303],{"class":580},"20",[504,1305,1306],{"class":514},"))),\n",[504,1308,1309],{"class":506,"line":1013},[504,1310,1311],{"class":514},"    )\n",[504,1313,1314],{"class":506,"line":1050},[504,1315,794],{"emptyLinePlaceholder":793},[504,1317,1318,1321,1323,1325,1327,1329],{"class":506,"line":1086},[504,1319,1320],{"class":510},"    page ",[504,1322,515],{"class":514},[504,1324,518],{"class":510},[504,1326,150],{"class":514},[504,1328,524],{"class":523},[504,1330,527],{"class":514},[504,1332,1333,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354],{"class":506,"line":1118},[504,1334,1335],{"class":510},"    page",[504,1337,150],{"class":514},[504,1339,538],{"class":523},[504,1341,541],{"class":514},[504,1343,545],{"class":544},[504,1345,548],{"class":514},[504,1347,552],{"class":551},[504,1349,150],{"class":514},[504,1351,557],{"class":551},[504,1353,560],{"class":514},[504,1355,563],{"class":514},[504,1357,1358,1361,1363,1365,1367,1370,1372,1374,1376,1378,1380,1382,1384,1386],{"class":506,"line":1124},[504,1359,1360],{"class":510},"        r",[504,1362,150],{"class":514},[504,1364,574],{"class":523},[504,1366,577],{"class":514},[504,1368,1369],{"class":580},"12",[504,1371,584],{"class":514},[504,1373,587],{"class":514},[504,1375,590],{"class":544},[504,1377,548],{"class":514},[504,1379,552],{"class":551},[504,1381,150],{"class":514},[504,1383,599],{"class":551},[504,1385,560],{"class":514},[504,1387,563],{"class":514},[504,1389,1391,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1419,1421,1423,1425,1427],{"class":506,"line":1390},20,[504,1392,1393],{"class":510},"            c",[504,1395,150],{"class":514},[504,1397,614],{"class":523},[504,1399,577],{"class":514},[504,1401,619],{"class":514},[504,1403,1001],{"class":622},[504,1405,619],{"class":514},[504,1407,584],{"class":514},[504,1409,630],{"class":510},[504,1411,150],{"class":514},[504,1413,635],{"class":523},[504,1415,577],{"class":514},[504,1417,1418],{"class":580},"16",[504,1420,643],{"class":514},[504,1422,630],{"class":510},[504,1424,150],{"class":514},[504,1426,650],{"class":523},[504,1428,653],{"class":514},[504,1430,1432],{"class":506,"line":1431},21,[504,1433,1434],{"class":514},"        })\n",[504,1436,1438],{"class":506,"line":1437},22,[504,1439,659],{"class":514},[504,1441,1443],{"class":506,"line":1442},23,[504,1444,794],{"emptyLinePlaceholder":793},[504,1446,1448,1450,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1472,1474],{"class":506,"line":1447},24,[504,1449,1016],{"class":510},[504,1451,150],{"class":514},[504,1453,1021],{"class":523},[504,1455,1024],{"class":514},[504,1457,1027],{"class":523},[504,1459,577],{"class":514},[504,1461,619],{"class":514},[504,1463,1034],{"class":622},[504,1465,619],{"class":514},[504,1467,584],{"class":514},[504,1469,906],{"class":514},[504,1471,1043],{"class":622},[504,1473,619],{"class":514},[504,1475,832],{"class":514},[504,1477,1479,1481,1483,1485,1487,1489,1492,1494,1496,1498,1500,1502,1504],{"class":506,"line":1478},25,[504,1480,1053],{"class":799},[504,1482,1056],{"class":510},[504,1484,515],{"class":514},[504,1486,518],{"class":510},[504,1488,150],{"class":514},[504,1490,1491],{"class":523},"Render",[504,1493,577],{"class":514},[504,1495,849],{"class":510},[504,1497,1073],{"class":514},[504,1499,1056],{"class":510},[504,1501,1078],{"class":514},[504,1503,1081],{"class":514},[504,1505,563],{"class":514},[504,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531],{"class":506,"line":1508},26,[504,1510,1089],{"class":510},[504,1512,150],{"class":514},[504,1514,1094],{"class":523},[504,1516,577],{"class":514},[504,1518,849],{"class":510},[504,1520,584],{"class":514},[504,1522,1103],{"class":510},[504,1524,150],{"class":514},[504,1526,1094],{"class":523},[504,1528,1110],{"class":514},[504,1530,1113],{"class":580},[504,1532,832],{"class":514},[504,1534,1536],{"class":506,"line":1535},27,[504,1537,1121],{"class":514},[504,1539,1541],{"class":506,"line":1540},28,[504,1542,1127],{"class":514},[18,1544,1545,1546,1548,1549,1552,1553,1556,1557,1561],{},"Três linhas de código de cursor viram três chamadas de builder. A estrutura aparece no código-fonte em vez de se esconder dentro da ordem das chamadas a ",[22,1547,984],{},". Para CJK, adicione ",[22,1550,1551],{},"gpdf.WithFont(\"NotoSansJP\", ttfBytes)"," — sem ",[22,1554,1555],{},"AddUTF8Font",", sem caminho do filesystem, sem flag UTF-8. Ver ",[94,1558,1560],{"href":1559},"/pt/blog/embed-japanese-font","Como embutir uma fonte japonesa no gpdf?"," para o passo a passo completo.",[18,1563,1564,1565,1568,1569,1571],{},"O ",[94,1566,1567],{"href":96},"guia de migração de gofpdf"," tem mais cinco pares before/after cobrindo tabelas, cabeçalho/rodapé que repetem, números de página e posicionamento absoluto. Tudo que está lá se aplica literalmente a usuários de ",[22,1570,37],{}," — basta trocar o caminho do import.",[13,1573,1575],{"id":1574},"a-foto-dos-benchmarks","A foto dos benchmarks",[18,1577,1578,1579,1582],{},"\"Rápido\" é fácil de alegar e difícil de conquistar. A tabela abaixo é de ",[22,1580,1581],{},"gpdf/_benchmark/benchmark_test.go"," em um Apple M1 rodando Go 1.25. As cargas são o que o código de produção faz de fato — não micro-benchmarks escolhidos para favorecer uma biblioteca.",[207,1584,1585,1603],{},[210,1586,1587],{},[213,1588,1589,1592,1594,1597,1600],{},[216,1590,1591],{},"Benchmark",[216,1593,45],{},[216,1595,1596],{},"gofpdf",[216,1598,1599],{},"gopdf",[216,1601,1602],{},"Maroto v2",[235,1604,1605,1624,1643,1661],{},[213,1606,1607,1610,1615,1618,1621],{},[240,1608,1609],{},"Página única (hello)",[240,1611,1612],{},[31,1613,1614],{},"13 µs",[240,1616,1617],{},"132 µs",[240,1619,1620],{},"423 µs",[240,1622,1623],{},"237 µs",[213,1625,1626,1629,1634,1637,1640],{},[240,1627,1628],{},"Tabela 4×10 de itens",[240,1630,1631],{},[31,1632,1633],{},"108 µs",[240,1635,1636],{},"241 µs",[240,1638,1639],{},"835 µs",[240,1641,1642],{},"8.6 ms",[213,1644,1645,1648,1653,1656,1658],{},[240,1646,1647],{},"Relatório de 100 páginas",[240,1649,1650],{},[31,1651,1652],{},"683 µs",[240,1654,1655],{},"11.7 ms",[240,1657,1642],{},[240,1659,1660],{},"19.8 ms",[213,1662,1663,1666,1671,1674,1677],{},[240,1664,1665],{},"Nota fiscal CJK complexa",[240,1667,1668],{},[31,1669,1670],{},"133 µs",[240,1672,1673],{},"254 µs",[240,1675,1676],{},"997 µs",[240,1678,1679],{},"10.4 ms",[18,1681,1682,1683,1686],{},"A 13 µs por página única, um core produz ~75.000 PDFs hello-world por segundo. A 108 µs por nota fiscal, ~9.000 por segundo. ",[31,1684,1685],{},"O ponto não é ostentar números","; é que você pode parar de pensar se precisa cachear ou jogar geração de PDF numa fila assíncrona. Para a maioria das cargas, gerar no caminho da requisição está de bom tamanho.",[18,1688,1689,1690,1692],{},"Maroto v2 aparece lento na tabela porque dirige ",[22,1691,37],{}," por baixo e adiciona seu próprio passo de layout em cima. Não é crítica à API do Maroto — a API é boa — é o custo estrutural de sentar sobre a fundação fpdf. Quando Maroto v3 soltar a dependência de fpdf, essa coluna muda.",[18,1694,1695],{},"O benchmark de 100 páginas merece um parágrafo extra. O writer streaming do gpdf emite conteúdo enquanto as linhas são layout; gofpdf buferiza mais estado por página. Para cargas pesadas em paginação (relatório mensal, catálogo, export de compliance), a diferença é de minutos contra segundos na ponta alta dos tamanhos.",[13,1697,1699,1700,1703],{"id":1698},"quando-gpdf-não-é-a-escolha-certa","Quando gpdf ",[59,1701,1702],{},"não"," é a escolha certa",[18,1705,1706],{},"Todo post de migração precisa responder \"quando não mudar?\". Respostas honestas:",[449,1708,1709,1722,1731,1743],{},[113,1710,1711,1714,1715,1718,1719,1721],{},[31,1712,1713],{},"AcroForm / formulários preenchíveis."," Se seu caso é gerar PDFs que usuários abrem no Acrobat e preenchem, o suporte a campo de formulário no gpdf ainda é mínimo. ",[22,1716,1717],{},"unidoc"," é mais completo aqui; ",[22,1720,287],{}," tem suporte parcial de AcroForm. Uma release futura do gpdf vai fechar o buraco, mas hoje é um buraco.",[113,1723,1724,456,1727,1730],{},[31,1725,1726],{},"Caminhos vetoriais arbitrários e desenho complexo.",[22,1728,1729],{},"c.Line()"," desenha uma régua horizontal dentro de uma coluna. Se você precisa de bézier, caminhos personalizados ou preenchimento com gradiente para gráficos ou desenhos técnicos, gpdf não chega lá. (Imagens de gráficos pré-renderizadas funcionam bem — isso aqui é sobre primitivas de desenho, não sobre embutir imagem.)",[113,1732,1733,1738,1739,1742],{},[31,1734,1735,1736,150],{},"Bases de código gofpdf existentes com muito ",[22,1737,405],{}," Se seu código tem 2.000 linhas de manipulação de cursor, a migração é reescrita, não find-and-replace. O código reescrito quase sempre é mais curto, mas \"quase sempre\" é um consolo frio no dia do prazo. O ",[94,1740,1741],{"href":96},"guia de migração"," estima o esforço honestamente.",[113,1744,1745,1748,1749,1752,1753,1755],{},[31,1746,1747],{},"Precisa de HTML → PDF com suporte completo a CSS agora."," gpdf tem um subconjunto de HTML no add-on ",[22,1750,1751],{},"gpdf-pro",", mas paridade total de CSS com Chromium não é objetivo. Se seu template é um componente React complicado, ",[22,1754,352],{}," ou uma API comercial encaixa mais direto.",[18,1757,1758],{},"Se nenhuma delas morde, gpdf é o default. Se uma morde, o normal é rodar as duas bibliotecas em paralelo — gpdf para os PDFs novos, a anterior para o caso de borda — e migrar o caso de borda depois, quando gpdf chegar lá.",[13,1760,1762],{"id":1761},"o-ângulo-de-compliance","O ângulo de compliance",[18,1764,1765,1766,1769],{},"Uma coisa que quase ninguém discute em posts de ecossistema: ",[31,1767,1768],{},"dependências arquivadas aparecem em auditorias SOC 2 e ISO 27001",". O auditor quer saber que o código de terceiros na sua cadeia de suprimentos é mantido ativamente. \"Arquivada em 2021\" dispara um finding. \"Arquivada em 2025\" dispara um finding. \"Fork que mantemos internamente\" dispara perguntas de follow-up sobre como você vai patchar um zero-day.",[18,1771,1772,1773,85,1776,1778],{},"É em boa parte por isso que times em empresas maiores passando por security review nos perguntam baixinho quando gpdf vai chegar a um v1 estável. A resposta é: ",[31,1774,1775],{},"já chegou",[22,1777,443],{}," tem tag, semver estável, e a superfície de API v1 está congelada. O projeto tem contato de segurança, política de disclosure responsável, e CI rodando Go 1.22 até 1.26.",[18,1780,1781,1782,1785],{},"Você não migra ",[59,1783,1784],{},"pela"," auditoria. Migra porque a auditoria está prestes a pedir de todo jeito.",[13,1787,1789],{"id":1788},"faq","FAQ",[18,1791,1792,1795,1796,1798,1799,1801],{},[31,1793,1794],{},"\"O stack Go PDF moderno\" é só gpdf ou várias bibliotecas?","\nPara a maioria dos times é gpdf sozinho — a única biblioteca cobre criação de documento, CJK, tabelas, grid, paginação e saída. Times com requisito de formulário preenchível combinam com ",[22,1797,287],{}," ou ",[22,1800,1717],{}," só para esses documentos. Times com export pesado em gráficos pré-renderizam os gráficos para PNG e embutem. \"Stack\" aqui significa lista curta, não arquitetura em camadas.",[18,1803,1804,1807],{},[31,1805,1806],{},"Dá para rodar gpdf e go-pdf/fpdf lado a lado durante a migração?","\nDá. São caminhos de import e tipos diferentes. Roteie os endpoints novos para gpdf e deixe os antigos em go-pdf/fpdf até ter tempo de reescrever. Não tem conflito em runtime.",[18,1809,1810,1813,1814,1817],{},[31,1811,1812],{},"Vai sair um go-pdf/fpdf v3 ou um fork novo?","\nTalvez. A aposta por trás do gpdf não é que ninguém vai desarquivar o fork — é que ",[31,1815,1816],{},"a arquitetura não escala para o que se constrói hoje",". Um fork novo herdaria as mesmas limitações a menos que reescreva o modelo de layout, e aí é mais perto do gpdf do que do fpdf.",[18,1819,1820,1826,1827,169,1830,169,1833,1836],{},[31,1821,1822,1823,1825],{},"E ",[22,1824,287],{}," como alternativa moderna?","\nGenuinamente mantida e zero deps. A API é nível de coordenada — ",[22,1828,1829],{},"SetX",[22,1831,1832],{},"SetY",[22,1834,1835],{},"CellWithOption"," — casa bem com overlay de formulário e template fixo. Para documentos tipo nota fiscal com tabelas e chrome que repete, você acaba escrevendo um helper de layout em cima, e cai no mesmo poço em que os usuários de gofpdf caíram. gpdf e gopdf não competem de verdade — resolvem problemas vizinhos.",[18,1838,1839,1842,1845],{},[31,1840,1841],{},"gpdf tem uma versão comercial ou hospedada?",[22,1843,1844],{},"gpdf-api"," está a caminho — uma API hospedada que aceita templates JSON e devolve PDF. Ainda não é pública. No lançamento, vai ter post aqui no blog. A biblioteca OSS continua MIT, zero deps, e útil por conta própria.",[18,1847,1848,1851],{},[31,1849,1850],{},"Qual a ordem de prioridades do roadmap?","\nRoadmap público do gpdf em 2026-04: (1) campos de formulário AcroForm, (2) conformidade completa com PDF/A-3, (3) cobertura expandida de HTML→PDF no gpdf-pro, (4) suporte a texto RTL (árabe, hebraico). Feedback sobre prioridade é bem-vindo nas issues do GitHub.",[13,1853,1855],{"id":1854},"experimente-o-gpdf","Experimente o gpdf",[18,1857,1858],{},"gpdf é uma biblioteca Go para gerar PDFs. Licença MIT, zero dependências externas, suporte nativo a CJK.",[495,1860,1864],{"className":1861,"code":1862,"language":1863,"meta":500,"style":500},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[22,1865,1866],{"__ignoreMap":500},[504,1867,1868,1870,1873],{"class":506,"line":507},[504,1869,499],{"class":551},[504,1871,1872],{"class":622}," get",[504,1874,1875],{"class":622}," github.com/gpdf-dev/gpdf\n",[18,1877,1878,1884,1885],{},[94,1879,1883],{"href":1880,"rel":1881},"https://github.com/gpdf-dev/gpdf",[1882],"nofollow","⭐ Favoritar no GitHub"," · ",[94,1886,1889],{"href":1887,"rel":1888},"https://gpdf.dev/pt/docs/quickstart",[1882],"Ler a documentação",[13,1891,1893],{"id":1892},"próximas-leituras","Próximas leituras",[449,1895,1896,1902,1909,1914],{},[113,1897,1898,1901],{},[94,1899,1900],{"href":96},"gofpdf foi arquivada. Como migrar para o gpdf."," — o mapeamento de API linha a linha",[113,1903,1904,1908],{},[94,1905,1907],{"href":1906},"/pt/blog/go-pdf-library-showdown-2026","Comparativo de bibliotecas Go PDF 2026"," — benchmarks head-to-head mais fundos e grade de features",[113,1910,1911,1913],{},[94,1912,738],{"href":737}," — o idioma de builder que substitui o empurrar cursor",[113,1915,1916,1918,1919],{},[94,1917,1560],{"href":1559}," — CJK sem a dança do ",[22,1920,1555],{},[1922,1923,1924],"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":500,"searchDepth":530,"depth":530,"links":1926},[1927,1928,1929,1930,1931,1932,1933,1934,1935,1937,1938,1939,1940],{"id":15,"depth":530,"text":16},{"id":49,"depth":530,"text":50},{"id":104,"depth":530,"text":105},{"id":153,"depth":530,"text":154},{"id":201,"depth":530,"text":202},{"id":436,"depth":530,"text":437},{"id":750,"depth":530,"text":751},{"id":1574,"depth":530,"text":1575},{"id":1698,"depth":530,"text":1936},"Quando gpdf não é a escolha certa",{"id":1761,"depth":530,"text":1762},{"id":1788,"depth":530,"text":1789},{"id":1854,"depth":530,"text":1855},{"id":1892,"depth":530,"text":1893},"jung-kurt/gofpdf foi arquivado em 2021, go-pdf/fpdf em 2025. Este é o stack Go PDF que usamos em 2026 — gpdf, os trade-offs e o porquê.",false,"md",null,{},"/pt/blog/go-pdf-fpdf-archived",{"title":5,"description":1941},"pt/blog/006.go-pdf-fpdf-archived",[1950,1951,1952],"migration","comparison","benchmark","l9a4_wgQKmyZyb8P7wBzjs0ee66ak5XVBl6R9y6KwPE",1776529275927]