Βελτιστοποίηση Συμπίεσης PDF


Μερικά αρχεία PDF χρησιμοποιούν συμπίεση εικόνας η οποία δεν είναι η βέλτιστη δυνατή; αυτή η σελίδα δείχνει μερικούς τρόπους για να διορθωθεί αυτό ανασυμπιέζοντας/αναδημιουργώντας το αρχείο. Οι μέθοδοι που περιγράφονται πρέπει να είναι χωρίς απώλεια ποιότητας'; είναι καλύτερα να υποβάλλετε ένα πιο μεγάλο αρχείο αν δεν μπορείτε να το συμπιέσετε χωρίς απώλειες.

Contents

Μέθοδοι

Χρησιμοποιοώντας την εφαρμογή PDF Split and Merge

Βλέπε εδώ για πληροφορίες σχετικά με την εφαρμογή.

Χρησιμοποιώντας την εφαρμογή pdfimages

Αυτή η μέθοδος, βασικά, προσπαθεί να ανακατασκευάσει το αρχείο PDF με το να αποθηκεύσει τις εικόνες από το αρχείο κάπου αλλού, και να ξαναδημιουργήσει το αρχείο με τις εικόνες που αποθήκευσε, με καλύτερη συμπίεση. Το παρακάτω είναι ένα Ruby script για να γίνεται αυτόματα.

Απαιτήσεις

Τι αρχεία PDF δεν μπορούν να ανασυμπιεστούν με αυτή τη μέθοδο

  • Grayscale και έγχρωμα αρχεία PDF
  • Αρχεία PDF files τα οποία δεν περιέχουν εικόνες (π.χ. επαναστοιχειοθετημένα αρχεία PDF)
  • Άλλα αρχεία PDF με περίεργες μεθόδους δημιουργίας (αρκετά σπάνια)

Συχνά προβλήματα και λύσεις

  • Τα χρώματα του τελικόυ αρχείου PDF έχουν αναστραφεί.
    • Λύση: εκτελέστε το script βάζοντας -negate στο τέλος. Για παράδειγμα: ./pdfcompress.rb somefile.pdf -negate για *nix, και ruby pdfcompress.rb somefile.pdf -negate για 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