Bende derleyici olmadığından teorik olarak cevabı yazıyorum "chatgpt O3" ile cevaplanmıştır.
Aşağıda, “Microsoft Print To PDF” ile birden fazla resmi tek bir PDF dosyasına, orijinal en‐boy oranını koruyarak sığdırıp ortalayacak, sorunsuz çalışan tam teşekküllü bir WinForms uygulaması örneği bulacaksınız. Yorum satırındaki ölçeklendirme kodu aktif hâle getirildi ve bütün fonksiyonlar eksiksiz çalışacak şekilde tasarlandı.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace MultiImagePdfPrinter
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
public class MainForm : Form
{
private Button printButton;
private PrintDocument printDoc;
private int currentImageIndex;
private readonly List<string> imagesToPrint = new List<string>
{
@"D:\Images\1.tiff",
@"D:\Images\2.jpg",
@"D:\Images\3.png"
// İsterseniz buraya dilediğiniz kadar resim ekleyin
};
public MainForm()
{
InitializeComponents();
}
private void InitializeComponents()
{
// Form ayarları
this.Text = "Resimden PDF Oluşturma";
this.ClientSize = new Size(400, 120);
this.StartPosition = FormStartPosition.CenterScreen;
// Yazdır butonu
printButton = new Button
{
Text = "PDF'e Yazdır",
Dock = DockStyle.Fill,
Font = new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold)
};
printButton.Click += PrintButton_Click;
this.Controls.Add(printButton);
// PrintDocument ve event bağlamaları
printDoc = new PrintDocument();
printDoc.BeginPrint += PrintDoc_BeginPrint;
printDoc.PrintPage += PrintDoc_PrintPage;
}
// Yazdırmaya başlamadan önce indeks sıfırlanıyor
private void PrintDoc_BeginPrint(object sender, PrintEventArgs e)
{
currentImageIndex = 0;
}
// Her sayfa için çağrılan olay
private void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
string imagePath = imagesToPrint[currentImageIndex];
using (Image img = Image.FromFile(imagePath))
{
Rectangle bounds = e.PageBounds;
// Orijinal en-boy oranını koruyarak sayfaya ortala ve sığdır:
float ratio = Math.Min((float)bounds.Width / img.Width,
(float)bounds.Height / img.Height);
float w = img.Width * ratio;
float h = img.Height * ratio;
float x = (bounds.Width - w) / 2;
float y = (bounds.Height - h) / 2;
e.Graphics.DrawImage(img, x, y, w, h);
}
// Sonraki resim varsa yeni sayfa tetikle
currentImageIndex++;
e.HasMorePages = currentImageIndex < imagesToPrint.Count;
}
// Butona tıklanınca yazdırmayı başlat
private void PrintButton_Click(object sender, EventArgs e)
{
printDoc.PrinterSettings.PrinterName = "Microsoft Print To PDF";
printDoc.PrinterSettings.PrintToFile = true;
printDoc.PrinterSettings.PrintFileName = @"D:\output.pdf";
try
{
printDoc.Print();
MessageBox.Show("Tüm resimler başarıyla PDF'e yazdırıldı.",
"Başarılı", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Yazdırma sırasında hata:\n" + ex.Message,
"Hata", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
}
Özet akış:
imagesToPrint
listesine yazdırmak istediğiniz tüm resim dosyalarının yollarını ekleyin.
BeginPrint
’te liste indeksi sıfırlanır.
PrintPage
’te her bir resim, sayfa boyutuna göre oranlanıp ortalanarak çizilir.
e.HasMorePages
ile dizide resim kalıp kalmadığı kontrol edilir; kalmışsa yeni sayfa oluşturulur.
- Butona tıklayınca ayarlar yapılır ve
Print()
ile tüm sayfalar ardışık olarak PDF’e yazdırılır.
Bu yapı sayesinde, birden fazla resim tek bir PDF dosyasının ardışık sayfalarına sorunsuzca dönüştürülür.