//using static System.Net.Mime.MediaTypeNames;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using SkiaSharp;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing;
using iTextSharp.xmp.impl.xpath;
string imageFolder = @“INPUT_FOLDER_PATH”; // Path to images
string outputFolder = @“OUTPUT_FOLDER_PATH”;
int maxPdfSize = 2 * 1024 * 1024;
string images = Directory.GetFiles(imageFolder);
List<List> imageGroups = DistributeImages(images, 5);
int count = 1;
int fixedQuality = 100;
foreach (var imgs in imageGroups)
{
bool qualityCheck = true;
int quality = fixedQuality;
while (qualityCheck)
{
Document document = new Document(PageSize.A4, 25, 25, 25, 25);
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
document.Open();
foreach (string path in imgs)
{
Image img = CompressImage(path, quality);
document.Add(img);
writer.Flush();
}
if (memoryStream.Length < maxPdfSize)
{
document.Close();
File.WriteAllBytes(Path.Combine(outputFolder, $"PDF_{count}.pdf"), memoryStream.ToArray());
count++;
qualityCheck = false;
}
else
{
quality = quality - 10;
document = new Document(PageSize.A4, 25, 25, 25, 25);
}
}
}
static Image CompressImage(string imagePath,int quality)
{
using (SKBitmap bitmap = SKBitmap.Decode(imagePath))
{
int newWidth = 600;
int newHeight = (int)(bitmap.Height * (600.0 / bitmap.Width)); // Maintain aspect ratio
using (SKBitmap resizedBitmap = bitmap.Resize(new SKImageInfo(newWidth, newHeight), SKFilterQuality.Medium))
using (SKImage img = SKImage.FromBitmap(resizedBitmap))
using (SKData data = img.Encode(SKEncodedImageFormat.Jpeg, quality)) // 70% quality
{
return Image.GetInstance(data.ToArray());
}
}
}
static List<List> DistributeImages(string images, int numFiles)
{
var groups = new List<List>();
int imagesPerFile = images.Length / numFiles;
int remaining = images.Length % numFiles;
int index = 0;
for (int i = 0; i < numFiles; i++)
{
int count = imagesPerFile + (remaining-- > 0 ? 1 : 0);
groups.Add(images.Skip(index).Take(count).ToList());
index += count;
}
return groups;
}