Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: kelly - Settembre 19, 2017, 04:19:20 pm

Titolo: LETTURA FILE PDF
Inserito da: kelly - Settembre 19, 2017, 04:19:20 pm
Salve,

Devo leggere un file pdf per rinominarlo in base al contenuto.
Oppure convertirlo in file di testo, leggere il contenuto e poi rinominarlo.

Dove posso trovare qualche esempio, o scaricare qualche componente che mi permetta di fare questo?



grazie 1000
Titolo: Re:LETTURA FILE PDF
Inserito da: xinyiman - Settembre 19, 2017, 05:45:52 pm
Per convertire un pdf in txt devi usare un ocr. Prova con tesseract che è un progetto open-source.

Però non è detto che converta correttamente. SAppilo
Titolo: Re:LETTURA FILE PDF
Inserito da: Stilgar - Settembre 20, 2017, 03:52:33 pm
Ciao.
Oddio che drastico xinyiman... ocr...
Esistono programmi da riga di comando che più o meno lo fanno.

pdftotext.exe per dirne uno (https://en.wikipedia.org/wiki/Pdftotext (https://en.wikipedia.org/wiki/Pdftotext)).
mutool.exe converte in html i pdf  (https://mupdf.com/ (https://mupdf.com/)) .

Altrimenti ci sono altre soluzioni open source.
Esistono dei bind parziali della libreria libmupdf.dll compilata dal progetto sumatrapdf che possono andare benino.
PDFPreview.pas(git) rende la libreria pensata per windows compilata anche per linux (per i fanatici del porting .. :) )

https://github.com/dinmil/PDFPreview (https://github.com/dinmil/PDFPreview)
Si limita alla versione 1.8 mentre la libreria usata è arrivata alla versione 1.11.

Buttare l'occhio non guasta ;)

Stilgar
Titolo: Re:LETTURA FILE PDF
Inserito da: xinyiman - Settembre 20, 2017, 09:26:19 pm
Grazie Stilgar. c'è sempre da imparare
Titolo: Re:LETTURA FILE PDF
Inserito da: bonmario - Settembre 21, 2017, 08:05:48 am
pdftotext.exe per dirne uno (https://en.wikipedia.org/wiki/Pdftotext (https://en.wikipedia.org/wiki/Pdftotext)).

Io mi sono trovato molto bene con questo.

Ciao, Mario
Titolo: Re:LETTURA FILE PDF
Inserito da: kelly - Settembre 21, 2017, 03:35:20 pm
grazie infinite a tutti....provo...
Titolo: Re:LETTURA FILE PDF
Inserito da: kelly - Settembre 26, 2017, 04:10:23 pm
Salve ragazzi ...

Come suggerito sto utilizzando l'utility pdftotext.exe ,
e devo dire anche con successo...ho solo un piccolo problema ,
una volta creato il file di testo controllo l'effettiva esistenza e
purtroppo a volte  la creazione del file
è tardiva rispetto al controllo ....e quindi non esegue tutte le istruzioni.

cosa mi posso inventare per risolvere il problema?

grazie


Codice: [Seleziona]
    Proc := TProcess.Create(nil);
       Proc.CommandLine := 'pdftotext.exe ' + nomefilepdf_new;
       Proc.Execute;
       Proc.Free;

    if (FileExists(nomefilepdf_new.txt)) then
    begin
     //qualcosa
    end;
Titolo: Re:LETTURA FILE PDF
Inserito da: Stilgar - Settembre 26, 2017, 04:14:23 pm
Devi rendere sincrona l'esecuzione.
Altrimenti speri nella poderosa botta di sedere.
 :)
Ti mando un esempio:

Codice: [Seleziona]

type

  { TPdfToTextProcess }

  TPdfToTextProcess = class
  private
    FPDFFile: TFileName;
    procedure SetPDFFile(AValue: TFileName);
  protected
    FMemoryBuffer: TMemoryStream;
    FProcess: TProcess;
    FOutput: TInputPipeStream;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Execute; virtual;
    property PDFFile: TFileName read FPDFFile write SetPDFFile;
    function getOutputText: string;
  end;

Codice: [Seleziona]

{ TPdfToTextProcess }

procedure TPdfToTextProcess.SetPDFFile(AValue: TFileName);
begin
  if FPDFFile = AValue then
  begin
    Exit;
  end;
  FPDFFile := AValue;
end;

constructor TPdfToTextProcess.Create;
begin
  inherited Create;
  FProcess := TProcess.Create(nil);
  FProcess.Options := [poUsePipes, poStderrToOutPut];
  FMemoryBuffer := TMemoryStream.Create;
end;

destructor TPdfToTextProcess.Destroy;
begin
  FMemoryBuffer.Free;
  FProcess.Free;
  inherited Destroy;
end;

procedure TPdfToTextProcess.Execute;
const
  READ_BYTES = 4096;
var
  n, BytesRead: longint;
begin
  BytesRead := 0;
  N := 0;
  FMemoryBuffer.Clear;
  FMemoryBuffer.SetSize(READ_BYTES);
  FProcess.CommandLine := 'pdftotext -simple -clip ' + FPDFFile + ' -';
  FProcess.Execute;
  while FProcess.Running do
  begin
    FMemoryBuffer.SetSize(BytesRead + READ_BYTES);
    n := FProcess.Output.Read((FMemoryBuffer.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then
    begin
      Inc(BytesRead, n);
    end
    else
    begin
      Sleep(50);
    end;
  end;
  repeat
    FMemoryBuffer.SetSize(BytesRead + READ_BYTES);
    n := FProcess.Output.Read((FMemoryBuffer.Memory + BytesRead)^, READ_BYTES);
    if n > 0 then
    begin
      Inc(BytesRead, n);
    end;
  until n <= 0;
  FMemoryBuffer.SetSize(BytesRead);
end;

function TPdfToTextProcess.getOutputText: string;
begin
  SetString(Result, PChar(FMemoryBuffer.Memory), FMemoryBuffer.Size div SizeOf(char));
end;
Titolo: Re:LETTURA FILE PDF
Inserito da: SB - Ottobre 01, 2017, 10:24:51 am
Buon per te che ti funziona
Per quanto ne so i pdf sono destrutturati, cioè i testi sono in realtà caselle di testo piazzate sulla pagina.
Non c'è nessun ordine nel testo e un programma potrebbe "stampare" prima il fondo della pagina e poi la testa.
Oppure il testo potrebbe essere in realtà un'immagine.
Oppure ancora il contenuto potrebbe essere criptato o compresso
Paradossalmente, nel caso generale passare per l'ocr potrebbe essere la soluzione più efficace.
Per fortuna nel tuo caso si tratta di un semplice testo che un programma riesce ad estrarre facilmente
Titolo: Re:LETTURA FILE PDF
Inserito da: Stilgar - Ottobre 01, 2017, 10:55:30 am
Ciao sb.
Vero la struttura interna di un pdf è abbastanza da mal di pancia.
Vero anche che può avere contenuti criptati e compressi.
Un programma con quello suggerito bypassa tutti questi aspetti mettendo in ordine i blocchi di testo e presentando un testo lineare per una lettura "spicciola". Limite di questo approccio è il contenuto tabellare del pdf. Si potrebbe mangiare qualche spazio. Non si può nemmeno controllare eventi punti firma per i pdf contrassegnati con firme  digitali.
Insomma non è la soluzione per la gestione completa dei pdf. Siamo d'accordo su questo. Basta essere coscienti delle limitazioni delle soluzioni 😉
L'ocr, al di là del'inevitabile errore dovuto a immagini  che lo possono ingannare, può aiutare nel caso di blocchi immagini.
Per la maggior parte dei pdf, almeno per la mia personalissima esperienza lavorativa (un datastore da 17terabyte è abbastanza impegnativo da gestire a livello dischi) sono tutti testi "posizionati". Sono poche le scansioni che gestisco. In genere sono dovute a "recuperi" di cartaceo per invio in conservazione  "sostitutiva"  a norma di legge. Se parliamo di aziende. Generare il pdf con i testi, produce pdf più piccoli che digitalizzare la carta. 10k contro 100k per capirsi ad ordini di grandezza. Quindi costano meno da conservare e consultate.
Se ragioniamo a livello domestico potrebbero aprirsi scenari completamente diversi. I pdf che gestisco a casa sono fatture che fornitori ... giurassichi (a livello informatico almeno) che si ostinano a mandarmi col postino. 😂😂