Complete guide to image handling in HTML to PDF generation, including SVG conversion, optimization, and print quality control.
The PDF generator provides comprehensive image handling capabilities:
- SVG to Image Conversion - Automatic conversion of SVG elements to PNG
- Image Optimization - Compress and resize images for optimal PDF size
- Background Images - Proper CSS background-image support
- Image Preloading - Ensures all images load before PDF generation
- Data URL Support - Works with inline data URLs and external images
- Quality Control - Configurable JPEG quality and compression
import { generatePDF } from '@encryptioner/html-to-pdf-generator';
const element = document.getElementById('content');
await generatePDF(element, 'document.pdf', {
optimizeImages: true,
maxImageWidth: 2000,
imageQuality: 0.85,
convertSVG: true,
});Enable automatic image optimization.
optimizeImages: true // Enable optimization (default: true)When enabled:
- Images are compressed to reduce file size
- Large images are resized to maxImageWidth
- JPEG quality is adjusted based on imageQuality setting
Maximum image width in pixels.
maxImageWidth: 2000 // Max width in pixels (default: 2000)Images wider than this will be proportionally resized while maintaining aspect ratio.
JPEG compression quality (0-1).
imageQuality: 0.85 // 85% quality (default: 0.85)1.0= Maximum quality, larger file size0.85= High quality, balanced file size (recommended)0.7= Medium quality, smaller file size0.5= Lower quality, much smaller file size
Enable automatic SVG to image conversion.
convertSVG: true // Convert SVG elements (default: true)SVG elements are converted to PNG images before PDF generation to ensure proper rendering.
SVG elements in your HTML are automatically detected and converted:
<div id="content">
<h1>My Chart</h1>
<svg width="400" height="300">
<circle cx="50" cy="50" r="40" fill="blue" />
<rect x="100" y="10" width="200" height="100" fill="red" />
</svg>
</div>await generatePDF(element, 'chart.pdf', {
convertSVG: true, // Automatically converts the SVG
});Works seamlessly with chart libraries like Chart.js, D3.js, and others:
// Chart.js example
const chart = new Chart(ctx, {
type: 'bar',
data: chartData,
});
// Wait for chart to render
await new Promise(resolve => setTimeout(resolve, 100));
// Generate PDF with chart
await generatePDF(containerElement, 'chart-report.pdf', {
convertSVG: true,
});CSS background images are automatically extracted and processed:
<div style="background-image: url('banner.jpg'); height: 200px;">
<h1>Header with Background</h1>
</div>await generatePDF(element, 'document.pdf', {
optimizeImages: true, // Also optimizes background images
});Support for inline data URLs:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..." alt="Inline Image" />Data URLs are processed and optimized just like external images.
All images are preloaded before PDF generation to ensure they render properly:
// Automatic preloading
await generatePDF(element, 'document.pdf');
// Images are loaded before PDF generation startsManual Preloading (if needed):
// Ensure images are loaded
const images = element.querySelectorAll('img');
await Promise.all(
Array.from(images).map(img => {
if (img.complete) return Promise.resolve();
return new Promise(resolve => {
img.onload = resolve;
img.onerror = resolve;
});
})
);
// Now generate PDF
await generatePDF(element, 'document.pdf');interface ImageProcessingOptions {
compress?: boolean; // Enable compression
quality?: number; // JPEG quality (0-1)
maxWidth?: number; // Maximum width
maxHeight?: number; // Maximum height
grayscale?: boolean; // Convert to grayscale
format?: 'jpeg' | 'png'; // Output format
}
await generatePDF(element, 'document.pdf', {
optimizeImages: true,
imageQuality: 0.8,
maxImageWidth: 1600,
});Convert all images to grayscale for print-friendly documents:
await generatePDF(element, 'document.pdf', {
optimizeImages: true,
// Note: Grayscale requires custom image processing
customCSS: 'img { filter: grayscale(100%); }',
});// High quality (larger files)
await generatePDF(element, 'high-quality.pdf', {
imageQuality: 0.95,
maxImageWidth: 3000,
});
// Balanced (recommended)
await generatePDF(element, 'balanced.pdf', {
imageQuality: 0.85,
maxImageWidth: 2000,
});
// Optimized for size
await generatePDF(element, 'optimized.pdf', {
imageQuality: 0.7,
maxImageWidth: 1200,
compress: true,
});For a 10-page document with 5 images:
| Quality | Max Width | Approx. Size |
|---|---|---|
| 0.95 | 3000px | ~2.5 MB |
| 0.85 | 2000px | ~1.2 MB |
| 0.70 | 1200px | ~600 KB |
The scale option affects image rendering quality:
// Standard quality (96 DPI equivalent)
await generatePDF(element, 'standard.pdf', {
scale: 1,
});
// High quality (192 DPI equivalent) - Recommended
await generatePDF(element, 'high-quality.pdf', {
scale: 2,
});
// Print quality (288 DPI equivalent)
await generatePDF(element, 'print.pdf', {
scale: 3,
});Recommendation: Use scale: 2 for most cases. It provides excellent print quality without excessive file size.
Problem: Images don't show up in the PDF.
Solutions:
- Ensure images are loaded before generation
- Check CORS settings for external images
- Use absolute URLs or data URLs
// Wait for images to load
await new Promise(resolve => setTimeout(resolve, 500));
await generatePDF(element, 'document.pdf');Problem: Images appear blurry in the PDF.
Solutions:
- Increase scale factor
- Use higher resolution source images
- Avoid upscaling small images
await generatePDF(element, 'document.pdf', {
scale: 2, // Or 3 for even better quality
});Problem: PDF files are too large.
Solutions:
- Reduce image quality
- Decrease maxImageWidth
- Enable compression
await generatePDF(element, 'document.pdf', {
optimizeImages: true,
imageQuality: 0.75,
maxImageWidth: 1500,
compress: true,
});Problem: SVG elements render incorrectly.
Solutions:
- Ensure convertSVG is enabled
- Check for external dependencies in SVG
- Inline SVG styles
await generatePDF(element, 'document.pdf', {
convertSVG: true,
});Optimize images before adding to HTML when possible:
- Use appropriate image formats (JPEG for photos, PNG for graphics)
- Resize images to display dimensions
- Compress images with tools like TinyPNG
Provide appropriately sized images:
<img src="image-large.jpg"
srcset="image-small.jpg 800w, image-medium.jpg 1200w, image-large.jpg 2000w"
sizes="(max-width: 800px) 800px, 1200px"
alt="Responsive Image" />// Web version with lazy loading
<img src="placeholder.jpg" data-src="actual-image.jpg" loading="lazy" />
// Before PDF generation, load all images
const lazyImages = element.querySelectorAll('[data-src]');
lazyImages.forEach(img => {
img.src = img.dataset.src;
});
await generatePDF(element, 'document.pdf');const qualitySettings = [
{ quality: 0.95, label: 'high' },
{ quality: 0.85, label: 'medium' },
{ quality: 0.75, label: 'low' },
];
for (const setting of qualitySettings) {
await generatePDF(element, `document-${setting.label}.pdf`, {
imageQuality: setting.quality,
});
}const gallery = document.getElementById('photo-gallery');
await generatePDF(gallery, 'photo-gallery.pdf', {
format: 'a4',
orientation: 'portrait',
optimizeImages: true,
imageQuality: 0.85,
maxImageWidth: 2000,
scale: 2,
});// Generate charts
const charts = generateCharts(data);
// Wait for rendering
await new Promise(resolve => setTimeout(resolve, 300));
// Generate PDF
await generatePDF(reportElement, 'chart-report.pdf', {
convertSVG: true,
optimizeImages: true,
scale: 2,
});const catalog = document.getElementById('product-catalog');
await generatePDF(catalog, 'catalog.pdf', {
format: 'a4',
optimizeImages: true,
imageQuality: 0.8,
maxImageWidth: 1600,
compress: true,
showPageNumbers: true,
});- Image Optimization Advanced Guide - In-depth image optimization
- Multi-Page Generation - Page splitting and pagination
- Best Practices - Overall best practices
- Options Reference - Complete options documentation