Verktyg för att manipulera pdf-filer i linux

Det finns ett antal olika verktyg för att manipulera pdf-filer i linux, både grafiska och sådana som används via terminalen. Jag kommer här att presentera några användbara terminalkommandon. För den som är intresserad av att manipulera pdf-filer via ett grafiskt gränssnitt så finns det en bra presentation av PDFModPåvels blogg.

Ghostscript

Ghostscript är ett mycket användbart program som kan användas för att dela eller slå ihop pdf-filer, klippa ut vissa sidor, rotera och skala om sidor med mera. En nackdel är att man måste ange många kommandoradsflaggsflaggor. Detta kan göra det svårt att komma ihåg från fall till fall. Man måste också tänka på att flaggorna är skiftlägeskänsliga.

För att spara en sidorna 18-22 i filen input.pdf till filen output.pdf anges följande kommando:
gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dFirstPage=18 -dLastPage=22 -sOutputFile=output.pdf input.pdf

Flaggan -sDEVICE=pdfwrite anger att man vill generera en pdf-fil. Flaggorna -dBATCH -dNOPAUSE gör att ghostscript kör det angivna kommandot utan avbrott för att sedan avsluta. -dFirstPage=18 -dLastPage=22 berättar för ghostscript att man vill att den skall behandla sidorna 18-22 i den fil man skickar till programmet. Slutligen så anger flaggan -sOutputFile=output.pdf namnet på den fil där resultatet skall sparas.

För att slå ihop två filerna input1.pdf och input2.pdf:
gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -sOutputFile=output.pdf input1.pdf input2.pdf

Man kan också kombinera ovanstående exempel. Följande kommando sparar sidorna 1-2 i input1.pdf och sidorna 3 och framåt i input2.pdf till filen output.pdf:
gs -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -sOutputFile=output.pdf -dFirstPage=2 -dLastPage=3 MM4001-2.pdf -dFirstPage=3 input2.pdf

Notera här att flaggorna -dFirstPage och -dLastPage verkar på den fil som anges närmast efter dessa flaggor.

Konvertera en pdf-fil till bilder

Konvertering av en pdf-fil till bilder kan göras på lite olika sätt beroende på vad man vill uppnå.

Convert

Convert är ett program som ingår i programsviten ImageMagick som ingår som standard i de flesta linuxdistributioner. Det används för att konvertera allt innehåll på sidorna i en pdf-fil till bilder. I sin enklaste form anger man kommandot
convert infil.pdf utfil.jpg
Ovanstående kommando genererar en jpg-fil per sida med filnamnen utfil-1.jpg, utfil-2.jpg etc.

En nackdel med ovanstående kommando är att kvaliteten på främst text, och vektorgrafik kan bli lidande. Detta beror på att convert använder en upplösning på 72dpi som standard. Detta kan åtgärdas genom att att ange flaggan -density till convert. Om man ändrar ovanstående kommando till
convert -density 300 infil.pdf utfil.jpg
så får man bilder med högre upplösning.

Pdfimages

Om man istället för att konvertera hela pdf-filen till bilder är ute efter att extrahera bitmapsbilder från pdf-filen så kan man använda programmet pdfimages. I Ubuntu ingår det i paketet poppler-utils. Programmet letar igenom pdf-filen efter bitmapsbilder och extraherar dessa i originalstorlek.
pdfimages -j foo.pdf bar
ger bilderna bar-000.jpg bar-001.jpg etc. (Flaggan -j anger att bilderna skall sparas som jpeg.)

Vektorgrafik

Om man behöver extrahera vektorgrafik ur ett pdf-dokument är det lättaste alternativet att använda programmet Inkscape. Det finns verktyg som kan konvertera pdf-filen till andra vektorformat men för att extrahera önskad grafik så brukar man behöva Inkscape i slutändan ändå. En guide till hur man använder Inscape för detta ändamål finns på Imperfect notes.

Annonser

Starta screen automatiskt vid inloggning över ssh

Screen är ett program som snabbt blir oumbärligt när man väl börjat använda det. Det är extra användbart när man arbetar över en ssh-anslutning. Ett sätt att automatiskt starta screen och ansluta till senaste frånskilda screen-session när man loggar in via ssh är att lägga till följande kod i din ~/.bash_profile.

if [ $SSH_TTY ] && [ ! $WINDOW ]; then
  SCREENLIST=`screen -ls | grep 'Attached'`
  if [ $? -eq "0" ]; then
    echo -e "Screen is already running and attached:\n ${SCREENLIST}"
  else
    screen -U -R
  fi
fi

Koden är hämtad från http://tlug.dnho.net/node/239.

Denna kodsnutt letar efter frånskilda screen-sessioner och ansluter automatiskt till den första den hittar. Om det bara finns anslutna sessioner så startas ingen ny session. Istället visas de sessioner som finns i en lista. Om det inte finns någon session alls så startas en ny.

Ta bort inledande katalog när man packar upp ett tar-arkiv

Ibland innehåller ett tar-arkiv mer kataloginformation än man skulle vilja. Ett exempel är om man vill lägga flera wordpressinstallationer i olika underkataloger i en baskatalog. En titt i tar-arkivet ger följande:

$ tar ztvf latest.tar.gz

drwxr-xr-x www-data/www-data 0 2012-09-06 21:43 wordpress/
-rw-r--r-- www-data/www-data 19929 2012-05-06 09:28 wordpress/license.txt
-rw-r--r-- www-data/www-data  4264 2011-12-14 00:45 wordpress/wp-activate.php
-rw-r--r-- www-data/www-data 29084 2012-06-26 20:53 wordpress/wp-login.php
-rw-r--r-- www-data/www-data  9177 2012-09-04 01:23 wordpress/readme.html
[...]

Av detta ser man att alla filer kommer att packas upp i underkatalogen wordpress.

Detta blir ett problem om man redan har en sådan katalog och man inte vill skriva över denna. Ett alternativ är att skapa den underkatalog man vill ha, packa upp tar-filen i denna och sedan flytta filerna manuellt frå underkatalog/wordpress till underkatalog. Ett bättre sätt är dock att använda flaggan --strip-components=N. Denna tar bort de N inledande katalogerna vid uppackning.

Lösningen blir därför att skapa önskad underkatalog, gå in i denna och sedan packa upp tar-arkivet med flaggan --strip-components=1 efter filnamnet enligt följande exempel:

$ cd underkatalog
underkatalog$ tar ztvf latest.tar.gz --strip-components=1