Articolo tecnico

PDFlibPas: text, image, and font extraction in Delphi

Questa versione localizzata affronta Text, Image, and Font Extraction from PDF in Delphi with PDFlibPas usando l'articolo inglese aggiornato come riferimento tecnico per team Delphi, PDF e software documentale

La pagina trasforma la base aggiornata in punti di controllo pratici per progettazione, implementazione e validazione

Contenuto sincronizzato dalla base inglese

L'articolo di base è stato ampliato con contesto operativo, decisioni tecniche ed esempi concreti, quindi questa pagina va letta come guida di lavoro e non come breve riepilogo

Punti importanti della versione aggiornata:

  • Usare prima file di input piccoli e riproducibili
  • Mantenere invariati nomi di prodotto, API, file e valori literal
  • Salvare output del validatore e versioni insieme al file di prova generato

Scelte pratiche di implementazione

Partire dal tipo di file, dal risultato atteso e dallo stato di errore visibile all'utente. Collegare poi ogni chiamata API a un risultato verificabile, così validazione, log e supporto possono riprodurre il caso del cliente

  • Usare prima file di input piccoli e riproducibili
  • Mantenere invariati nomi di prodotto, API, file e valori literal
  • Salvare output del validatore e versioni insieme al file di prova generato

Codice e punti API

Gli esempi di codice restano invariati per poterli confrontare direttamente con progetti 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;

Controllo prima della pubblicazione

Verificare il file di output con gli stessi strumenti che userà il cliente o l'archivio. Annotare versione del componente, dati di test, versione del validatore e risultato osservato