- 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));
}