- Add a link to PDF with an external destination
 - Add a link with an internal destination to PDF
 - Add a note to PDF
 - Add barcodes to PDF
 - Add bookmarks to PDF
 - Add footer to PDF
 - Add simple html text to PDF
 - Add hyperlink to PDF
 - Add Long Term Validation (LTV) data to an existing signature
 - Add multiline text to a PDF document
 - Add a rubber stamp annotation with a custom icon
 - Add single-line text to PDF
 - Add Stamp to PDF
 - Add tags to existing PDF
 - Add text field to PDF
 - Add a Diagonal Watermark to PDF in C# - TallComponents - PDF Library
 - pdfkit5 - detailed changes to the API - Tall Components
 - Append two or more existing PDF files
 - Change the color inside a PDF
 - Change the formatting of a numeric field
 - Change page orientation PDF
 - Clip PDF page content in C#
 - .NET Core console app on MacOS
 - Convert PDF to plain text
 - Convert SVG to PDF
 - Create a text annotation in PDF with rich text
 - Create formfields in PDF documents
 - Create a new digitally signed PDF document
 - Create rectangles with rounded corners
 - Create tagged PDF
 - Create text with decorations
 - How to create a tiling for shapes in PDF
 - Crop content on a PDF page
 - Determine the content bounding box
 - Determine if a PDF only contains images
 - Digitally sign a PDF form in C# or VB.NET
 - Disable submit button after submitting
 - How to downscale all images in a PDF
 - Download and convert image to PDF
 - How to downscale all images in a PDF
 - Vector graphics in PDF
 - Fill XFA form and export XDP data
 - Fill and save dynamic XFA form
 - Merge XDP data with dynamic XFA form
 - Dynamic XFA
 - How to embed files in a PDF document
 - Embed TrueType font in PDF
 - EMF to PDF as vector image
 - Export FDF from PDF form
 - Extract embedded files from PDF
 - Extract glyph boxes from PDF
 - Extract glyphs and sort by reading order
 - Extract graphics from PDF
 - Extract images from PDF
 - Fill in a template PDF document
 - Fill PDF form
 - Fit image to PDF page
 - Flatten Markup Annotation
 - Flatten PDF form
 - How to generate and export certificates
 - How do I extract page destinations from bookmarks?
 - Highlight fields in PDF
 - How to add autosized text to PDF
 - How to sign and verify updates to a PDF document
 - Import FDF into PDF
 - Licensing and .NET Standard
 - Merge PDF files in C# .NET
 - How to mirror PDF pages and other shapes
 - Layout text with MultilineTextShape
 - pdfkit5 and .NET Core
 - pdfkit5 .NET Standard API
 - Read and write meta data from PDF
 - Read PDF tags
 - How to reduce PDF file size
 - Reduce PDF size
 - Remove graphics from PDF
 - Remove PDF security settings
 - Replace field with image
 - Resize PDF pages
 - Rotate a PDF page
 - How to scale content of PDF
 - Search text in PDF
 - PDF Viewer Preferences
 - Create a custom signature handler to sign and verify PDF documents
 - Split PDF pages in C# and VB.NET
 - Tagged PDF
 - TIFF to PDF C#
 - Translate PDF page content
 - Use multiple licenses
 - Use TrueType font collections
 - Write Document to HttpResponse
 - Use pdfkit5 with a Xamarin.Forms app
 - pdfkit5 and Xamarin
 
How to downscale all images in a PDF
This code sample shows how to downscale images in a PDF file. In order to downscale the images, we extract all graphical content as a collection of shapes. We then replace each ImageShape in this collection with a downscaled copy. Next, the result is written back to a new PDF file.
static void Main(string[] args)
{
    using (FileStream fileIn = new FileStream(@"..\..\..\inputDocuments\BlueWater.pdf", FileMode.Open, FileAccess.Read))
    {
        Document pdfIn = new Document(fileIn);
        //downscale all images in the document to 18 dots per inch
        int dpi = 10;
        Document pdfOut = new Document();
        foreach (Page page in pdfIn.Pages)
        {
            ShapeCollection shapes = page.CreateShapes();
            //downscale all imageshapes on this page
            downScaleImages(shapes, dpi);
            //add all shapes to the new document
            Page newPage = new Page(page.Width, page.Height);
            newPage.Overlay.Add(shapes);
            pdfOut.Pages.Add(newPage);
        }
        using (FileStream fileOut = new FileStream(@"..\..\out.pdf", FileMode.Create, FileAccess.Write))
        {
            pdfOut.Write(fileOut);
        }
    }
}
static void downScaleImages(ShapeCollection shapes, int dpi)
{
    for (int i = 0; i < shapes.Count; i++)
    {
        Shape shape = shapes[i];
        if (shape is ShapeCollection)
        {
            // recurse
            downScaleImages(shape as ShapeCollection, dpi);
        }
        else if (shape is ImageShape)
        {
            shapes.RemoveAt(i);
            ImageShape downScaled = downScale(shape as ImageShape, dpi);
            shapes.Insert(i, downScaled);
        }
    }
}
The following code snippet shows how we resample a given ImageShape.
static ImageShape downScale(ImageShape image, int dpi)
{
    Matrix matrix = image.Transform.CreateGdiMatrix();
    PointF[] points = new PointF[] 
    {
            new PointF(0, 0), 
            new PointF((float)image.Width, 0),
            new PointF(0, (float)image.Height) 
    };
    matrix.TransformPoints(points);
    // real dimensions of the image in points as it appears on the page
    float realWidth = distance(points[0], points[1]);
    float realHeight = distance(points[0], points[2]);
    // given the desired resolution, these are the desired number of cols/rows of the optimized image
    int desiredColumns = (int)(realWidth * ((float)dpi / 72f));
    int desiredRows = (int)(realHeight * ((float)dpi / 72f));
    // create the new image and copy the source image to it (resampling happens here)
    using (Bitmap bitmap = image.CreateBitmap())
    {
        if (desiredColumns > bitmap.Width) return image; // prevent upscale
        if (desiredRows > bitmap.Width) return image; // prevent upscale
        Bitmap optimizedBitmap = new Bitmap(desiredColumns, desiredRows, PixelFormat.Format32bppArgb);
        //draw the image so the pixels can be resampled
        using (Graphics graphics = Graphics.FromImage(optimizedBitmap))
        {
            graphics.DrawImage(bitmap, 0, 0, desiredColumns, desiredRows);
        }
        //create new imageshape and keep all of the settings the same
        ImageShape optimized = new ImageShape(optimizedBitmap, true);
        optimized.Compression = Compression.Jpeg;
        optimized.Width = image.Width;
        optimized.Height = image.Height;
        optimized.Transform = image.Transform;
        optimized.Opacity = image.Opacity;
        optimized.BlendMode = image.BlendMode;
        optimized.Transform = image.Transform;
        return optimized;
    }
}
static float distance(PointF a, PointF b)
{
    return (float)Math.Sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y));
}