[Linux] pdftk - wildcard in folder

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
In een poging mijn Virtuele Machine met Windows steeds minder te gebruiken ben ik voor mijn facturen voor mijn bedrijfje ook overgegaan op LibreOffice. Nu heb ik een opgemaakte achtergrond PDF die ik voorheen met Bullzip PDF aan mijn pdf toevoegde. Na speuren op internet kwam ik erachter dat ik met pdftk hetzelfde kon doen.

Ik heb me verdiept in de documentatie van pdtfk en weet met succes de pdf met mijn factuurachtergrond aan te maken. Ik heb een shell script gemaakt en met de Menu Editor (alacarte) in Unity (Ubuntu) mooi een launcher aan de dock toegevoegd. Zo ver dus alles prima.

Maar... Ik loop alleen tegen het probleem aan waar ik ondanks zoeken op internet niet uit kom.

Mijn code voor mij shell script is als volgt:

code:
1
pdftk "/home/{username}/Downloads/PDFTK/test.pdf" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/test_gelukt.pdf"


Probleem
Bovenstaand script werkt, maar ik zou graag van wildcards gebruik willen maken zodat alle pdfs in de PDFTK folder worden omgezet als ik het script draai. Ik heb de volgend code geprobeert:

code:
1
pdftk "/home/{username}/Downloads/PDFTK/*.pdf" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/*_A1b.pdf"


Dit blijkt alleen niet te werken, pdfk geeft dan een input error. Ik heb vanalles al geprobeerd door ' i.p.v. " te gebruiken, variaties als "/home/{username}/Downloads/PDFTK/"*.pdf maar ook dit biedt geen soelaas.

Kan iemand van jullie mij vertellen wat ik fout doe? Ik kan op internet niks hierover vinden en loop daarom vast.

[ Voor 3% gewijzigd door Rebunted op 06-06-2014 15:07 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Ik gok dat pdftk niet meerdere input-files ondersteunt. Je zult daarom een klein loopje moeten maken, bijvoorbeeld in bash wordt dat zoiets:

Bash:
1
2
3
4
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/$f_A1b.pdf"
done
Als alternatief voor een loop zou je naar find kunnen kijken, deze ondersteunt meer zoekopties en hiermee zul je bijvoorbeeld ook recursief kunnen zoeken.

edit:
beat you to it :P

[ Voor 6% gewijzigd door RobIII op 06-06-2014 15:39 . Reden: Op verzoek namen gewijzigd ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

www.pdflabs.com/docs/pdftk-man-page geeft wat voorbeelden.

Probeer het niet op 1 regel te doen: lees alle pdf bestanden uit en ga in een for loopje per stuk steeds pdftk aanroepen.

Edit: hoi Sjon :+

[ Voor 5% gewijzigd door F_J_K op 10-05-2012 21:13 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
Ik zal me even verdiepen in de loop-functie. Het is de eerste keer dat ik een shell script maak dus ik moet het allemaal nog even leren.

Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
Spider.007 schreef op donderdag 10 mei 2012 @ 21:12:
Ik gok dat pdftk niet meerdere input-files ondersteunt. Je zult daarom een klein loopje moeten maken, bijvoorbeeld in bash wordt dat zoiets:

Bash:
1
2
3
4
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/$f_A1b.pdf"
done
Als alternatief voor een loop zou je naar find kunnen kijken, deze ondersteunt meer zoekopties en hiermee zul je bijvoorbeeld ook recursief kunnen zoeken.

edit:
beat you to it :P
Bedankt! Ik heb jouw code in een nieuwe shell script gezet:

code:
1
2
3
4
5
#!/bin/bash
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/$f_A1b.pdf"
done


Als ik dan in de terminal de volgende opdracht geef:

code:
1
bash nieuwscript.sh


Dan krijg ik in de terminal netjes een nieuwe regel (dus hij is uitgevoerd), maar in de PDFTK folder zie ik geen nieuwe files staan. Wat gaat er dan mis? En hoe kan ik dat zien?

[ Voor 4% gewijzigd door Rebunted op 06-06-2014 15:08 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Er zijn verschillende manieren om dat te debuggen. Begin eens met dit; plaats 'echo ' voor de pdftk aanroep. Je ziet dan precies hoe vaak en met welke parameters pdftk wordt uitgevoerd.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
Spider.007 schreef op donderdag 10 mei 2012 @ 21:42:
Er zijn verschillende manieren om dat te debuggen. Begin eens met dit; plaats 'echo ' voor de pdftk aanroep. Je ziet dan precies hoe vaak en met welke parameters pdftk wordt uitgevoerd.
Bedankt, nu kon ik inderdaad zien wat er fout gaat.

Hij geeft als output:
code:
1
2
3
{username}@desktop:~/Desktop$ bash script2.sh
pdftk /home/{username}/Downloads/PDFTK/test2.pdf background /home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf output /home/{username}/Downloads/PDFTK/.pdf
pdftk /home/{username}/Downloads/PDFTK/test.pdf background /home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf output /home/{username}/Downloads/PDFTK/.pdf


De $f blijkt dus niet te werken.

Ik had hier al meer info gevonden over de loop functie, maar ik kom er niet echt uit hoe ik deze fout nu kan herstellen.

Hier vond ik dat ik de $f tussen quotes moest zetten. Dus mijn volgende script was:
code:
1
2
3
4
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  echo pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/"$f"_A1b.pdf"
done


Dit geeft als output:
code:
1
pdftk /home/{username}/Downloads/PDFTK/test.pdf background /home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf output /home/{username}/Downloads/PDFTK/[b]/home/{username}/Downloads/PDFTK/test.pdf[/b]_A1b.pdf


Het script gebruikt dus bij "$f" de complete (lange) bestandslocatie van de input file (inclusief extentie). Ik zoek dus naar de code waarmee ik alleen de filename (zonder extentie) van de input in mijn output kan gebruiken. Mijn doel is dus om de uitkomst van de files "<input>_A1b.pdf" te krijgen. Ik kom helaas online nu niet verder en ik zit weer vast.

Kunnen jullie me weer een stapje verder helpen?

[ Voor 48% gewijzigd door Rebunted op 06-06-2014 15:09 ]


Acties:
  • 0 Henk 'm!

  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03 11:17
Je zit bijna goed,

je kunt het op deze manier oplossen:
code:
1
2
3
4
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  echo pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output "/home/{username}/Downloads/PDFTK/"${f%.*}"_A1b.pdf"
done


Volgens mij moet dit werken

[ Voor 7% gewijzigd door RobIII op 06-06-2014 15:39 . Reden: Op verzoek namen gewijzigd ]


Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
Top, dit was mijn oplossing. De filename kwam op dit moment er nog wel dubbel in dus ik heb het script aangepast naar:

code:
1
2
3
4
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  echo pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output ""${f%.*}"_A1b.pdf"
done


De output is dan:
code:
1
2
pdftk /home/{username}/Downloads/PDFTK/test2.pdf background /home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf output /home/{username}/Downloads/PDFTK/test2_A1b.pdf
pdftk /home/{username}/Downloads/PDFTK/test.pdf background /home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf output /home/{username}/Downloads/PDFTK/test_A1b.pdf


Perfect zou je zeggen, precies zoals ik wil. Alleen er komt geen enkele file bij in de PDFTK folder. Hebben jullie enig idee hoe dat kan?

[ Voor 8% gewijzigd door Rebunted op 06-06-2014 15:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De echo weghalen :p

Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
:$ Zo kun je zien dat dit de eerste keer is dat ik dit doe. Ik dacht dat echo enkel was voor het 'vertellen' wat hij deed, maar is dus meer een soort test-modus.

Ik heb via dialog nog een mooi venstertje voor en na de opdracht geplaatst waardoor het net een programmatje lijkt. Ik ben helemaal tevreden :)

Bedankt allemaal voor de hulp!

Acties:
  • 0 Henk 'm!

  • Rebunted
  • Registratie: September 2006
  • Niet online
Mmm, er doet zich toch nog een probleempje voor. Als de filename van de input een spatie bevat doet het script het niet meer. Het geeft dan de foutmelding "Unexpected data in output section:"

Ik heb geprobeerd om /home/{username}/Downloads/PDFTK/*.pdf tussen quotes "" te zetten maar dan werkt ook niet.

Nu had ik hier al gevonden hoe ik dat kan oplossen. Het kan met de volgende code:

code:
1
2
3
4
5
6
7
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
  echo "$f"
done
IFS=$SAVEIFS


Ik krijg deze code alleen niet geïmplementeerd in mijn eigen code. Als ik bovenstaande code voor mijn eigen code plaats pakt hij op 1 of andere manier de files in de folder waar de scriptfile staat.

Edit//

Ik heb het. Onderstaande code werkt:

code:
1
2
3
4
5
IFS=$(echo -en "\n\b")
for f in /home/{username}/Downloads/PDFTK/*.pdf
do
  pdftk "$f" background "/home/{username}/Documents/Zakelijk/{bedrijfsnaam}/Diensten - Grafisch/{bedrijfsnaam}/Huisstijl 2010/Factuur/Factuur_achtergrond_2010.pdf" output ""${f%.*}"_A1b.pdf"
done


Wat is dat toch leuk werk om zoiets uit te vogelen (als het lukt iig) :)

Nogmaals dank iedereen!

[ Voor 64% gewijzigd door Rebunted op 06-06-2014 15:10 ]

Pagina: 1