<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Modifying_PDFs</id>
	<title>Modifying PDFs - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://entorb.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Modifying_PDFs"/>
	<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Modifying_PDFs&amp;action=history"/>
	<updated>2026-05-06T10:28:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://entorb.net//wiki/index.php?title=Modifying_PDFs&amp;diff=4951&amp;oldid=prev</id>
		<title>Torben at 21:03, 30 October 2024</title>
		<link rel="alternate" type="text/html" href="https://entorb.net//wiki/index.php?title=Modifying_PDFs&amp;diff=4951&amp;oldid=prev"/>
		<updated>2024-10-30T21:03:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Software]]&lt;br /&gt;
===Required Software===&lt;br /&gt;
2019: New powerful tool: [https://community.coherentpdf.com/ Coherent PDF]&lt;br /&gt;
&lt;br /&gt;
====Linux====&lt;br /&gt;
 sudo apt-get install pdftk&lt;br /&gt;
====Windows====&lt;br /&gt;
[http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ PDFtk]&lt;br /&gt;
&lt;br /&gt;
===Join several files===&lt;br /&gt;
 pdftk in1.pdf in2.pdf cat output out.pdf&lt;br /&gt;
 # or using handles&lt;br /&gt;
 pdftk A=in1.pdf B=in2.pdf cat A B output out.pdf&lt;br /&gt;
 # or using wildcards&lt;br /&gt;
 pdftk *.pdf cat output out.pdf&lt;br /&gt;
 # &lt;br /&gt;
 # Remove &amp;#039;page 13&amp;#039; from in1.pdf to create out1.pdf&lt;br /&gt;
 pdftk in1.pdf cat 1-12 14-end output out.pdf&lt;br /&gt;
 # or&lt;br /&gt;
 pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf &lt;br /&gt;
 # &lt;br /&gt;
 # join parts of several files&lt;br /&gt;
 pdftk A=file1.pdf B=file2.pdf C=file3.pdf cat A B2-end C1-23 output out.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===extract and convert page to image===&lt;br /&gt;
 gs -dSAFER -r600 -sDEVICE=pngalpha -dFirstPage=1 -dLastPage=1 -o tmp/title-en.png tmp/hpmor.pdf&lt;br /&gt;
 convert -density 150 tmp/title-en.png -resize 1186x1186\&amp;gt; -quality 75 tmp/title-en.jpg&lt;br /&gt;
 # Here ghostscript instead of imagemagick used, since imagemagick throw this error:&lt;br /&gt;
 # convert -density 150 tmp/hpmor.pdf[0] -quality 75 tmp/title-en.jpg&lt;br /&gt;
 # attempt to perform an operation not allowed by the security policy&lt;br /&gt;
&lt;br /&gt;
===extract page range===&lt;br /&gt;
====via PDFtk(Windows)====&lt;br /&gt;
 @echo off&lt;br /&gt;
 set pdftk=C:\Users\torben\Progs\PortableApps\PDFTKBuilderPortable\App\pdftkbuilder\pdftk.exe&lt;br /&gt;
 set start=12&lt;br /&gt;
 set end=40&lt;br /&gt;
 for %%F in (input\*.pdf) do (&lt;br /&gt;
   echo &amp;quot;%%~nF&amp;quot;&lt;br /&gt;
   %pdftk% &amp;quot;%%F&amp;quot; cat %start%-%end% output &amp;quot;output\%%~nF-cat-pdftk.pdf&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
====via GhostScript (Windows) + image compression====&lt;br /&gt;
 @echo off&lt;br /&gt;
 set gs=C:\Users\torben\Progs\PortableApps\CommonFiles\Ghostscript\bin\gswin32c.exe&lt;br /&gt;
 REM output image quality is reduced to 300 dpi via -dPDFSETTINGS=\printer for 150 dpi use \ebook, for 75 dpi use \screen&lt;br /&gt;
 set start=12&lt;br /&gt;
 set end=40&lt;br /&gt;
 for %%F in (input\*.pdf) do (&lt;br /&gt;
   echo &amp;quot;%%~nF&amp;quot;&lt;br /&gt;
   %gs% ^&lt;br /&gt;
   -o &amp;quot;output\%%~nF-cat-gs.pdf&amp;quot; ^&lt;br /&gt;
   -sDEVICE=pdfwrite ^&lt;br /&gt;
   -dFirstPage=%start% -dLastPage=%end% ^&lt;br /&gt;
   -dCompatibilityLevel=1.7 ^&lt;br /&gt;
   -dPDFSETTINGS=/printer ^&lt;br /&gt;
   -dAutoRotatePages=/None ^&lt;br /&gt;
   -dNOPAUSE -dBATCH ^&lt;br /&gt;
   -f &amp;quot;%%F&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
===Crop white borders===&lt;br /&gt;
(useful for reading a book on a small netbook/laptop screen)&lt;br /&gt;
&lt;br /&gt;
====Linux====&lt;br /&gt;
quick and dirty:&lt;br /&gt;
 pdfcrop file.pdf file-crop.pdf&lt;br /&gt;
&lt;br /&gt;
better, since preserves links and generates smaller filesize: Use this script [http://tex.stackexchange.com/questions/42236/pdfcrop-generates-larger-file pdfcrop.sh] or the modified version below [[#pdfcrop2.sh|pdfcrop2.sh]]&lt;br /&gt;
&lt;br /&gt;
 # requires pdftk&lt;br /&gt;
 pdfcrop2.sh file.pdf file-crop.pdf&lt;br /&gt;
&lt;br /&gt;
====Windows====&lt;br /&gt;
use [[#pdfcrop.bat|pdfcrop.bat]]&lt;br /&gt;
&lt;br /&gt;
===Render two or more pages onto one page ===&lt;br /&gt;
 # requires pdftk&lt;br /&gt;
 sudo apt-get install pdfjam # brings pdfnup&lt;br /&gt;
 &lt;br /&gt;
 pdfnup AS_Chapter1.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===pdf shrinking and protection-removal using Ghostscript===&lt;br /&gt;
Shrinks file size and removes protection, &amp;#039;&amp;#039;&amp;#039;output -o comes first!!!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 gswin64c.exe               ^&lt;br /&gt;
   -o &amp;quot;file-shrink.pdf&amp;quot;     ^&lt;br /&gt;
   -sDEVICE=pdfwrite        ^&lt;br /&gt;
   -dCompatibilityLevel=1.7 ^&lt;br /&gt;
   -dPDFSETTINGS=/printer   ^&lt;br /&gt;
   -dAutoRotatePages=/None  ^&lt;br /&gt;
   -dNOPAUSE -dBATCH        ^&lt;br /&gt;
   -f &amp;quot;file.pdf&amp;quot;&lt;br /&gt;
( Windows: gswin64c.exe and ^ ; Linux: gs and \ )&lt;br /&gt;
&lt;br /&gt;
Further parametes&lt;br /&gt;
Converting Bitmaps to 300dpi&lt;br /&gt;
 -dPDFSETTINGS=/printer&lt;br /&gt;
Converting Bitmaps to 150dpi&lt;br /&gt;
 -dPDFSETTINGS=/ebook&lt;br /&gt;
Converting Bitmaps to 75dpi&lt;br /&gt;
 -dPDFSETTINGS=/screen&lt;br /&gt;
Page range&lt;br /&gt;
 -dFirstPage=100 -dLastPage=123&lt;br /&gt;
&lt;br /&gt;
===Vector text on Raster image===&lt;br /&gt;
Do not use Inkscape when working with colorful images like pictures, since internally it stores all raster images as png, not as jpg when exporting to pdf. Better use:&lt;br /&gt;
# Gimp to optimize file&lt;br /&gt;
#* crop borders &lt;br /&gt;
#* scale image&lt;br /&gt;
#* set dpi via Image -&amp;gt; Scale Image -&amp;gt; X+Y Resolution (300px/inch is fine for printing)&lt;br /&gt;
#* set image-&amp;gt;mode-&amp;gt;grayscale if suitable&lt;br /&gt;
#* export in wanted quality ( e.g. 85% for jpg or image-&amp;gt;mode-&amp;gt;indexed for png)&lt;br /&gt;
# LibreOffice&lt;br /&gt;
#* import image, preferable as link, since than you can still modify it afterwards using Gimp&lt;br /&gt;
#* place text or drawings&lt;br /&gt;
#* File-&amp;gt; export as pdf&lt;br /&gt;
#* you might choose &amp;quot;Lossless compression&amp;quot; if already done by Gimp&lt;br /&gt;
#* no need for &amp;quot;reduce image resolution&amp;quot; if already done by Gimp&lt;br /&gt;
&lt;br /&gt;
===Color to Greyscale===&lt;br /&gt;
[http://us.generation-nt.com/answer/converting-pdf-grayscale-help-200017171.html]&lt;br /&gt;
 gs -sOutputFile=grayscale.pdf -sDEVICE=pdfwrite&lt;br /&gt;
 -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray&lt;br /&gt;
 -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH c-color.pdf &amp;lt; /dev/null&lt;br /&gt;
&lt;br /&gt;
===Appendix Scripts===&lt;br /&gt;
====pdfcrop.bat====&lt;br /&gt;
requires [http://www.ghostscript.com/download/gsdnld.html GhostScript] and [http://unxutils.sourceforge.net sed] (included in [http://unxutils.sourceforge.net UnixUtils for Windows])&lt;br /&gt;
 @echo off&lt;br /&gt;
 for %%F in (input\*.pdf) do (&lt;br /&gt;
   echo &amp;quot;%%~nF&amp;quot;&lt;br /&gt;
 echo uncompressing&lt;br /&gt;
 REM using pdtk to uncompress&lt;br /&gt;
 pdftk &amp;quot;%%F&amp;quot; output uncompressed.pdf uncompress &lt;br /&gt;
 &lt;br /&gt;
 echo adding Boxes&lt;br /&gt;
 REM sed from unix utils package&lt;br /&gt;
 REM calc via mm2pt.xlsx&lt;br /&gt;
 sed -e &amp;quot;s/\(\(Crop\|Media\)Box\).*/\1 [55.0 85.0 413.0 590.0]/g&amp;quot; uncompressed.pdf &amp;gt; uncompressed2.pdf&lt;br /&gt;
 del uncompressed.pdf&lt;br /&gt;
 &lt;br /&gt;
 REM using ghostscript to trim&lt;br /&gt;
 echo compressing&lt;br /&gt;
   e:\win\progs\gs9.21\bin\gswin64c.exe ^&lt;br /&gt;
   -o &amp;quot;output\%%~nF-crop.pdf&amp;quot; ^&lt;br /&gt;
   -sDEVICE=pdfwrite ^&lt;br /&gt;
   -dCompatibilityLevel=1.7 ^&lt;br /&gt;
   -dAutoRotatePages=/None ^&lt;br /&gt;
   -dNOPAUSE -dBATCH ^&lt;br /&gt;
   -f &amp;quot;uncompressed2.pdf&amp;quot;&lt;br /&gt;
 del uncompressed2.pdf&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
====pdfcrop2.sh====&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # from http://tex.stackexchange.com/questions/42236/pdfcrop-generates-larger-file&lt;br /&gt;
 &lt;br /&gt;
 function usage () {&lt;br /&gt;
   echo &amp;quot;Usage: `basename $0` [Options] &amp;lt;input.pdf&amp;gt; [&amp;lt;output.pdf&amp;gt;]&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot; * Removes white margins from each page in the file. (Default operation)&amp;quot;&lt;br /&gt;
   echo &amp;quot; * Trims page edges by given amounts. (Alternative operation)&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot;If only &amp;lt;input.pdf&amp;gt; is given, it is overwritten with the cropped output.&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot;Options:&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot; -m \&amp;quot;&amp;lt;left&amp;gt; [&amp;lt;top&amp;gt; [&amp;lt;right&amp;gt; &amp;lt;bottom&amp;gt;]]\&amp;quot;&amp;quot;&lt;br /&gt;
   echo &amp;quot;    adds extra margins in default operation mode. Unit is bp. A single number&amp;quot;&lt;br /&gt;
   echo &amp;quot;    is used for all margins, two numbers \&amp;quot;&amp;lt;left&amp;gt; &amp;lt;top&amp;gt;\&amp;quot; are applied to the&amp;quot;&lt;br /&gt;
   echo &amp;quot;    right and bottom margins alike.&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot; -t \&amp;quot;&amp;lt;left&amp;gt; [&amp;lt;top&amp;gt; [&amp;lt;right&amp;gt; &amp;lt;bottom&amp;gt;]]\&amp;quot;&amp;quot;&lt;br /&gt;
   echo &amp;quot;    trims outer page edges by the given amounts. Unit is bp. A single number&amp;quot;&lt;br /&gt;
   echo &amp;quot;    is used for all trims, two numbers \&amp;quot;&amp;lt;left&amp;gt; &amp;lt;top&amp;gt;\&amp;quot; are applied to the&amp;quot;&lt;br /&gt;
   echo &amp;quot;    right and bottom trims alike.&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot; -hires&amp;quot;&lt;br /&gt;
   echo &amp;quot;    %%HiResBoundingBox is used in default operation mode.&amp;quot;&lt;br /&gt;
   echo&lt;br /&gt;
   echo &amp;quot; -help&amp;quot;&lt;br /&gt;
   echo &amp;quot;    prints this message.&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 c=0&lt;br /&gt;
 mar=(0 0 0 0); tri=(0 0 0 0)&lt;br /&gt;
 bbtype=BoundingBox&lt;br /&gt;
 &lt;br /&gt;
 while getopts m:t:h: opt&lt;br /&gt;
 do&lt;br /&gt;
   case $opt&lt;br /&gt;
   in&lt;br /&gt;
     m)&lt;br /&gt;
     eval mar=($OPTARG)&lt;br /&gt;
     [[ -z &amp;quot;${mar[1]}&amp;quot; ]] &amp;amp;&amp;amp; mar[1]=${mar[0]}&lt;br /&gt;
     [[ -z &amp;quot;${mar[2]}&amp;quot; || -z &amp;quot;${mar[3]}&amp;quot; ]] &amp;amp;&amp;amp; mar[2]=${mar[0]} &amp;amp;&amp;amp; mar[3]=${mar[1]}&lt;br /&gt;
     c=0&lt;br /&gt;
     ;;&lt;br /&gt;
     t)&lt;br /&gt;
     eval tri=($OPTARG)&lt;br /&gt;
     [[ -z &amp;quot;${tri[1]}&amp;quot; ]] &amp;amp;&amp;amp; tri[1]=${tri[0]}&lt;br /&gt;
     [[ -z &amp;quot;${tri[2]}&amp;quot; || -z &amp;quot;${tri[3]}&amp;quot; ]] &amp;amp;&amp;amp; tri[2]=${tri[0]} &amp;amp;&amp;amp; tri[3]=${tri[1]}&lt;br /&gt;
     c=1&lt;br /&gt;
     ;;&lt;br /&gt;
     h)&lt;br /&gt;
     if [[ &amp;quot;$OPTARG&amp;quot; == &amp;quot;ires&amp;quot; ]]&lt;br /&gt;
     then&lt;br /&gt;
       bbtype=HiResBoundingBox&lt;br /&gt;
     else&lt;br /&gt;
       usage 1&amp;gt;&amp;amp;2; exit 0&lt;br /&gt;
     fi&lt;br /&gt;
     ;;&lt;br /&gt;
     \?)&lt;br /&gt;
     usage 1&amp;gt;&amp;amp;2; exit 1&lt;br /&gt;
     ;;&lt;br /&gt;
   esac&lt;br /&gt;
 done&lt;br /&gt;
 shift $((OPTIND-1))&lt;br /&gt;
 &lt;br /&gt;
 [[ -z &amp;quot;$1&amp;quot; ]] &amp;amp;&amp;amp; echo &amp;quot;`basename $0`: missing filename&amp;quot; 1&amp;gt;&amp;amp;2 &amp;amp;&amp;amp; usage 1&amp;gt;&amp;amp;2 &amp;amp;&amp;amp; exit 1&lt;br /&gt;
 input=$1;output=$1;shift;&lt;br /&gt;
 [[ -n &amp;quot;$1&amp;quot; ]] &amp;amp;&amp;amp; output=$1 &amp;amp;&amp;amp; shift;&lt;br /&gt;
 &lt;br /&gt;
 # by TM&lt;br /&gt;
 if [ $input == $output ] ; then&lt;br /&gt;
 output=&amp;quot;`basename $output`&amp;quot; # remove dirs&lt;br /&gt;
 output=&amp;quot;${output%\.*}&amp;quot; # remove ext .pdf &amp;amp; .PDF&lt;br /&gt;
 output=&amp;quot;$output-crop.pdf&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;$input -&amp;gt; $output&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 (&lt;br /&gt;
     [[ &amp;quot;$c&amp;quot; -eq 0 ]] &amp;amp;&amp;amp; gs -dNOPAUSE -q -dBATCH -sDEVICE=bbox &amp;quot;$input&amp;quot; 2&amp;gt;&amp;amp;1 | grep &amp;quot;%%$bbtype&amp;quot;&lt;br /&gt;
     pdftk &amp;quot;$input&amp;quot; output - uncompress&lt;br /&gt;
 ) | perl -w -n -s -e &amp;#039;&lt;br /&gt;
   BEGIN {@m=split /\s+/, $mar; @t=split /\s+/, $tri;}&lt;br /&gt;
   if (/BoundingBox:\s+([\d\.\s]+\d)/) { push @bbox, $1; next;}&lt;br /&gt;
   elsif (/\/MediaBox\s+\[([\d\.\s]+\d)\]/) { @mb=split /\s+/, $1; next; }&lt;br /&gt;
   elsif (/pdftk_PageNum\s+(\d+)/) {&lt;br /&gt;
     $p=$1-1;&lt;br /&gt;
     if($c){&lt;br /&gt;
       $mb[0]+=$t[0];$mb[1]+=$t[1];$mb[2]-=$t[2];$mb[3]-=$t[3];&lt;br /&gt;
       print &amp;quot;/MediaBox [&amp;quot;, join(&amp;quot; &amp;quot;, @mb), &amp;quot;]\n&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       @bb=split /\s+/, $bbox[$p];&lt;br /&gt;
       $bb[0]+=$mb[0];$bb[1]+=$mb[1];$bb[2]+=$mb[0];$bb[3]+=$mb[1];&lt;br /&gt;
       $bb[0]-=$m[0];$bb[1]-=$m[1];$bb[2]+=$m[2];$bb[3]+=$m[3];&lt;br /&gt;
       print &amp;quot;/MediaBox [&amp;quot;, join(&amp;quot; &amp;quot;, @bb), &amp;quot;]\n&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   print;&lt;br /&gt;
 &amp;#039; -- -mar=&amp;quot;${mar[*]}&amp;quot; -tri=&amp;quot;${tri[*]}&amp;quot; -c=$c | pdftk - output &amp;quot;$output&amp;quot; compress&lt;/div&gt;</summary>
		<author><name>Torben</name></author>
	</entry>
</feed>