PdfToGrayscaleTiff.vb
''
'' This code is part of Document Solutions for PDF .NET demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Collections.Generic
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging
Imports GrapeCity.Documents.Drawing

Public Class PdfToGrayscaleTiff
    Public Function CreatePDF(ByVal stream As Stream) As Integer
        ' Arbitrary target DPI for the generated TIFF, adjust as needed:
        Const targetDPI As Integer = 200

        Dim inputDoc = New GcPdfDocument()
        Using fs = File.OpenRead(Path.Combine("Resources", "PDFs", "SlidePages.pdf"))
            inputDoc.Load(fs)

        Using ms As New MemoryStream()
        Using bmp As New GcBitmap()
        ' NOTE: to produce a TIFF disk file, you would create a GcTiffWriter
        ' with the file path as the parameter. But due to the demo browser requirements,
        ' we create a GcTiffWriter on a memory stream instead:
        ' Using tiffWriter As New GcTiffWriter("result.tiff")
        Using msTiff As New MemoryStream()
            Using tiffWriter As New GcTiffWriter(msTiff)
                For Each pIn In inputDoc.Pages
                    ' Save each PDF page as PNG with target resolution:
                    ms.Position = 0
                    pIn.SaveAsPng(ms, New SaveAsImageOptions() With {.Resolution = targetDPI})
                    ms.Position = 0
                    bmp.Load(ms)
                    ' Load the PNG into GcBitmap, apply in-place grayscale effect,
                    ' convert to grayscale bitmap and append it to the TIFF:
                    bmp.ApplyEffect(GrayscaleEffect.Get())
                    Using gbmp = bmp.ToGrayscaleBitmap()
                        tiffWriter.AppendFrame(gbmp)
                    End Using
                Next
            End Using
            ' At this point tiffWriter has the newly created TIFF. If it was created on
            ' a disk file, that file would contain the TIFF when tiffWriter is disposed.
            '
            ' To use this sample in the demo browser, we have to convert the TIFF
            ' back to a PDF that is returned to the controller.
            msTiff.Position = 0
            Dim doc = New GcPdfDocument()
            Using tiffReader As New GcTiffReader(msTiff)
                Dim disposables As New List(Of IDisposable)()
                For Each tp In tiffReader.Frames
                    Dim img = tp.ToImage(ImageBinding.InMemoryData)
                    Dim pOut = doc.Pages.Add(New SizeF(img.Width / img.HorizontalResolution * 72, img.Height / img.VerticalResolution * 72))
                    pOut.Graphics.DrawImage(img, pOut.Bounds, Nothing, ImageAlign.Default)
                    disposables.Add(img)
                Next
                ' Save the PDF:
                doc.Save(stream)
                ' We can only dispose images after saving the PDF:
                disposables.ForEach(Sub(d_) d_.Dispose())
                Return doc.Pages.Count
            End Using
        End Using
        End Using
        End Using
        End Using
    End Function
End Class