Estrutura de PDFs e IA: Como Desenvolver Modelos para Classificação Automática de Objetos
Em uma jornada de pesquisas e descobertas sobre a criação de PDFs, resolvi elaborar um mini manual com que aprendi. Vou começar uma breve introdução sobre PDF que é linguagem descrição de páginas (PDL) usada para definir o conteúdo, que organiza o conteúdo de forma hierárquica, utilizando objetos como textos, gráficos e metadados.
Para entender melhor a estrutura do pdf utilizei diversas ferramentas: como apache PDFBox, Itextpdf rups e py-pdf-parser. Todas ferramentas me ajudaram a entender sobre o direcionamento da hierarquia de objetos de um pdf.
Em diversas situações utilizei prompts de ia para identificar objetos e classificados em categoria de documentos.
Vamos a um simples hello word feito em php:
<?php
$pdf = "%PDF-1.4\n"; //Aqui já temos um grande potencial de duvidas e definições sobre quais objetos e caraterísticas esse pdf irá ter (https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.4.pdf)
// Objeto 1 - Definindo primeiro objeto, que é o Catálogo. Objeto fundamental liga a estrutura do documento ao conteúdo das páginas. Em particular, ele aponta para o objeto que descreve as páginas do documento, que está definido como o segundo objeto (referido como 2 0 R).
$pdf .= "1 0 obj\n";
$pdf .= "<< /Type /Catalog /Pages 2 0 R >>\n";
$pdf .= "endobj\n";
// Objeto 2 - define o dicionário de páginas. Ele especifica que há uma única página no documento, com apontamento para objeto que referencia inicio da página. Supondo que ele tenha dois objetos: /Kids [3 0 R 4 0 R] /Count 2 - Nesse caso a primeira referencia aponta para primeiro objeto (3 0 R) do da pagina 1 do documento e o segundo objeto (4 0 R) apontaria para primeiro objeto da segunda pagina.
$pdf .= "2 0 obj\n";
$pdf .= "<< /Type /Pages /Kids [3 0 R] /Count 1 >>\n";
$pdf .= "endobj\n";
// Objeto 3 – Nesta etapa temos as definições de tamanho da pagina e da font que será está referenciada no objeto F1 descrito no objeto 5, conforme indicado no dicionário /Font << /F1 5 0 R >>
$pdf .= "3 0 obj\n";
$pdf .= "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 28 10] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\n";
$pdf .= "endobj\n";
Nesta etapa temos o objeto de definição do conteúdo do pdf, contendo sua escada de transformação valores 1.1 e escala de rotação setadas como 0. O 1 referencia a vertical e 3 a horizontal de inicio da matriz de texto (Tm), como já vimos no objeto anterior temos uso da fonte /F1 do objeto 5 dicionario criado no objeto anterior com comando Tf. Conteúdo do pdf (Teste artigo) deve ser exibido pela referencia Tj.
Para entendimento de mais objetos, recomendo ver libs como https://github.com/galkahana/HummusJS/wiki/Use-the-pdf-drawing-operators que descrevem pouco sobre objetos e como eles podem ser construídos.
$content = "1.1 0 0 1.1 1 3 Tm /F1 5 Tf (Teste artigo) Tj\n";
$pdf .= "4 0 obj\n";
$pdf .= "<< /Length " . strlen($content) . " >>\n";
$pdf .= "stream\n";
$pdf .= $content . "\n";
$pdf .= "endstream\n";
$pdf .= "endobj\n";
Definição do objeto de fonte
$pdf .= "5 0 obj\n";
$pdf .= "<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\n";
$pdf .= "endobj\n";
// Cross-reference table
$xrefStart = strlen($pdf);
$pdf .= "xref\n";
$pdf .= "0 5\n";
$pdf .= "0000000010 00000 n \n"; // Posicionamento objeto 1
$pdf .= "0000000065 00000 n \n"; // Posicionamento objeto 2
$pdf .= "0000000128 00000 n \n"; // Posicionamento objeto 3
$pdf .= "0000000190 00000 n \n"; // Posicionamento objeto 4
$pdf .= "0000000280 00000 n \n"; // Posicionamento objeto 5
// Trailer
$pdf .= "trailer\n";
$pdf .= "<< /Size 5 /Root 1 0 R >>\n"; // Root aponta para o objeto 1
$pdf .= "startxref\n";
$pdf .= $xrefStart . "\n"; // Posicionamento do xref (início)
$pdf .= "%%EOF";
file_put_contents('meu_pdf.pdf', $pdf);
echo "PDF gerado com sucesso!\n";
Entendo pouco mais dos objetos e como eles funcionam em um pdf é fundamental para desenvolver modelos modelos de IA capazes de classificá-los automaticamente.