'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystem.IOImportsSystem.IO.CompressionImportsSystem.Collections.GenericImportsGrapeCity.Documents.PdfImportsGrapeCity.Documents.Common '' This sample shows how the GcPdfDocument.OptimizeFonts() method can be used'' to reduce the size of a PDF by merging duplicate and removing unused embedded fonts.'''' This sample extracts the first five pages of a PDF, and then merges those pages'' into a single new document. Because each page has its own set of embedded fonts,'' the created PDF contains redundant font data, resulting in excessive file size.'' The sample records the merged PDF's size, then it runs OptimizeFonts() 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 OptimizeFonts().'''' See also RemoveDuplicateImages.PublicClassOptimizeFontsPublicFunctionCreatePDF(ByVal stream AsStream) AsInteger'' Create a 5 page non-optimal PDF:Dim srcFn = Path.Combine("Resources", "PDFs", "CompleteJavaScriptBook.pdf")Dim tmpInput = MakeInputFile(srcFn)Dim fiInput = NewFileInfo(tmpInput) '' Create a new PDF, load the source PDF into it, and optimize it:Dim tmpOutput = Path.GetTempFileName()Dim tmpDoc = NewGcPdfDocument()Using fs = File.OpenRead(tmpInput) tmpDoc.Load(fs)' By default GcPdfDocument uses CompressionLevel.Fastest when saving a PDF.' If PDF size is important, we should use optimal compression: tmpDoc.CompressionLevel = CompressionLevel.Optimal tmpDoc.OptimizeFonts() tmpDoc.Save(tmpOutput)EndUsingDim fiOutput = NewFileInfo(tmpOutput) '' Record the input and output file sizes in the resultant PDF:Dim doc = NewGcPdfDocument()Util.AddNote(String.Format("Using the GcPdfDocument.OptimizeFonts() method reduced the size of a 5-page PDF from {0:N0} to {1:N0} bytes " &"by merging duplicate and removing unused font data." & vbLf &"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:File.Delete(tmpInput)File.Delete(tmpOutput) '' Done:Return doc.Pages.CountEndFunction PrivateSharedFunctionMakeInputFile(inFn AsString) AsStringDim indoc = NewGcPdfDocument()Using fs = File.OpenRead(inFn) indoc.Load(fs) ' Create 5 PDFs from the first 5 pages of the source document:Dim pageCount = 5Dim docs = NewList(OfGcPdfDocument)(pageCount)For i = 0To pageCount - 1Dim outdoc = NewGcPdfDocument() outdoc.MergeWithDocument(indoc, NewMergeDocumentOptions() With {.PagesRange = NewOutputRange(i + 1, i + 1)}) docs.Add(outdoc)Next' Merge the PDFs into a single document:Dim doc = NewGcPdfDocument()ForEach d In docs doc.MergeWithDocument(d)Next ' Save the resultant PDF in a temp file:Dim outFn = Path.GetTempFileName() doc.Save(outFn)Return outFnEndUsingEndFunctionEndClass