Voor een vereniging ben ik opzoek naar een methode om de oude clubbladen digitaal doorzoekbaar te maken.

Er zijn ± 1500 "boekjes" waarvan het merendeel als OCR PDF bestanden zijn.

Is er een PHP/MySQL script/methode/techniek die het mogelijk maakt om de bezoeker naar woorden in de PDF files te zoeken en dan de PDF bestand met het betreffende zoekwoord te presenteren?
Zeg maar een eigen Google search ;-|

kan iemand mij in de goede richten sturen.
Michael - op 11/05/2026 11:25:06

[quote="Mar kla op 11/05/2026 11:04:29"]
Het projectje ligt even stil door onderlinge meningsverschillen in het bestuur. De bladen (de eerste ± 75 jaar iig) staan nu als PDF online op een fansite. En Google search is die aan het indexeren en ik heb al zoek resultaten op terug gevonden.


Die meningsverschillen is jammer, maar fijn dat je al wel een stap verder bent gekomen.
Mocht je nog wat hulp nodig hebben met je project dan horen we het graag.
[/quote]
top!

Misschien is paperless ngx een optie? Hoef je het wiel niet opnieuw uit te vinden.
Gekeken of dit te doen is.

Download de Smalot PdfParser en de NL stopwoorden
https://github.com/smalot/pdfparser/archive/refs/heads/master.zip
https://github.com/stopwords-iso/stopwords-nl/archive/refs/heads/master.zip

+ Smalot [map]
+ + PdfParser [map]
+ + + [alle mappen/bestanden van PdfParser]
+ index.php [dit bestand]
+ stopwords-nl.txt [NL stopwoorden]

De 3 database functies heb ik niet uitgewerkt.
Een efficiente opslag zou er zo uit kunnen zien
Tabel "bestanden" met velden id_b en bestand (lijst met unieke pad/naar/bestand.pdf)
Tabel "woorden" met velden id_w en woord (lijst met unieke woorden)
Tabel "zoeken" met velden id_b, id_w en pagina

[CODE]
<?php

// maak recursief een array met alle pad/naar/bestand.pdf
function getPdfFilenames ($path) {
$rIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)
);
$pdfs = [];
foreach ($rIterator as $file) {
if ($file->isFile() && strtolower($file->getExtension()) == 'pdf') {
$pdfs[] = $file->getPathname();
}
}
return $pdfs;
}

// maak een array met alle woorden
function createWordArray ($text, $stopwords) {
// naar lowercase en vervang accenten
$text = mb_strtolower($text);
$accents = [
'a' => 'àáâãäå', 'c' => 'ç', 'e' => 'èéêë', 'i' => 'ìíîï',
'n' => 'ñ', 'o' => 'òóôõö', 'u' => 'ùúûü', 'y' => 'ýÿ'
];
foreach ($accents as $key => $value) {
preg_replace('/['.$value.']/u', $key, $text);
}
// verwijder alles behalve letters/cijfers/spaties
$text = preg_replace('/[^a-z0-9\s]/u', ' ', $text);
// meerdere spaties vervangen door enkele spatie
$text = preg_replace('/\s+/', ' ', $text);
// split in array van woorden
$words = explode(' ', trim($text));
// verwijder stopwoorden
$words = array_filter($words, function($word) use ($stopwords) {
return !in_array($word, $stopwords);
});
// verwijder lege strings en korte woorden
$words = array_filter($words, function($word) {
return strlen($word) >= 3;
});
// sorteer woorden en verwijder duplicaten
sort($words);
return array_unique($words);
}

// PdfParser
$dir = str_replace('\\', '/', __DIR__);
require_once $dir.'/alt_autoload.php';
use Smalot\PdfParser\Parser;
$parser = new \Smalot\PdfParser\Parser();

// array met alle pdf's (pad/naar/bestand.pdf)
$pdfFolder = 'files/clubbladen/';
$pdfFiles = getPdfFilenames ($pdfFolder);

// stopwords file https://github.com/stopwords-iso/stopwords-nl/
$stopwords = file('stopwords-nl.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$stopwords = array_map('trim', $stopwords);

// maak db connectie
//$conn = dbConnect($conf);

// doorloop alle pdf's
foreach ($pdfFiles as $pdfFile) {
$pdf = $parser->parseFile($pdfFile);
$text = '';
$metaData = $pdf->getDetails();
if (isset($metaData['Pages'])) {
for ($page = 0; $page < $metaData['Pages']; $page++) {
$text = $pdf->getPages()[$page]->getText();
$words = createWordArray($text, $stopwords);
$realPage = $page + 1;
echo '<pre>';
print_r (['Bestand' => $pdfFile, 'Pagina' => $realPage]);
print_r ($words);
echo '</pre>';
//dbUpdateWords ($conn, $pdfFile, $realPage, $words);
}
}
}

// verbreek db connectie
// dbDisconnect($conn)

Reageren