image

Accede a bootcamps ilimitados y a más de 650 cursos

50
%OFF

RP

Raphael Paez14/08/2024 23:50
Compartir

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.

    Compartir
    Comentarios (0)