Articolo tecnico

Risolvi il problema di riutilizzo del componente HotPDF

Questa versione localizzata affronta Fix the HotPDF component reuse issue 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

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

Controllo dello stato nel riuso di HotPDF

Il punto critico non è creare un altro oggetto, ma stabilire quando un'istanza di HotPDF torna davvero in uno stato iniziale. Se il flusso genera più documenti nella stessa sessione, ogni esecuzione deve chiudere il documento precedente, liberare le risorse associate e reimpostare le proprietà che influenzano output, font, pagine e sicurezza

In un'applicazione reale la riutilizzazione va trattata come una scelta architetturale esplicita. Per batch brevi può essere più chiaro creare e liberare un'istanza per documento; per batch lunghi può avere senso mantenere l'istanza, ma solo se esiste una routine di reset verificata. Questa routine deve pulire nome file, pagine pendenti, metadati, handle immagine, profili font e stato di protezione prima del documento successivo

La validazione deve riprodurre il difetto originale: generare due o più PDF consecutivi con dati diversi, riaprirli, controllare numero di pagine, testo visibile, risorse incorporate e dimensione del file, quindi ripetere la prova dopo un'eccezione. Se il secondo documento eredita qualcosa dal primo, il problema non è risolto anche se l'esempio minimo funziona

Esempi di codice aggiuntivi

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice.pdf';
    Pdf.BeginDoc;                        // opens the document
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Invoice 2026-042');
    Pdf.EndDoc;                          // writes invoice.pdf, closes it out
  finally
    Pdf.Free;                            // one instance, one document
  end;
end;
procedure WriteBatch(const Names: TArray<string>);
var
  I: Integer;
  Pdf: THotPDF;
begin
  for I := 0 to High(Names) do
  begin
    Pdf := THotPDF.Create(nil);         // new instance each pass
    try
      Pdf.FileName := Names[I] + '.pdf';
      Pdf.BeginDoc;
      Pdf.CurrentPage.SetFont('Arial', [], 12);
      Pdf.CurrentPage.TextOut(50, 760, 0, 'Statement for ' + Names[I]);
      Pdf.EndDoc;
    finally
      Pdf.Free;
    end;
  end;
end;
var
  Pdf: THotPDF;
  PageCount: Integer;
begin
  Pdf := THotPDF.Create(nil);
  try
    PageCount := Pdf.LoadFromFile('contract.pdf');
    if PageCount > 0 then
    begin
      Pdf.CurrentPage.SetFont('Arial', [fsBold], 10);
      Pdf.CurrentPage.TextOut(40, 30, 0, 'REVIEWED');
      Pdf.SaveLoadedDocument('contract-reviewed.pdf');
    end;
  finally
    Pdf.Free;
  end;
end;

Controllo dello stato nel riuso di HotPDF

Il punto critico non è creare un altro oggetto, ma stabilire quando un'istanza di HotPDF torna davvero in uno stato iniziale. Se il flusso genera più documenti nella stessa sessione, ogni esecuzione deve chiudere il documento precedente, liberare le risorse associate e reimpostare le proprietà che influenzano output, font, pagine e sicurezza

In un'applicazione reale la riutilizzazione va trattata come una scelta architetturale esplicita. Per batch brevi può essere più chiaro creare e liberare un'istanza per documento; per batch lunghi può avere senso mantenere l'istanza, ma solo se esiste una routine di reset verificata. Questa routine deve pulire nome file, pagine pendenti, metadati, handle immagine, profili font e stato di protezione prima del documento successivo

La validazione deve riprodurre il difetto originale: generare due o più PDF consecutivi con dati diversi, riaprirli, controllare numero di pagine, testo visibile, risorse incorporate e dimensione del file, quindi ripetere la prova dopo un'eccezione. Se il secondo documento eredita qualcosa dal primo, il problema non è risolto anche se l'esempio minimo funziona

Il riuso corretto significa creare una nuova istanza per ogni documento; per modificare un file esistente serve invece l'entry point di caricamento dedicato, e il blocco del file va gestito chiudendo il flusso applicativo, non inviando `WM_CLOSE` alle finestre del visualizzatore