Recent Changes - Search:

Oktatás

* Programozás 2
  + feladatsor
  + C feladatsor
  + Python feladatsor
  + GitHub oldal

* Szkriptnyelvek
  + feladatsor
  + quick link

* Adator. prog.
  + feladatsor
  + quick link

Teaching

• Prog. for Data Sci.
  ▸ exercises
  ▸ quick link

teaching assets


Félévek

* 2026/27/1
* archívum


Linkek

* kalendárium
* tételsorok
* jegyzetek
* szakdolgozat / PhD
* ösztöndíjak
* certificates
* C lang.
* C#
* D lang.
* Java
* Nim
* Nim2
  + exercises
* XC=BASIC
* old
  ✦C++, ✦Clojure, ✦Scala


[ edit | logout ]
[ sandbox | passwd ]

Py3 /

PDF multiplikátor

Olvassátok végig az egész feladatot, mivel a végén lesz egy egyszerűsítés!

Probléma

Ez egy megtörtént eset. Bent a munkahelyemen történt valami a nyomtatóval és furcsán kezdett el viselkedni. Amikor egy dok.-ot 1 példányban nyomtattam ki, semmi gond nem volt. Amikor több példányban akartam nyomtatni, akkor az első példány rendesen ki lett nyomtatva, de a többi példány helyett egy rejtélyes hibaüzenet jelent meg:

ERROR:
typecheck
OFFENDING COMMAND:
put

Workaround megoldás

Amíg a rendszergazdák el nem hárítják a problémát, addig ezt találtam ki: ha egy PDF-et N példányban akarok kinyomtatni, akkor többszörözzük meg a PDF-et (összesen N darabot készítsünk belőle), fűzzük őket össze egyetlen PDF-fé, majd ezt a nagyméretű PDF-et nyomtassuk egyetlen példányban. A módszer működik :)

Feladat

Írjunk egy szkriptet, ami elkészíti az összefűzött, gond nélkül nyomtatható PDF-et. A program valahogy így működjön:

$ ls -al
total 156
drwxr-xr-x  2 jabba jabba     80 szept  8 14.48 .
drwxrwxrwt 31 root  root     780 szept  8 14.49 ..
-rwxr--r--  1 jabba jabba   1320 szept  8 12.13 multiply_pdf.py
-rw-r--r--  1 jabba jabba 154703 szept  7 14.41 zh.pdf

$ ./multiply_pdf.py
Multiply PDF - print a PDF in several copies
Usage: multiply_pdf <file.pdf>

$ ./multiply_pdf.py zh.pdf
Number of copies: 5
# pdftk 'zh.pdf' 'zh_002.pdf' 'zh_003.pdf' 'zh_004.pdf' 'zh_005.pdf' cat output all.pdf

$ ls -al
total 1572
drwxr-xr-x  2 jabba jabba    180 szept  8 14.50 .
drwxrwxrwt 31 root  root     780 szept  8 14.50 ..
-rw-r--r--  1 jabba jabba 825518 szept  8 14.50 all.pdf
-rwxr--r--  1 jabba jabba   1320 szept  8 12.13 multiply_pdf.py
-rw-r--r--  1 jabba jabba 154703 szept  8 14.50 zh_002.pdf
-rw-r--r--  1 jabba jabba 154703 szept  8 14.50 zh_003.pdf
-rw-r--r--  1 jabba jabba 154703 szept  8 14.50 zh_004.pdf
-rw-r--r--  1 jabba jabba 154703 szept  8 14.50 zh_005.pdf
-rw-r--r--  1 jabba jabba 154703 szept  7 14.41 zh.pdf

$ ./multiply_pdf.py zh.pdf
Number of copies: 1

Magyarázat

A program lehet félig parancssoros, félig interaktív. A PDF file nevét (amit többszörözni akarunk) parancssori argumentumként kelljen megadni. Ezután a program váltson át interaktív módba és kérje be, hogy hány példányt szeretnénk. Ezt jelöljük N-nel.

Ha N < 2, akkor kész vagyunk, nincs teendő. N = 1 esetén nem kell többszörözni, N ≤ 0 pedig értelmetlen érték.

Ha N ≥ 2, akkor készítsük el a másolatokat. Pl. N = 5 esetén 4 darab másolatot kell készíteni:

zh.pdf, zh_002.pdf, zh_003.pdf, zh_004.pdf, zh_005.pdf

Ha ezzel megvagyunk, akkor a linuxos pdftk parancs segítségével össze lehet fűzni a PDF-eket egyetlen állománnyá:

$ pdftk A.pdf B.pdf cat output all.pdf

𝥶 Ebben a példában az A.pdf és a B.pdf lesz összefűzve. Az eredmény egy all.pdf nevű file-ban lesz elmentve.

Linux alatt telepítsük a pdftk csomagot (Linux Mint: sudo apt install pdftk-java ; Arch: sudo pacman -S pdftk).

A szkript a végén hívja meg a pdftk parancsot egy külső processzben a megfelelő paraméterekkel.

Finomítás

A programon lehet még finomítani. Ha az eredeti PDF páratlan oldalszámú, akkor a kimenet nem lesz tökéletes, mivel a 2. példány nem külön lapon fog kezdődni az összesített PDF-ben, hanem az első példány utolsó oldalának a túloldalán.

Megoldás: ha az eredeti PDF páratlan oldalszámú, akkor az összefűzéskor a másolatok közé még tegyünk be egy üres oldalt is. Tegyük fel, hogy a zh.pdf 9 oldalas. Ekkor a következőképpen kellene lefutnia a szkriptnek:

$ ./multiply_pdf.py zh.pdf
Number of copies: 3
# pdftk 'zh.pdf' empty.pdf 'zh_002.pdf' empty.pdf 'zh_003.pdf' cat output all.pdf

Egy egyoldalas üres PDF-et (empty.pdf) könnyen előállíthatunk egy szövegszerkesztővel (pl. a LibreOffice Writer segítségével).

Egy PDF oldalszámát így tudjuk lekérdezni:

$ pdftk zh.pdf dump_data | grep NumberOfPages
NumberOfPages: 9

Egyszerűsítés

Utólag jöttem rá, hogy az eredeti PDF-ről felesleges másolatokat készíteni, mivel a pdftk-nak akár ugyanazt a file-t is meg lehet adni többször:

$ pdftk A.pdf A.pdf A.pdf cat output all.pdf

𝥶 Vesszük az A.pdf állományt és háromszor összefűzzük. Az eredmény egy all.pdf nevű file-ban lesz elmentve.

Ezen felismerésünket felhasználva, egyszerűsítsük a megoldásunkat:

$ ./multiply_pdf.py zh.pdf
Number of copies: 3
# pdftk 'zh.pdf' empty.pdf 'zh.pdf' empty.pdf 'zh.pdf' empty.pdf cat output all.pdf
Cloud City

  

Blogjaim, hobbi projektjeim

* The Ubuntu Incident
* Python Adventures
* @GitHub
* heroku
* extra
* haladó Python
* YouTube listák


Debrecen | la France


[ edit ]

Edit - History - Print *** Report - Recent Changes - Search
Page last modified on 2026 September 08, 16:54