IMSLP:PDF-Komprimierung optimieren


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

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