Hvordan bruke Perl til søke et PDF-dokument

Hvordan bruke Perl til søke et PDF-dokument


Perl-skript \ "krype \" over nettet, sifting gjennom havet av HTML-sider for informasjon, og uunngåelig møte noen av de millioner av Adobe Acrobat PDF-filer stenket over Internett. Selv om de er klar til å skrive ut og attraktivt, fra synspunkt av en web crawler, PDF-filer er en litt hardere nøtt å knekke enn enkle, tekstbaserte HTML-sider. Heldigvis, som med mange web oppgaver, det er et Perl modul som kan bidra til å gjøre livet enklere: CAM :: PDF. Denne programmeringsgrensesnitt, selv om det meste ment å skape og manipulere PDF-filer, har noen verktøy som gjør det mulig skript for å søke deres innhold.

Bruksanvisning

1 Installer CAM :: PDF. Den CPAN verktøyet gir den enkleste måten å gjøre dette - start CPAN på kommandolinjen og på teksten skriver \ "installere CAM :: PDF \" (uten anførselstegn).

2 Åpne en redaktør og starte skriptet, inn følgende linjer for å starte Perl tolk og importere den nødvendige modulen:

! / Usr / bin / perl

bruke CAM :: PDF

Legg de neste to linjer for å behandle kommandolinjeargumentene som brukeren vil passere i:

min $ file = shift

min $ search = shift

Det første argumentet som sendes til skriptet vil være navnet på en PDF-fil, og den andre, søkestrengen.

3 Opprett en ny CAM :: PDF objekt ved å legge til følgende linje i skriptet:

min $ doc = CAM :: PDF-> ny ($ file)

Ved hjelp av den importerte modulens NUMPAGES metode for å definere den øvre grensen, lage en løkke til å behandle hver side av dokumentet:

foreach min $ p ((1 .. $ do-> NUMPAGES ()))
{

4 Innenfor loop, legge til denne linjen for å få hver side av tekst fra PDF-filen:

min $ str = $ do-> getPageText ($ p)

Legg neste manuset uttalelse å splitte sidens teksten opp i en rekke separate linjer:

@lines = split (/ \ n /, $ str)

Avslutt sløyfe uttalelse ved å skrive en avsluttende parentes:

}

5 Til slutt legger en annen sløyfe til skriptet til å behandle hver linje på siden og søke en kamp for brukerens søkestrengen som et regulært uttrykk. Hvis det regulære uttrykket returnerer en kamp, ​​dette eksempelet skriver linjen og sidetallet til stdout. I stedet for disse utskrifts uttalelser, bør du implementere kode for å behandle resultatene etter behov.

min $ i = 0

foreach $ linje (@lines)
{

++$i

if($line =~ /$search/)
{
print \"\\\"$search\\\" found in line $i of page $p\\n\"

print \"$line\\n\\n\"
}

}

Hint

  • Fordi teksten i PDF-filer ikke er hierarkisk organisert som det av HTML-filer, vil du mest sannsynlig trenger å designe skript for å søke visse typer PDF-filer (for eksempel skjemaer, bulletiner, tidsplaner). Det kan ikke være mulig å skrive et robust Perl-skript som effektivt kan søke hvilken som helst type PDF-fil.