PDF fájlok szétválogatása a bennük található tartalom alapján

 ( Adamyno | 2019. január 25., péntek - 9:20 )

Sziasztok!

Adott egy feladat. Van vagy 3000 db pdf fájl egy mappában. Szét kellene válogatni őket különböző mappákba a fájlokban található azonosító szám alapján. A pdf második sorában van egy szám, az egyezőket kellene egy mappába tenni.

Már ott elakadt a történet, hogy a fájlokból mivel lehet kiolvasni szöveges adatot. Szerencsére nem szkennelt dokumentum.

Valakinek van erre ötlete?
Windowst használunk, de jöhet linuxos javaslat is.

Gondoltam rá, hogy AutiIt-el kijelölöm, kimásolom és beillesztem egy txt-be a számokat, mellé vesszővel elválasztva a fájl nevét, be importálom excelbe és rendezem. Utána meglesz, hogy ki melyik mappába kerül (bár a mappákba dobálást még kézzel kell megcsinálni).

Köszi

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Valami webes alkalmazást egyszer láttam valahol ami a pdf-ekben található adatok alapján szétválogatta őket. De már nemtudom hol és mi volt az :|

---
- Indítsd újra a gépet! - Az egészet? - Nem, a felét...

Ha gépidő nem számít, akkor a pdftotext.

Gépidő nem számít, de az nem az egész pdf-et alakítja át? Erre ránézek.
---
- Indítsd újra a gépet! - Az egészet? - Nem, a felét...

-pdftotext --help
pdftotext version 0.62.0
Copyright 2005-2017 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftotext [options] []
-f : first page to convert
-l : last page to convert

+1

Mondjuk én úgy csinálnám scriptből végigszaladva a fájlokon, hogy:
1) pdftotexttel kinyomnám az első oldalt txt-be
2) a txt-ben megkeresném (regexp) az azonosítót
3/a) átnevezném az adott pdf-et úgy, hogy azonosító + "-jelenlegi fájlnév" (Így utána lenne egy rakás pdf-em, aminek a nevének az első része maga a kérdéses azonosító. Innentől már a mappába rendezés akár kézzel is megy pár perc alatt.)

3/b) vagy -még mindig a scriptből- a kapott azonosítóval létrehoznék egy mappát -ha még nem létezik- és abba bemásolnám az adott pdf-et

Ennek feltétele persze, hogy az azonsítót regexp-el meg lehessen fogni.

létrehoznék egy mappát -ha még nem létezik-

mkdir -p


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nézz bele notepad-del, biztos felismerhető a szám helye és előtte utána valami, ami regexp-pel (sed?) kinyerhető.

Az ötlet jó, viszont mivel ez formázott szöveg, így csak krix-krax lesz belőle ha direktbe megnyitom egyszerű szövegszerkesztővel.

---
- Indítsd újra a gépet! - Az egészet? - Nem, a felét...

Nem feltétlenül. Sokszor a szöveges tartalom zavartalanul látszik, csak a formázás lesz krix-krax, de ez nem baj, mert neked a tartalom kell.


No keyboard detected... Press F1 to run the SETUP

Negatív. Tömörített formában tárolódik a szöveges tartalom.

Opcionálisan tömörített formában tárolódik a szöveges tartalom.

Lásd az Adobe PDF Reference-ben a következő fejezeteket:

5. Text
2.2.2 Compression

Az "opcionális" az nagyon sok pdf-gyártó program esetében default.

pdftk-val ki lehet csomagolni.

Persze, de a sima grep meg a "belenéz notepad-dal" nem járhat út.

De, simán járható. Írsz egy scriptet, ami végigmegy a mappában lévő összes pdf fájlon, ifilterrel vagy hasonlóval kicsomagolja stdout-ra, amit átpipe-olsz grepbe, az ha ki tud belőle szedni értelmes adatot, annak alapján átmozgatod a scriptben az adott fájlt valami dedikált mappába. Így tökéletesen megoldható, amit a topikindító akar.


No keyboard detected... Press F1 to run the SETUP

grep foo bar.pdf - nem megy, mert bináris trutyi. notepad.exe bar.pdf dettó, mert bináris trutyi. Az, hogy fog egy eszközt, és kicsomagolja/szétkapja a pdf-et, és az így kinyert szöveget maszírozza, az nem sima grep/notepad.exe - szerintem.

for file in *.pdf; do pdftk uncompress (valami ilyesmi) $file; done
Ennyin nem fog múlni...

Én kiszedném az első oldalt, és utána csak azt maszíroznám - az erőforrásigénye mindenképp kisebb, mintha a több odalas pdf-eket uncompress meg grep - ráadásul így lehet egyszerűen az első oldal tartalmára szűkíteni a keresést.

A notepad-ot remélem viccnek írtad. Persze, hogy bináris trugyi, mert be van csomagolva, meg a formázás amúgy is bináris. De ha ki van csomagolva, a bináris formázás nem zavarja meg a grep-et, hogy szöveges infót nyerjen ki belőle. Küldj egy ilyen pdf fájlt, írok rá scriptet, ami szépen végigmegy fájlonként kibontja stdout-ra, onnan grep kiszedi, ami kell, aztán a kinyert tartalom függvényében végre lesz hajtva rajta valami művelet.

Valami ilyesmit, amit itt írtak:
for file in *.pdf; do pdftk uncompress $file | grep minta; done


No keyboard detected... Press F1 to run the SETUP

"( dotnetlinux | 2019. január 25., péntek - 8:31 )

Nézz bele notepad-del, biztos felismerhető a szám helye és előtte utána valami, ami regexp-pel (sed?) kinyerhető."

Ja, így már értem. Mindenesetre a notepad-et semmiképp nem ajánlom. Helyette akkor már Notepad++-szal vagy valami normálisabb szövegszerkesztővel legyen belenézve. Vagy Total Commander File Viewerével. A sima Notepad egy kalap fekáliát nem ér, főleg ha nem a legújabb Win10-es verzió, azzal esetleg meg lehet próbálkozni.

De a kérdező problémájára félautomata megoldások is vannak. Megnyitja egyesével a pdf fájlokat valami Commanderből. Ha beletartozik abba a csoportba, ami releváns, akkor bezárja és a másik panelen kijelöli, lehet 2-nél több panelt is nyitni. Aztán mikor végigért minden fájlon, akkor a különböző panelekről a kijelölt fájlokat a kívánt célmappába átmásolni.

Persze én inkább maradnék a Linuxnál meg a grep-es automata scriptnél.


No keyboard detected... Press F1 to run the SETUP

Ha van kedved egy kicsit kódolni akkor:

PDF-hez létezik IFilter. https://en.wikipedia.org/wiki/IFilter

Ezzel ki lehet szedni a szöveges tartalmat a PDF-ből:
https://supportdownloads.adobe.com/detail.jsp?ftpID=5542

Utána regexp-pel már rátalálhatsz a szükséges azonosítóra.

Illetve még ez is érdekes lehet:
https://www.npmjs.com/package/pdf-to-text

Linuxos javaslatként a less és a grep használata nem lehet megoldás?
Ha nem szkenneltek a pdf-ek, akkor a less meg tudja nyitni őket, így egy less pdf_file | grep -o azonosito_regexp használatával ki tudod szedni az azonosítószámokat.

A pdfgrep is segíthet a válogatásban.

jujj de szép +1

pythonban írtak egy pdfmacskát (pdfcat)

https://pythonhosted.org/PyPDF2/Easy%20Concatenation%20Script.html

talán ez.
https://github.com/mstamy2/PyPDF2/blob/master/Scripts/pdfcat

usage: pdfcat [-h] [-o output_file] [-v] filename [page range...] ...

Concatenate pages from pdf files into a single pdf file.

Page ranges refer to the previously-named file.
A file not followed by a page range means all the pages of the file.

PAGE RANGES are like Python slices.
        Remember, page indices start with zero.
        Page range expression examples:
            :     all pages.                   -1    last page.
            22    just the 23rd page.          :-1   all but the last page.
            0:3   the first three pages.       -2    second-to-last page.
            :3    the first three pages.       -2:   last two pages.
            5:    from the sixth page onward.  -3:-1 third & second to last.
        The third, "stride" or "step" number is also recognized.
            ::2       0 2 4 ... to the end.    3:0:-1    3 2 1 but not 0.
            1:10:2    1 3 5 7 9                2::-1     2 1 0.
            ::-1      all pages in reverse order.

EXAMPLES
    pdfcat -o output.pdf head.pdf content.pdf :6 7: tail.pdf -1
        Concatenate all of head.pdf, all but page seven of content.pdf,
        and the last page of tail.pdf, producing output.pdf.

    pdfcat chapter*.pdf >book.pdf
        You can specify the output file by redirection.

    pdfcat chapter?.pdf chapter10.pdf >book.pdf
        In case you don't want chapter 10 before chapter 2.

positional arguments:
  filename [page range...]
  filenames and/or page ranges

optional arguments:
  -h, --help            show this help message and exit
  -o output_file, --output output_file
  -v, --verbose         show page ranges as they are being read

-----------------
10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Nekem a pdftk jött be hasonló céllal: egy bizonyos mintát akartam eltüntetni rengeteg pdf-ből.
Az első lépés a
pdftk output uncompress
volt.

Innentől a fájl már könnyen kereshető plain text lesz, amiben tetszőlegesen lehet keresni.

pdftk-t mar nem is karbantartjak, ubuntu 18.04-ben benne sincs.

qpdf javasolhato helyette.

qpdf --stream-data=uncompress input.pdf output.pdf

Egyebkent nem lesz a szoveg konnyen olvashato/keresheto, ha egy kicsit tipografiailag tuningolt. Van ugy hogy betunkent van a pdfben a merete allitva...

Pl:
"European Comission" igy nez ki a fajlban:
[(E)18 (ur)8.5 (opean C)10.1 (ommission)]TJ

---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

Ötlet: nyiss egy topikot a HUP-on, ahol megkérdezed, van-e ötlete valakinek arra, hogyan kell az internetes keresőket alapszinten használni.

Szívesen

:)

belegondolva mélyebben, ez egyáltalán nem triviális kérdés, mármint a keresőket illetően.

Leginkább akkor van baj, ha nem jut eszedbe, melyek azok a kulcsszavak, amellyel keresni lehetne. Jártam már úgy, hogy épp az érdekelt volna, hogyan hívja a szakzsargon illetve a köznyelv azt a kis bigyót, amire szükségem van, viszont éppen ezért az internettől sem tudom egyszerűen megkérdezni. Kerülőúton persze némi idő ráfordításával sikerül a legtöbb esetben.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A keresés egy külön tudomány, könyvtárosok évekig tanulják. Szerintük annyira összetett a dolog, hogy KUTATNI ők tudnak igazán, nem a prof, akinek a talált anyag kell. Kissé leegyszerüsítve ez egy böngészőben használt "extended" keresési menetre is igaz.
Szóval még a keresésnek is vannak fázisai, pl. amikor a zember vakon keres. Kérdezz meg egy könyvtárost, miről beszélek, garantálom, hogy befonod a hajad. (Írom mindezt úgy, hogy polcomon az öt cm vastag tankönyvük egyik kötete, ami csak erről szól)

-----------------
10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Felizgattál! :-)

Megtudhatnám annak az 5 centis könyvnek a címét?
---
Science for fun...

google://"extract text from pdf" :-D

Az aktuális feladat esetében annak tűnik. Jó pont, hogy a kérdező felismerte: számára ismeretlen eszközre van szükség a PDF-ből való olvasásra. Ha először erre keres rá, többféle megoldást talál. A találatok között vannak GUI-s alkalmazások, amikkel egyenként vagy kötegelve nyerhet ki szöveget PDF állományokból, míg csomó másikban parancssor vagy szkriptnyelv segítségével olvassák ki a szöveget. A találatok között sok a példa, illetve egy részük eleve automatizált olvasásról és a kiolvasott szöveg felhasználásáról szól. Tehát ha az első felismert akadály alapján keresést indít, nem csupán az akadály leküzdéséhez szükséges információkhoz jut hozzá, hanem a továbblépéshez is segítséget kap. Olvasgat, és előbb-utóbb rájön, hogy az automatizáláshoz a példákban látott ciklust is fel kell használnia. Kiválasztja a számára szimpatikus példát, így már van egy X nyelven megvalósított PDF-olvasó ciklusa. Mi hiányzik? Fájlműveletek az X nyelvben. Arra is rákeres. Ekkor még keresgél és olvasgat egy kicsit, és összerakja a szkriptet. Nem működik? Semmi baj, feljön a HUP-ra, és megkérdezi, hol a hiba. Régen ez volt a dolgok normális menete.

:)

bezzeg a te idodben...

Ez kicsit programozosabb hozzaallas, de lehet bongeszoben full javascript is:)

A pdf-bol javascripttel ki lehet venni a text-et:
Live demo:
http://git.macropus.org/2011/11/pdftotext/example/

Egy cikk:
https://ourcodeworld.com/articles/read/405/how-to-convert-pdf-to-text-extract-text-from-pdf-with-javascript

(ez masik verziot hasznal, ezt is frissiteni kell).

szoval az elgondolas ugy nezne ki, hogy a user kivalasztja a 3000 filet bongeszobol, majd visszakapja konyvtarszerkezetben .zip fajlban :)

Bonyolult az igaz:) De lehet full kliens oldal is:)

---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

sub