IMSLP:PDF-Komprimierung optimieren
Free public domain sheet music from IMSLP / Petrucci Music Library
Einige PDF-Dateien verwenden eine verbesserungsfähige Bilderkomprimierung; diese Seite listet einige Wege auf um dieses Problem bei der Neukomprimierung bzw. Neuerstellung der Datei zu verhindern. Die beschriebenen Methoden sollten verlustfrei sein; es ist besser, einen größere Datei einzustellen wenn sie ansonsten nicht verlustfrei komprimiert werden kann.
Contents |
Methoden
PDF Split and Merge verwenden
Siehe hier für Informationen zu diesem Programm.
pdfimages verwenden
Diese Methode versucht die PDF-Datei neu zu gestalten, indem Sie die Bilder herausschneidet und die PDF-Datei anschließend aus den Bildern neu erstellt. Nachfolgend ein Ruby-Skript, das diese Aufgabe erfüllt.
Systemvoraussetzungen
- Der Ruby interpreter, damit das Skript läuft.
- PDFtk
- Das convert Kommandozeileninterpreter von Imagemagick.
- Das tiff2pdf Kommandozeileninterpreter von LibTIFF; Eine Windows-Portierung gibt es hier.
- Der pdfimages Kommandozeileninterpreter von xpdf tools.
Wann diese Methode nicht angewandt werden kann
- bei Graustufen und farbigen PDF-Dateien
- bei PDF-Dateien, die keine Bilder enthalten (d.h. neu gesetzte PDF-Dateien)
- bei anderen PDF-Dateien mit seltsamen Erzeugungsmethoden (eher selten)
Probleme und Lösungen
- Die PDF-Ausgabe-Datei ist sehr groß
- Lösung: Sehr viele Bilder von gescannten Noten oder Text lassen sich für den Ausdruck in Schwarz/Weiß (2 Farben) umwandeln. Dabei wird das Floyd-Steinberg-Dithering verwendet, das einen ähnlichen Effekt bei Schwarz/Weiß-Bildern erzeugt wie das Anti-Aliasing bei Farb-/Graustufenbildern. Ein gutes Ausgabe-Bildformat ist PNG (Portable Network Graphic) mit Huffman-Kompression. Alternativ bietet sich auch das GIF (Graphic Interchange Format) Bild-Format an, bei dem die Dateien geringfügig größer sind als bei PNG-Bildern. Die Dateigröße gegenüber dem Graustufenbild im JPG-Format verringert sich erheblich - auf 1/8 bis 1/10, und das daraus erzeugte PDF-File wird um den gleichen Faktor kleiner sein, ohne die Qualität des Ausdrucks zu verringern.
- Die entstandene PDF-Datei hat invertierte Farben
- Lösung: lassen Sie das Skript mit dem Zusatz -negate laufen, z.B. ./pdfcompress.rb somefile.pdf -negate für Unix und ruby pdfcompress.rb somefile.pdf -negate für Windows
#!/usr/bin/ruby
require( 'fileutils' )
BASICCONVERTOPTIONS = " -compress Group4"
DELETEIGNOREFILE = false #Automatically delete files which grow in size after recompression?
TMPDIRNAME = "tmpx139toslw"
if ARGV[0] === NIL
$stderr.puts "Syntax: pdfcompress.rb <PDF file> ( <additional convert options> )"
exit 1
end
if ARGV[1] === NIL
convertoptions = BASICCONVERTOPTIONS
else
convertoptions = ARGV[1] + BASICCONVERTOPTIONS
end
begin
Dir.mkdir( TMPDIRNAME )
$stderr.puts "Processing file " + ( file = ARGV[0] ) + "..."
#Convert to individual PDFs
system( "pdfimages \"" + file +"\" " + File.join( TMPDIRNAME, "images" ) )
Dir.glob( File.join( TMPDIRNAME, "*" ) ).each { |imagefile|
$stderr.printf( "\rCompressing " + File.basename( imagefile ) + "..." );
system( "convert #{convertoptions} \"" + imagefile + "\" \"" + imagefile.sub( /\.[^.]*$/, ".tiff" ) + "\"" )
system( "tiff2pdf \"" + imagefile.sub( /\.[^.]*$/, ".tiff" ) + "\" -o \"" + imagefile.sub( /\.[^.]*$/, ".pdf" ) +"\"" )
}
$stderr.printf( "\n" );
#Put them all together now
$stderr.printf( "Combining PDF files... " );
system( "pdftk \"" + Dir.glob( File.join( TMPDIRNAME, "*.pdf" ) ).join( "\" \"" ) + "\" cat output \"" + ( output_filename = File.basename( file ).sub( /#{File.extname( file )}$/, ".2.pdf" ) ) + "\"" )
$stderr.printf( "Done\n" );
#Compare the sizes
if( File.size( file ) > File.size( output_filename ) )
$stdout.puts "Compressed file " + File.basename( file ) + " - Compressed from " + File.size( file ).to_s + " to " + File.size( output_filename ).to_s
else
$stdout.puts "Ignored file " + File.basename( file ) + " - Changed from " + File.size( file ).to_s + " to " + File.size( output_filename ).to_s
File.delete( output_filename ) if DELETEIGNOREFILE
end
ensure
#Clean up temp dir
Dir.glob( File.join( TMPDIRNAME, "*" ) ).each { |delfile| File.delete( delfile ) }
Dir.delete( TMPDIRNAME );
end

