<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ramalho Jackson</title>
    <description>The latest articles on DEV Community by Ramalho Jackson (@metalefs).</description>
    <link>https://dev.to/metalefs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F847034%2Fd34c4f70-0ad9-462c-87e9-64f20a016140.jpg</url>
      <title>DEV Community: Ramalho Jackson</title>
      <link>https://dev.to/metalefs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/metalefs"/>
    <language>en</language>
    <item>
      <title>Resolvendo Erros de Encoding e Texto Ilegível em PDFs:</title>
      <dc:creator>Ramalho Jackson</dc:creator>
      <pubDate>Thu, 22 Jan 2026 13:19:09 +0000</pubDate>
      <link>https://dev.to/metalefs/resolvendo-erros-de-encoding-e-texto-ilegivel-no-pdfjs-quando-o-ocr-salva-33f3</link>
      <guid>https://dev.to/metalefs/resolvendo-erros-de-encoding-e-texto-ilegivel-no-pdfjs-quando-o-ocr-salva-33f3</guid>
      <description>&lt;p&gt;Se você já tentou extrair texto de um PDF e acabou com lixo (&lt;code&gt;□□□&lt;/code&gt;, &lt;code&gt;(cid:45)&lt;/code&gt;, ``, [$d­2&amp;amp;'Ç0]) ao colar o conteúdo (ou até mesmo viu este lixo na tela), entenda o motivo neste post.&lt;/p&gt;

&lt;p&gt;Presumimos que se conseguimos &lt;strong&gt;ler&lt;/strong&gt; algo na tela, o conteúdo associado a este texto deve existir ou estar válido, isso não é verdade. A realidade do formato PDF é um pouco mais complexa.&lt;/p&gt;

&lt;p&gt;Vamos mergulhar um pouco no que está por trás disso:&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que o texto aparece correto, mas está quebrado?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Semântica&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Você vê o texto e consegue selecioná-lo, mas na área de transferência o conteúdo não corresponde ao que está sendo exibido. Ou, ao renderizar um PDF aparentemente normal em alguns visualizadores, o conteúdo é exibido corretamente,e em outros o texto é exibido com caracteres estranhos. Por que isso acontece?&lt;/p&gt;

&lt;h3&gt;
  
  
  Detalhamento:
&lt;/h3&gt;

&lt;p&gt;O PDF possui glifos visuais, mas não carrega um mapa de tradução destes caracteres para para caracteres Unicode.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No PDF, o texto é desenhado com apontamento para &lt;em&gt;índices de caracteres&lt;/em&gt; (CIDs ou 'Character IDs').&lt;/p&gt;

&lt;p&gt;Para desenhar a letra "A", o PDF diz: &lt;em&gt;"Use o desenho do índice 35 da fonte X"&lt;/em&gt;, e assim por diante.&lt;/p&gt;

&lt;p&gt;Para extrair um conteúdo de texto, o PDF precisa de uma tabela de mapeamento de CID para Unicode (ToUnicode Map) que diga: &lt;em&gt;"O CID 35 é o símbolo U+0041 ('A')" do Unicode&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando esse mapa está ausente ou inválido, os visualizadores de PDF utilizam heurísticas próprias para desenhar os CIDs, e essa renderização pode estar correta em alguns viewers (principalmente fora dos browsers), mas invariavelmente o Copia e Cola irá retornar lixo, ou CIDs crus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse tratamento difere entre visualizadores, por isso o mesmo arquivo que aparece correto no PDFium e Adobe Reader, por exemplo, pode exibir lixo em outro viewer. E sempre irá exibir lixo em renderizadores html, e em alguns interpretadores de PDF, como o GhostScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que mudar o 'Encoding' não resolve:
&lt;/h2&gt;

&lt;p&gt;Não me engane dizendo que nunca tentou corrigir esse problema forçando uma decodificação, como se o PDF fosse um arquivo de texto UTF-8:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo5gugqg1fco2mam19en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo5gugqg1fco2mam19en.png" alt="code snippet" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ou tentou (provavelmente em vão) encontrar alguma forma de adicionar o mapa de fonte posteriormente, querendo corrigir a renderização de fontes. Além de complicado, esses processos não são garantidos, e soluções de PDF são caras.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Porque Falha:&lt;/strong&gt;&lt;br&gt;
Não é uma questão de encoding incorreto (como UTF-8 ou ANSI). É uma questão de dados ausentes. &lt;/p&gt;

&lt;p&gt;Se o leitor não sabe que o glifo desenhado é um "A", nenhuma configuração de encoding irá solucionar isso. O elo entre o visual e o significado está quebrado desde a criação do arquivo. &lt;/p&gt;

&lt;p&gt;Muitas vezes isso ocorre no resultado de algum software legado que gera layout e ignora semântica.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solução Unificada: OCR (Optical Character Recognition)
&lt;/h2&gt;

&lt;p&gt;A solução para PDFs escaneados/achatados e PDFs com mapas ToUnicode ausentes pode ser a mesma: &lt;strong&gt;Ignorar o conteúdo semântico e tratar da camada visual.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Reconhecimento Óptico de Caracteres (OCR) funciona nesse cenário porque ele considera apenas o visual (a parte ainda correta), e reconstrói a semântica.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Fluxo de Correção:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1obe8gb25hs6yr4x5bzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1obe8gb25hs6yr4x5bzu.png" alt="correction flow chart" width="800" height="1523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Implementação (Node.js)
&lt;/h3&gt;

&lt;p&gt;Esta abordagem em pseudo-codigo, resolveria tanto para documentos escaneados, quanto os com erros de mapeamento, pois converte tudo para imagem primeiro e reconstrói o conteúdo de texto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcj3tbgky2fmgejpiwcpp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcj3tbgky2fmgejpiwcpp.png" alt="code snippet" width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O Ponto Cego: Formulários e Widgets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Aqui está o grande problema&lt;/strong&gt;. Ao usar bibliotecas de OCR padrão (como Tesseract ou soluções genéricas) todas elas tratam o documento apenas como uma imagem; Enquanto ele resolve o problema do PDF escaneado, ele quebra o formulário, e se ele retorna o formulário, ele mantém o erro na semântica (ainda renderiza errado, e o conteúdo copiado é lixo).&lt;/p&gt;

&lt;p&gt;Se o PDF original possuía campos de formulário &lt;strong&gt;(os AcroForms de PDF)&lt;/strong&gt;, checkboxes e widgets interativos, etc., o processo tradicional de OCR irá 'achatá-los', você vai perder tudo. O resultado será um PDF com texto pesquisável, mas que perdeu a capacidade de preenchimento.&lt;/p&gt;

&lt;p&gt;A única ferramenta atual que realiza esse processo de reconstrução da camada de texto &lt;strong&gt;mantendo a integridade de widgets originais&lt;/strong&gt; é essa:&lt;br&gt;
&lt;a href="https://textlayerocr.com" rel="noopener noreferrer"&gt;TextLayerOCR&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Ela processa a correção visual sem destruir os metadados interativos do documento. Vamos ver algumas estratégias para alcançar este resultado:&lt;/p&gt;

&lt;h2&gt;
  
  
  Estratégia Híbrida para Produção
&lt;/h2&gt;

&lt;p&gt;Em sistemas reais, OCR é caro (pelo processamento pesado). Não deve ser feito em todos os casos. Uma estratégia inteligente de OCR detecta a quantidade de problemas semânticos antes de decidir usa-lo, identificando se alguma das fontes não possui mapeamento explicito.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojiamm8g5ma94odb6r1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojiamm8g5ma94odb6r1g.png" alt="code snippet" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A renderização de um PDF depende da integridade interna do arquivo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visual e semântico são duas coisas distintas:&lt;/strong&gt; Ver o texto na tela não garante que o computador sabe o que está escrito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CIDs vs Unicode:&lt;/strong&gt; Se o mapa ToUnicode não existe (ou está errado), o visualizador só consegue desenhar e não entender, (isso quando desenha alguma coisa).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OCR é uma Solução:&lt;/strong&gt; Para os casos de Scan ou Fontes Quebradas, a solução mais robusta é usar OCR para regenerar a camada semântica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preservação:&lt;/strong&gt; Se o seu fluxo exige formulários ativos, ferramentas de OCR comuns não funcionam (testamos todas as principais); você precisará de uma solução especializada.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://textlayerocr.com" rel="noopener noreferrer"&gt;TextLayer OCR&lt;/a&gt; - Teste a API que lida automaticamente com falhas de mapa Unicode e processa a correção visual sem destruir os metadados interativos do documento.&lt;/p&gt;




&lt;p&gt;Threads relacionadas:&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/12857849/how-to-repair-a-pdf-file-and-embed-missing-fonts" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/12857849/how-to-repair-a-pdf-file-and-embed-missing-fonts&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/dompdf/dompdf/issues/1717" rel="noopener noreferrer"&gt;https://github.com/dompdf/dompdf/issues/1717&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Vanuan/unicodify_pdf" rel="noopener noreferrer"&gt;https://github.com/Vanuan/unicodify_pdf&lt;/a&gt;&lt;br&gt;
&lt;a href="https://support.axes4.com/hc/en-us/articles/7371586760210-Edit-Unicode-Mapping" rel="noopener noreferrer"&gt;https://support.axes4.com/hc/en-us/articles/7371586760210-Edit-Unicode-Mapping&lt;/a&gt;&lt;br&gt;
&lt;a href="https://superuser.com/questions/1275337/resetting-unicode-mappings-in-pdf-text" rel="noopener noreferrer"&gt;https://superuser.com/questions/1275337/resetting-unicode-mappings-in-pdf-text&lt;/a&gt;&lt;br&gt;
... dentre várias.&lt;br&gt;
&lt;a href="https://textlayerocr.com" rel="noopener noreferrer"&gt;TextLayer OCR&lt;/a&gt; - Teste a API que lida automaticamente com falhas de mapa Unicode.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>pdf</category>
      <category>ocr</category>
      <category>pdfjs</category>
    </item>
  </channel>
</rss>
