OptimizePDF.cs
C# VB
//// This code is part of Document Solutions for PDF .NET demos.// Copyright (c) MESCIUS inc. All rights reserved.//using System;using System.IO;using System.Collections.Generic;using GrapeCity.Documents.Pdf;using GrapeCity.Documents.Common;
namespace DsPdfWeb.Demos{ // This sample shows how to use the GcPdfDocument.Optimize() method // to reduce the size of a PDF by applying various optimization strategies, // such as using the optimal compression, using object streams, // merging duplicate and removing unused embedded fonts, and so on. // For details on the optimization strategies, see the OptimizeDocumentOptions class. // // This sample extracts the first five pages of a PDF, and then merges those pages // into a single new document without applying any optimizations. // The sample records the merged PDF's size, then runs Optimize() on that PDF // and records the size of the optimized PDF. These results are printed into the // PDF returned by the sample, thus illustrating the effect of running Optimize() // with most optimization options on (the only option that is not applied is // removing embedded fonts, which is not recommended in most cases as it can produce // documents not readable on some systems). // // See also OptimizeFonts and RemoveDuplicateImages. public class OptimizePDF { public int CreatePDF(Stream stream) { // Create a 5 page non-optimal PDF: var srcFn = Path.Combine("Resources", "PDFs", "CompleteJavaScriptBook.pdf"); var tmpInput = MakeInputFile(srcFn); var fiInput = new FileInfo(tmpInput);
// Create a new PDF, load the source PDF into it, and optimize it: var tmpOutput = Path.GetTempFileName(); var tmpDoc = new GcPdfDocument(); using (var fs = File.OpenRead(tmpInput)) { tmpDoc.Load(fs); var odo = new OptimizeDocumentOptions(); // Maximize minimization: odo.SetForMinimumSize(); // But do not remove embedded fonts which is not recommended in most cases: odo.RemoveEmbeddedFonts = false; tmpDoc.Optimize(tmpOutput, odo); } var fiOutput = new FileInfo(tmpOutput);
// Record the input and output file sizes in the resultant PDF: var doc = new GcPdfDocument(); Common.Util.AddNote(String.Format( "Using the GcPdfDocument.Optimize() method reduced the size of a 5-page PDF from {0:N0} to {1:N0} bytes " + "by applying various optimization strategies.\n" + "To reproduce these results locally, download and run this sample. You may also modify the sample code to keep the temporary " + "input and output files and compare their sizes using a file manager.", fiInput.Length, fiOutput.Length), doc.NewPage()); doc.Save(stream);
// Clean up (for debugging purposes you may want to change the temp files' extensions to .pdf // and keep/examine them, in that case replace the next two lines with the two ChangeExtension calls): // File.Move(tmpInput, Path.ChangeExtension(tmpInput, ".pdf"), true); // File.Move(tmpOutput, Path.ChangeExtension(tmpOutput, ".pdf"), true); File.Delete(tmpInput); File.Delete(tmpOutput);
return doc.Pages.Count; }
static string MakeInputFile(string inFn) { var indoc = new GcPdfDocument(); using var fs = File.OpenRead(inFn); indoc.Load(fs);
// Create 5 PDFs from the first 5 pages of the source document: var pageCount = 5; var docs = new List<GcPdfDocument>(pageCount); for (int i = 0; i < pageCount; ++i) { var outdoc = new GcPdfDocument(); outdoc.MergeWithDocument(indoc, new MergeDocumentOptions() { PagesRange = new OutputRange(i + 1, i + 1) }); docs.Add(outdoc); } // Merge the PDFs into a single document: var doc = new GcPdfDocument(); foreach (var d in docs) doc.MergeWithDocument(d);
// Save the resultant PDF in a temp file: var outFn = Path.GetTempFileName(); doc.Save(outFn); return outFn; } }}