Avatar billede KurtG Forsker
21. januar 2025 - 17:16 Der er 26 kommentarer

PHP-funktion til at søge i pdf-filer

Jeg skal lave et site, der kan søge i nogle pdf-filer. De indeholder nogle avissider, som er skannet og lavet til søgbar pdf.
Findes der et modul eller lignende til at gøre det og samtidig fortælle hvilken side ordet er fundet på?
Avatar billede arne_v Ekspert
21. januar 2025 - 17:55 #1
Jeg kan se 3 måder at løse dette på:

1) lav en søge PHP side som itererer over alle filer og bruger et PDF library (som f.eks. FPDF) til at læse filerne. Overkommeligt men langsomt og resourcekrævende.

2) lav et load PHP script som itererer over alle filer og bruger et PDF library (som f.eks. FPDF) til at læse filerne og gemmer teksten i en fulltext database (MySQL har fulltext mulighed) og en søge PHP side som bruger den fulltext database. Mere arbejde men hurtigere og mere effektivt.

3) brug en text search engine med support for PDF (der er mange - en af dem er Solr med Tika), prop PDF filerne ind i den og lave en søge PHP side som requester information via web service kald til  text search engine. Nemt og effektivt, men medmindre din hosting facilitet har sådan noget kørende allerede er det nok for krævende at få op at køre.
Avatar billede KurtG Forsker
21. januar 2025 - 19:24 #2
Tak, Arne.
Men jeg er ikke helt med: hvad indbefatter itererer?
Avatar billede arne_v Ekspert
21. januar 2025 - 19:40 #3
Det afhænger af hvordan de PDF filer er organiseret.

Men hvis de bare er i et eller flere separate data directories så kan opendir/readdir/closedir gøre det.

Giver det mening eller snakker jeg sort?
Avatar billede KurtG Forsker
21. januar 2025 - 19:54 #4
Ikke helt sort, så jeg vil studere dine forslag lidt inden jeg spørger mere dumt!
Avatar billede a3-seo.dk Ekspert
22. januar 2025 - 14:34 #5
For at søge tekst i pdf dokumenter skal de først være gemt med tekstgenkendelse (Adope acrobat pro). Der efter kan der søges i dem, som om det var rene text filer.
Det vil spare meget tid med opsætningen af søgefunktionen og ligeledes database og server belastning
Avatar billede Kim Schacht Juniormester
22. januar 2025 - 22:05 #6
Ja, der findes løsninger i PHP til at søge i PDF-filer og finde, på hvilken side søgeordet forekommer. For at implementere dette kan du bruge et PHP-bibliotek som **TCPDF**, **FPDI**, eller mere avanceret som **Poppler-utils** (via PHP-kommandoer) eller **PdfParser**.

Her er nogle trin og en løsning:

---

1. **Brug af PdfParser (smarte værktøjer til tekstanalyse)**
PdfParser er et PHP-bibliotek, der kan ekstrahere tekst fra PDF-filer. Du kan bruge det til at søge i teksten og finde, hvilken side der indeholder søgeordet.

Installation
Installer **PdfParser** via Composer:
```bash
composer require smalot/pdfparser
```

Kodeeksempel
```php
<?php
require 'vendor/autoload.php';

use Smalot\PdfParser\Parser;

// Indlæs PDF-filen
$parser = new Parser();
$pdf = $parser->parseFile('path/to/your/file.pdf');

// Få alle sider i PDF
$pages = $pdf->getPages();
$searchWord = 'avissider'; // Søg efter dette ord

foreach ($pages as $index => $page) {
    $text = $page->getText();
    if (stripos($text, $searchWord) !== false) {
        echo "Ordet '{$searchWord}' blev fundet på side " . ($index + 1) . "\n";
    }
}
?>
```

---

2. **Fordele ved PdfParser**
- Ekstraherer tekstside for side.
- Let at implementere.
- Finder det præcise sted, hvor søgeord findes.
- Virker med søgbare PDF'er (OCR-baserede PDF'er).

---

3. **Hvis PDF'en ikke har tekst (billede-baseret OCR)**
Hvis PDF-filerne kun er skannede billeder og ikke har søgbare tekstlag, skal du bruge et OCR-værktøj som **Tesseract OCR**. PHP kan interagere med Tesseract for at analysere billedteksten.

Installation af Tesseract og PHP-eksempel
1. Installer Tesseract på din server.
2. Ekstraher tekst fra hver side og søg med lignende logik.

Eksempel:
```php
$output = [];
exec("tesseract path/to/page1.pdf stdout", $output);
$text = implode("\n", $output);
if (stripos($text, 'søgeord') !== false) {
    echo "Ordet blev fundet på denne side!";
}
```

---

4. **Kombination med UI**
Du kan tilføje et brugervenligt søgefelt på dit site, hvor brugere kan skrive et søgeord, og serveren kører ovenstående kode for at vise resultater.

---
Avatar billede KurtG Forsker
23. januar 2025 - 14:06 #7
Det er efterhånden længe siden, jeg lavede hjemmesider, så det vil kræve lidt genoptræning.
Jeg har alle filerne som pdf, der har været gennem OCR, så det er tekst, der skal findes.
Umiddelbart er #6 det, der siger mig mest, så når jre får afsluttet fotograferingen, vil jeg forsøge med det!
Tak til jer alle for jeres svar.
Avatar billede KurtG Forsker
18. marts 2025 - 08:28 #8
Jeg har tænkt lidt på hastigheden ved søgning.
Jeg har prøvet at hente teksten ud af nogle avis og sammenlignet filstørrelserne.
Pdf-filerne fylder omkring 50 gange så meget som txt-filerne.
Vil søgehastigheden ved søgning så være 50 gange hurtigere end søgning i pdf-filer?
Eller har PdfParser nogle smarte egenskaber, der stiller metoderne mere lige?
Avatar billede a3-seo.dk Ekspert
18. marts 2025 - 09:26 #9
Lyder lidt, som du skyder gråspuve med kanoner, eller sloges med vindmøller som Don Qousite (temmerligt sikkert, ikke stavet korrekt). En pdf fil korrekt optimeret fylder ikke mere end en txt fil. OG ingen filer må overskride en grænse på 50 kb. Hvis dine pdf filer fylder mere end dine tekst filer - no comments. Du kan henvende dig eller søge hjælp her i forummet, men har ikke set nogle brugbare svar på dit spørgsmål endnu - giv et kald når du er klar .....
Avatar billede KurtG Forsker
18. marts 2025 - 10:16 #10
Det lyder som om jeg er helt galt afmarcheret med mit projekt.
Mine filer er langt for store!
Jeg vil forklare min fremgangsmåde, måske er der et sted at minimere filstørrelserne!

1. Jeg fotograferer avissiderne et ad gangen med et Canon EOS800d kamera. Det er på 24 Mpix. Eks.: Vinderup Avis 1937-001.CR2 ca. 32Mbyte.
2. CR2-formatet konverteres til tif-format. Vinderup Avis 1937-001.tif fylder nu > 144 Mbyte. Til konverteringen bruges Adope Photo Element 2024.
3. Billederne retvendes, beskære samt optimeres med farve og kontrast (aviserne kan være meget gulnede). Nu fylder filen 72 MByte.
4. Billederne køres gennem FineReader 14, hvor siderne gøres søgbare og gemmes som *.pdf. Den fylder nu med fire sider (avisens størrelse) 2,7 MByte.
Der er jo langt ned til 50 kbyte.
Hvor kan jeg optimere?
Avatar billede a3-seo.dk Ekspert
18. marts 2025 - 11:25 #11
Send mig 1 af dem du betragter som færdige ....
Avatar billede a3-seo.dk Ekspert
18. marts 2025 - 11:27 #12
Har du overvejet at scanne dem dirkte til .pdf filer ??
Avatar billede KurtG Forsker
18. marts 2025 - 13:00 #13
Jeg vil gerne sende #11 en fil, men mailadressen på hjemmesiden bliver forkastet af postmaster.

Da jeg ikke har en skanner, der kan tage 50 cm x 70 cm kan jeg ikke skanne direkte.
Filformatet CR2 fra kameraet kan ikke bruges af nogen af mine programmer, derfor skal det konverteres. Da billedformatet (2:3) ikke stemmer overens med avisernes format, klipper jeg i billederne. Den efterfølgende filbehandling gør aviserne merelæsbare.
Avatar billede arne_v Ekspert
18. marts 2025 - 16:18 #14
Søgning i direkte filer vil aldrig være hurtigt. Skal det være hurtigt er du nødt til at generere et indeks (løsning 2 og 3 i indlæg #1).

Men er du kommet igang med at parse de PDF filer? Det er nemmere at optimere hvis man løbende kan teste.
Avatar billede KurtG Forsker
18. marts 2025 - 18:01 #15
#14.
Jeg ved ikke, hvad du mener med at parse?
Den tekst, som kommer ud af pdf-filerne er der ikke nogen logik i, aviserne er i spalter der ikke på nogen måde er systematisk.
Du skriver i #1 pkt. 2. om at gemme i en database. Hvis jeg gemmer teksterne i en database får jeg så den største søgehastighed?
Avatar billede arne_v Ekspert
19. marts 2025 - 03:51 #16
Parse er udtræk af tekst med søgeord fra PDF.

Ja. En database hvor teksten med søgeord gemmes som fulltext index er en måde at gøre tekstsøgning hurtig på.

Hvis din foobar.pdf indeholder teksten "Dette er en test" og du har 10000 PDF filer, så tager det meget lang tid at søge 10000 PDF igennem for ordet "test".

Hvis derimod du gemmer "foobar.pdf" og "Dette er en test" i en database tabel med fulltext index på det andet felt, så vil databasen internt gemme:

Dette -> foobar.pdf
er -> foobar.pdf
en -> foobar.pdf
test -> foobar.pdf

og et opslag på "test" vil returnere foobar.pdf lynhurtigt.
Avatar billede KurtG Forsker
19. marts 2025 - 19:55 #17
Det lyder som løsningen med database og Index.
I mysql på 'min' server (one.com) er der ikke noget, der hedder 'fulltext' som datatype, så det er vel typen 'text', jeg skal bruge!

Parsningen har jeg vel allerede gjort ved at udtrække teksten fra PDF-fierne?
Og det vil vel øge hastigheden hvis jeg for hver side fjerner dubletter?
Avatar billede a3-seo.dk Ekspert
20. marts 2025 - 06:22 #18
Hej Kurt, har kigget/set dine filer.
Først bør du forstå at .pdf filer ikke laves korrekt med et værktøj som ImageMagick.
Hvilket du har brugt, i vedsendte eksempler.
Skal der laves OSR/søgbare filer er Adobe acrobat Pro et must. Man springer ikke bare over og forsøger med kopiformater.
Når du tager vejen med Adobe acrobat Pro og efterfølgende gemmer siderne som TIFF med CCITT Group 4-komprimering. vil du finde din løsning ;-)
Jeg giver gerne en hånd med, mod betaling, og har PRO udgaverne af Adobe serierne :-D
Avatar billede a3-seo.dk Ekspert
20. marts 2025 - 06:25 #19
Og ja - til #13 som svar på #11 - dine filer er simpelthen for store, så gør det rigtigt, hvis du vil gøre det ....
Avatar billede KurtG Forsker
20. marts 2025 - 12:34 #20
#18
Jeg ved ikke af, at jeg har brugt ImageMagick. Jeg har FineReader 14, men den bruger måske det program internt.
Atdet absolut skal være Adope, der skal bruges, forstår jeg ikke. Jeg ved fra en medarbejder ved DKB, der laver MedieStream, at de anvender Finereader 14.

I Finereader har jeg prøvet at sætte indstillingen for PDF-format til Kompakt i stedet for Bedste kvalitet. Det reducerer filens størrelse til ca. det halve uden at det går nævneværdigt ud over billedet.

Med hensyn til Acrobat Pro: Det er et hobbyprojekt, så jeg har ikke lyst til at sætte flere penge end nødvendigt i det.
Avatar billede a3-seo.dk Ekspert
20. marts 2025 - 13:43 #21
Kan du sende mig et af dine originale billeder af en side, FØR du benytter andre værktøjer ...
Avatar billede arne_v Ekspert
20. marts 2025 - 14:42 #22
FULLTEXT er en indeks type ikke en kolonne type.

Kolonne typen kan være VARCHAR,TEXT, LONGTEXT etc..

Det er indeks som skal være FULLTEXT.

Eksempel:


CREATE TABLE chessopening (id INTEGER NOT NULL,
                          names VARCHAR(255),
                          moves TEXT, PRIMARY KEY(id),
                          FULLTEXT INDEX(names,moves),
                          FULLTEXT INDEX(names),
                          FULLTEXT INDEX(moves))



INSERT INTO chessopening VALUES(1, 'Spanish defense, Ruy Lopez', '1. e4, e5, 2. Nf3, Nc6, 3. Bb5,')
INSERT INTO chessopening VALUES(2, 'French defense', '1. e4, e6, 2. d4, d5,')
INSERT INTO chessopening VALUES(3, 'Sicilian defense', '1. e4, c5,')
INSERT INTO chessopening VALUES(4, 'Queens gambit', '1. d4, d5, 2. c4,')
INSERT INTO chessopening VALUES(5, 'Dutch defense', '1. d4, f5,')
INSERT INTO chessopening VALUES(6, 'Reti opening', '1. Nf3, d5, 2. c4,')



SELECT names, moves FROM chessopening WHERE MATCH(names) AGAINST (?)
SELECT names, moves FROM chessopening WHERE MATCH(moves) AGAINST (?)
SELECT names, moves FROM chessopening WHERE MATCH(names,moves) AGAINST (?)
SELECT names, moves FROM chessopening WHERE MATCH(names,moves) AGAINST (? IN BOOLEAN MODE)
Avatar billede arne_v Ekspert
20. marts 2025 - 14:43 #23
Avatar billede arne_v Ekspert
20. marts 2025 - 14:48 #24
Så hvis du har styr på at få tekst ud af PDF så noget a la:


CREATE TABLE arch (
    id INTEGER NOT NULL PRIMARY KEY,
    pathpdf VARCHAR(255),
    words TEXT,
    FULLTEXT INDEX(words)
);


og for at søge:


SELECT pathpdf FROM arch WHERE MATCH(words) AGAINST ('etellerandet')


vil finde alle stier til PDF som indeholder 'etellerandet' på en effektiv måde.
Avatar billede arne_v Ekspert
20. marts 2025 - 14:54 #25
Mere konkret så er den rå søgning i PDF O(N) - ovenikøbet med en masse open/close overhead - mens en søgning via fulltrext index er O(logN).

O(N) betyder at det tager 10000 gange så lang tid at søge i 1 million ord som at søge i 100 ord.

O(logN) betyder at det tager 3 gange så lang tid at søge i 1 million ord som at søge i 100 ord.
Avatar billede KurtG Forsker
20. marts 2025 - 19:58 #26
Det ser interessant ud, men jeg skal have lidt tid til at kikke det igennem og fatte det (blev olding sidste år) :-)
Pt har jeg problem med overhovedet at få noget ud af en database!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester