Esta versão localizada trata de Text, Image, and Font Extraction from PDF in Delphi with PDFlibPas usando o artigo em inglês atualizado como referência técnica para equipes Delphi, PDF e software documental
A página transforma a base atualizada em pontos de controle práticos para projeto, implementação e validação
Conteúdo sincronizado a partir da base em inglês
O artigo base foi ampliado com contexto prático, decisões técnicas e exemplos concretos, então esta página deve ser lida como guia de trabalho, não como resumo curto
Pontos importantes da versão atualizada:
- Use primeiro arquivos de entrada pequenos e reproduzíveis
- Mantenha intactos nomes de produto, API, arquivos e valores literais
- Salve a saída do validador e as versões junto com o arquivo de teste gerado
Decisões práticas de implementação
Comece pelo tipo de arquivo, pelo resultado esperado e pelo estado de erro que o usuário precisa ver. Depois conecte cada chamada API a um resultado verificável para que validação, logs e suporte possam reproduzir o caso do cliente
- Use primeiro arquivos de entrada pequenos e reproduzíveis
- Mantenha intactos nomes de produto, API, arquivos e valores literais
- Salve a saída do validador e as versões junto com o arquivo de teste gerado
Código e pontos API
Os exemplos de código são preservados sem alteração para comparação direta com projetos Delphi, C++Builder e Lazarus/FPC
var
Pdf: TPDFlib;
Blocks, I: Integer;
begin
Pdf := TPDFlib.Create;
try
if Pdf.LoadFromFile('contract.pdf', '') <> 1 then
raise Exception.Create('load failed');
Pdf.SelectPage(1);
Blocks := Pdf.ExtractPageTextBlocks(0);
for I := 0 to Pdf.GetTextBlockCount(Blocks) - 1 do
Writeln(Format('%s [%s %.1f pt at %.0f,%.0f]',
[Pdf.GetTextBlockText(Blocks, I),
Pdf.GetTextBlockFontName(Blocks, I),
Pdf.GetTextBlockFontSize(Blocks, I),
Pdf.GetTextBlockBound(Blocks, I, 0),
Pdf.GetTextBlockBound(Blocks, I, 1)]));
Pdf.ReleaseTextBlocks(Blocks);
finally
Pdf.Free;
end;
end;var
ImgList, I: Integer;
begin
Pdf.SelectPage(1);
ImgList := Pdf.GetPageImageList(0);
for I := 0 to Pdf.GetImageListCount(ImgList) - 1 do
begin
Writeln(Pdf.GetImageListItemFormatDesc(ImgList, I, 0));
Pdf.SaveImageListItemDataToFile(ImgList, I, 0,
Format('page1-img%.2d.bin', [I]));
end;
Pdf.ReleaseImageList(ImgList);
end;var
I: Integer;
begin
Pdf.FindFonts;
for I := 1 to Pdf.FontCount do // font indexes start at 1, not 0
if Pdf.SelectFont(Pdf.GetFontID(I)) = 1 then
Writeln(Format('%s type=%d embedded=%d subset=%d',
[Pdf.FontName, Pdf.FontType,
Pdf.GetFontIsEmbedded, Pdf.GetFontIsSubsetted]));
end;Verificação antes da publicação
Revise o arquivo de saída com as mesmas ferramentas que o cliente ou o arquivo documental usará. Registre versão do componente, dados de teste, versão do validador e resultado observado