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
GÅ
Legg de neste to linjer for å behandle kommandolinjeargumentene som brukeren vil passere i:
min $ file = shift
GÅ
min $ search = shift
GÅ
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)
GÅ
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)
GÅ
Legg neste manuset uttalelse å splitte sidens teksten opp i en rekke separate linjer:
@lines = split (/ \ n /, $ str)
GÅ
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
GÅ
foreach $ linje (@lines)
{
++$i
GÅ
if($line =~ /$search/)
{
print \"\\\"$search\\\" found in line $i of page $p\\n\"
GÅ
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.