Em posts anteriores, explorámos a incorporação de documentos em ficheiros PDF/A-3 usando 4D Write Pro, incluindo a geração de facturas electrónicas. À medida que a faturação eletrónica se torna obrigatória em vários países europeus – como a França e a Alemanha – a capacidade de extrair ficheiros XML incorporados destes PDFs está a tornar-se crucial. Mas a utilidade do PDF/A-3 vai para além das facturas; estes ficheiros podem incorporar vários tipos de documentos que podem exigir extração.
Enquanto ferramentas como Adobe Acrobat Reader oferecem extração manual, este post introduz um método eficiente e automatizado usando 4D 20 R6 para lidar facilmente com o processo.
HDI: Extração de Arquivos PDF/A3
Um componente dedicado
Um componente dedicado foi desenvolvido para permitir a extração de todos os arquivos do recinto (na memória) e gerenciá-los da maneira que precisa uma vez que tenha feito isso. Por exemplo, um ficheiro XML pode ser analisado diretamente numa árvore DOM, enquanto um ficheiro de imagem pode ser guardado no disco, etc.
GESTOR DE COMPONENTES
Esse componente pode ser facilmente instalado graças ao gerenciador de componentes que é realmente simples de usar e faz parte de 4D 20 R6. Apenas crie um arquivo dependencies.json dentro de sua pasta Sources e digite essas simples linhas dentro. O componente será instalado assim que seu projeto for lançado. O HDI fornecido é baseado nesse mecanismo.
{
"dependencies":
{
"4D-QPDF":
{
"github": "4d/4D-QPDF",
"version":"*"
}
}
}
Extração
Um único método do componente permite-lhe obter a lista e o conteúdo dos documentos incluídos num ficheiro PDF.
$colAttachments:=PDF Get attachments ($PDFfile)
Este método devolve uma coleção que contém objectos, cada um descrevendo e contendo um anexo.
Estes objectos conterão atributos como name, extension, fullName, mimeType, content, etc., descritos na íntegra no HDI e na documentação do componente.
$path:="/DATA/TestPDFs/ManyEnclosures.pdf"
$PDFfile:=File($path; fk posix path)
Form.attachments:=PDF Get attachments($PDFfile)
Ou, claro, no caso das facturas electrónicas, pode ir diretamente para o elemento xml incluído!
$XMLattachments:=PDF Get attachments($file).query("mimeType = :1"; "text/xml")
If ($XMLattachments.length#0)
$xml:=BLOB to text($XMLattachments[0].content; UTF8 text without length)
$dom:=DOM Parse XML variable($xml)
End if
A documentação do componente no github descreve mais funções (verificação, atualização, etc.) em pormenor.
Um exemplo de um diálogo de extração
A IDH fornecida demonstrará como apresentar os invólucros numa caixa de listagem com base na coleção devolvida.
Conclusão
Esse componente, com seu código fonte disponível no GitHub, aproveita a biblioteca QPDF (uma solução de código aberto disponível gratuitamente aqui) para fornecer um método confiável para extrair anexos de arquivos PDF/A-3 dentro de suas aplicações 4D. Está pronto para ser usado imediatamente através do gerenciador de componentes, com flexibilidade para personalização conforme suas necessidades crescem ou a biblioteca QPDF evolui.