该插件可实现JPG与PDF格式的互转。
MainForm.Designer.cs
using System.Windows.Forms;
namespace JpgToPdfConverter
{
partial class MainForm
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.btnSelectJpgFiles = new System.Windows.Forms.Button();
this.lstJpgFiles = new System.Windows.Forms.ListBox();
this.btnConvertJpgToPdf = new System.Windows.Forms.Button();
this.lblJpgStatus = new System.Windows.Forms.Label();
this.btnClearJpg = new System.Windows.Forms.Button();
this.btnSelectPdfFiles = new System.Windows.Forms.Button();
this.lstPdfFiles = new System.Windows.Forms.ListBox();
this.btnConvertPdfToJpg = new System.Windows.Forms.Button();
this.lblPdfStatus = new System.Windows.Forms.Label();
this.btnClearPdf = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPageJpgToPdf = new System.Windows.Forms.TabPage();
this.tabPagePdfToJpg = new System.Windows.Forms.TabPage();
this.label1 = new System.Windows.Forms.Label();
this.nudDpi = new System.Windows.Forms.NumericUpDown();
this.tabControl1.SuspendLayout();
this.tabPageJpgToPdf.SuspendLayout();
this.tabPagePdfToJpg.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudDpi)).BeginInit();
this.SuspendLayout();
//
// btnSelectJpgFiles
//
this.btnSelectJpgFiles.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSelectJpgFiles.Location = new System.Drawing.Point(5, 5);
this.btnSelectJpgFiles.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnSelectJpgFiles.Name = "btnSelectJpgFiles";
this.btnSelectJpgFiles.Size = new System.Drawing.Size(111, 24);
this.btnSelectJpgFiles.TabIndex = 0;
this.btnSelectJpgFiles.Text = "选择JPG文件";
this.btnSelectJpgFiles.UseVisualStyleBackColor = true;
this.btnSelectJpgFiles.Click += new System.EventHandler(this.btnSelectJpgFiles_Click);
//
// lstJpgFiles
//
this.lstJpgFiles.FormattingEnabled = true;
this.lstJpgFiles.HorizontalScrollbar = true;
this.lstJpgFiles.ItemHeight = 12;
this.lstJpgFiles.Location = new System.Drawing.Point(5, 34);
this.lstJpgFiles.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.lstJpgFiles.Name = "lstJpgFiles";
this.lstJpgFiles.Size = new System.Drawing.Size(388, 172);
this.lstJpgFiles.TabIndex = 1;
//
// btnConvertJpgToPdf
//
this.btnConvertJpgToPdf.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnConvertJpgToPdf.Location = new System.Drawing.Point(5, 210);
this.btnConvertJpgToPdf.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnConvertJpgToPdf.Name = "btnConvertJpgToPdf";
this.btnConvertJpgToPdf.Size = new System.Drawing.Size(111, 24);
this.btnConvertJpgToPdf.TabIndex = 2;
this.btnConvertJpgToPdf.Text = "转换为PDF";
this.btnConvertJpgToPdf.UseVisualStyleBackColor = true;
this.btnConvertJpgToPdf.Click += new System.EventHandler(this.btnConvertJpgToPdf_Click);
//
// lblJpgStatus
//
this.lblJpgStatus.AutoSize = true;
this.lblJpgStatus.Location = new System.Drawing.Point(122, 218);
this.lblJpgStatus.Name = "lblJpgStatus";
this.lblJpgStatus.Size = new System.Drawing.Size(0, 12);
this.lblJpgStatus.TabIndex = 3;
//
// btnClearJpg
//
this.btnClearJpg.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnClearJpg.Location = new System.Drawing.Point(281, 210);
this.btnClearJpg.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnClearJpg.Name = "btnClearJpg";
this.btnClearJpg.Size = new System.Drawing.Size(111, 24);
this.btnClearJpg.TabIndex = 4;
this.btnClearJpg.Text = "清除列表";
this.btnClearJpg.UseVisualStyleBackColor = true;
this.btnClearJpg.Click += new System.EventHandler(this.btnClearJpg_Click);
//
// btnSelectPdfFiles
//
this.btnSelectPdfFiles.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSelectPdfFiles.Location = new System.Drawing.Point(5, 5);
this.btnSelectPdfFiles.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnSelectPdfFiles.Name = "btnSelectPdfFiles";
this.btnSelectPdfFiles.Size = new System.Drawing.Size(111, 24);
this.btnSelectPdfFiles.TabIndex = 5;
this.btnSelectPdfFiles.Text = "选择PDF文件";
this.btnSelectPdfFiles.UseVisualStyleBackColor = true;
this.btnSelectPdfFiles.Click += new System.EventHandler(this.btnSelectPdfFiles_Click);
//
// lstPdfFiles
//
this.lstPdfFiles.FormattingEnabled = true;
this.lstPdfFiles.HorizontalScrollbar = true;
this.lstPdfFiles.ItemHeight = 12;
this.lstPdfFiles.Location = new System.Drawing.Point(5, 34);
this.lstPdfFiles.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.lstPdfFiles.Name = "lstPdfFiles";
this.lstPdfFiles.Size = new System.Drawing.Size(388, 136);
this.lstPdfFiles.TabIndex = 6;
//
// btnConvertPdfToJpg
//
this.btnConvertPdfToJpg.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnConvertPdfToJpg.Location = new System.Drawing.Point(5, 210);
this.btnConvertPdfToJpg.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnConvertPdfToJpg.Name = "btnConvertPdfToJpg";
this.btnConvertPdfToJpg.Size = new System.Drawing.Size(111, 24);
this.btnConvertPdfToJpg.TabIndex = 7;
this.btnConvertPdfToJpg.Text = "转换为JPG";
this.btnConvertPdfToJpg.UseVisualStyleBackColor = true;
this.btnConvertPdfToJpg.Click += new System.EventHandler(this.btnConvertPdfToJpg_Click);
//
// lblPdfStatus
//
this.lblPdfStatus.AutoSize = true;
this.lblPdfStatus.Location = new System.Drawing.Point(122, 218);
this.lblPdfStatus.Name = "lblPdfStatus";
this.lblPdfStatus.Size = new System.Drawing.Size(0, 12);
this.lblPdfStatus.TabIndex = 8;
//
// btnClearPdf
//
this.btnClearPdf.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnClearPdf.Location = new System.Drawing.Point(281, 210);
this.btnClearPdf.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnClearPdf.Name = "btnClearPdf";
this.btnClearPdf.Size = new System.Drawing.Size(111, 24);
this.btnClearPdf.TabIndex = 9;
this.btnClearPdf.Text = "清除列表";
this.btnClearPdf.UseVisualStyleBackColor = true;
this.btnClearPdf.Click += new System.EventHandler(this.btnClearPdf_Click);
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPageJpgToPdf);
this.tabControl1.Controls.Add(this.tabPagePdfToJpg);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(422, 277);
this.tabControl1.TabIndex = 10;
//
// tabPageJpgToPdf
//
this.tabPageJpgToPdf.Controls.Add(this.btnSelectJpgFiles);
this.tabPageJpgToPdf.Controls.Add(this.btnClearJpg);
this.tabPageJpgToPdf.Controls.Add(this.lstJpgFiles);
this.tabPageJpgToPdf.Controls.Add(this.lblJpgStatus);
this.tabPageJpgToPdf.Controls.Add(this.btnConvertJpgToPdf);
this.tabPageJpgToPdf.Location = new System.Drawing.Point(4, 22);
this.tabPageJpgToPdf.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPageJpgToPdf.Name = "tabPageJpgToPdf";
this.tabPageJpgToPdf.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPageJpgToPdf.Size = new System.Drawing.Size(414, 251);
this.tabPageJpgToPdf.TabIndex = 0;
this.tabPageJpgToPdf.Text = "JPG转PDF";
this.tabPageJpgToPdf.UseVisualStyleBackColor = true;
//
// tabPagePdfToJpg
//
this.tabPagePdfToJpg.Controls.Add(this.label1);
this.tabPagePdfToJpg.Controls.Add(this.nudDpi);
this.tabPagePdfToJpg.Controls.Add(this.btnSelectPdfFiles);
this.tabPagePdfToJpg.Controls.Add(this.lstPdfFiles);
this.tabPagePdfToJpg.Controls.Add(this.btnConvertPdfToJpg);
this.tabPagePdfToJpg.Controls.Add(this.btnClearPdf);
this.tabPagePdfToJpg.Controls.Add(this.lblPdfStatus);
this.tabPagePdfToJpg.Location = new System.Drawing.Point(4, 22);
this.tabPagePdfToJpg.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPagePdfToJpg.Name = "tabPagePdfToJpg";
this.tabPagePdfToJpg.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tabPagePdfToJpg.Size = new System.Drawing.Size(402, 241);
this.tabPagePdfToJpg.TabIndex = 1;
this.tabPagePdfToJpg.Text = "PDF转JPG";
this.tabPagePdfToJpg.UseVisualStyleBackColor = true;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(213, 180);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(101, 12);
this.label1.TabIndex = 11;
this.label1.Text = "输出图片DPI设置:";
//
// nudDpi
//
this.nudDpi.Location = new System.Drawing.Point(318, 176);
this.nudDpi.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.nudDpi.Maximum = new decimal(new int[] {
600,
0,
0,
0});
this.nudDpi.Minimum = new decimal(new int[] {
72,
0,
0,
0});
this.nudDpi.Name = "nudDpi";
this.nudDpi.Size = new System.Drawing.Size(74, 21);
this.nudDpi.TabIndex = 10;
this.nudDpi.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.nudDpi.Value = new decimal(new int[] {
300,
0,
0,
0});
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(422, 277);
this.Controls.Add(this.tabControl1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "JPG/PDF转换器 作者: 山水(qq443440204)";
this.tabControl1.ResumeLayout(false);
this.tabPageJpgToPdf.ResumeLayout(false);
this.tabPageJpgToPdf.PerformLayout();
this.tabPagePdfToJpg.ResumeLayout(false);
this.tabPagePdfToJpg.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.nudDpi)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnSelectJpgFiles;
private System.Windows.Forms.ListBox lstJpgFiles;
private System.Windows.Forms.Button btnConvertJpgToPdf;
private System.Windows.Forms.Label lblJpgStatus;
private System.Windows.Forms.Button btnClearJpg;
private System.Windows.Forms.Button btnSelectPdfFiles;
private System.Windows.Forms.ListBox lstPdfFiles;
private System.Windows.Forms.Button btnConvertPdfToJpg;
private System.Windows.Forms.Label lblPdfStatus;
private System.Windows.Forms.Button btnClearPdf;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPageJpgToPdf;
private System.Windows.Forms.TabPage tabPagePdfToJpg;
private System.Windows.Forms.NumericUpDown nudDpi;
private System.Windows.Forms.Label label1;
}
}
MainForm.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using static System.Net.Mime.MediaTypeNames;
using Image = System.Drawing.Image;
namespace JpgToPdfConverter
{
public partial class MainForm : Form
{
// 存储选择的文件路径
private List<string> selectedJpgFiles = new List<string>();
private List<string> selectedPdfFiles = new List<string>();
public MainForm()
{
InitializeComponent();
}
#region JPG转PDF功能
// 选择JPG文件按钮点击事件
private void btnSelectJpgFiles_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "JPG文件 (*.jpg;*.jpeg)|*.jpg;*.jpeg|所有文件 (*.*)|*.*";
openFileDialog.Multiselect = true;
openFileDialog.Title = "选择JPG文件";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
selectedJpgFiles.AddRange(openFileDialog.FileNames);
UpdateJpgFileList();
}
}
}
// 更新JPG文件列表显示
private void UpdateJpgFileList()
{
lstJpgFiles.Items.Clear();
foreach (string file in selectedJpgFiles)
{
lstJpgFiles.Items.Add(Path.GetFileName(file));
}
UpdateJpgStatus($"已选择 {selectedJpgFiles.Count} 个文件");
}
// 更新JPG转换状态
private void UpdateJpgStatus(string message)
{
lblJpgStatus.Text = message;
}
// 清除JPG文件列表
private void btnClearJpg_Click(object sender, EventArgs e)
{
selectedJpgFiles.Clear();
UpdateJpgFileList();
}
// JPG转PDF按钮点击事件
private void btnConvertJpgToPdf_Click(object sender, EventArgs e)
{
if (selectedJpgFiles.Count == 0)
{
MessageBox.Show("请先选择JPG文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = "PDF文件 (*.pdf)|*.pdf|所有文件 (*.*)|*.*";
saveFileDialog.Title = "保存PDF文件";
saveFileDialog.FileName = "转换结果.pdf";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
UpdateJpgStatus("正在转换...");
Cursor = Cursors.WaitCursor;
ConvertJpgToPdf(selectedJpgFiles, saveFileDialog.FileName);
UpdateJpgStatus("转换完成!");
MessageBox.Show($"PDF文件已保存至:{saveFileDialog.FileName}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
UpdateJpgStatus("转换失败!");
MessageBox.Show($"转换过程中发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor = Cursors.Default;
}
}
}
}
// JPG转PDF核心方法
//private void ConvertJpgToPdf(List<string> jpgFiles, string pdfPath)
//{
// using (PdfDocument pdf = new PdfDocument())
// {
// foreach (string jpgFile in jpgFiles)
// {
// try
// {
// // 获取图像尺寸
// using (Image image = Image.FromFile(jpgFile))
// {
// PdfPage page = pdf.AddPage();
// page.Width = image.Width;
// page.Height = image.Height;
// }
// // 从文件加载图像到PDF
// PdfPage pdfPage = pdf.Pages[pdf.Pages.Count - 1];
// XGraphics gfx = XGraphics.FromPdfPage(pdfPage);
// XImage xImage = XImage.FromFile(jpgFile);
// gfx.DrawImage(xImage, 0, 0);
// }
// catch (Exception ex)
// {
// MessageBox.Show($"处理文件 {Path.GetFileName(jpgFile)} 时出错:{ex.Message}", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// }
// }
// pdf.Save(pdfPath);
// }
//}
#endregion
private void ConvertJpgToPdf(List<string> jpgFiles, string pdfPath)
{
using (PdfDocument pdf = new PdfDocument())
{
foreach (string jpgFile in jpgFiles)
{
using (Image image = Image.FromFile(jpgFile))
{
PdfPage page = pdf.AddPage();
// 直接按像素数设置页面尺寸(1点=1像素)
page.Width = image.Width;
page.Height = image.Height;
XGraphics gfx = XGraphics.FromPdfPage(page);
XImage xImage = XImage.FromFile(jpgFile);
gfx.DrawImage(xImage, 0, 0, page.Width, page.Height);
}
}
pdf.Save(pdfPath);
}
}
#region PDF转JPG功能
// 选择PDF文件按钮点击事件
private void btnSelectPdfFiles_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "PDF文件 (*.pdf)|*.pdf|所有文件 (*.*)|*.*";
openFileDialog.Multiselect = true;
openFileDialog.Title = "选择PDF文件";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
selectedPdfFiles.AddRange(openFileDialog.FileNames);
UpdatePdfFileList();
}
}
}
// 更新PDF文件列表显示
private void UpdatePdfFileList()
{
lstPdfFiles.Items.Clear();
foreach (string file in selectedPdfFiles)
{
lstPdfFiles.Items.Add(Path.GetFileName(file));
}
UpdatePdfStatus($"已选择 {selectedPdfFiles.Count} 个文件");
}
// 更新PDF转换状态
private void UpdatePdfStatus(string message)
{
lblPdfStatus.Text = message;
}
// 清除PDF文件列表
private void btnClearPdf_Click(object sender, EventArgs e)
{
selectedPdfFiles.Clear();
UpdatePdfFileList();
}
// PDF转JPG按钮点击事件
private void btnConvertPdfToJpg_Click(object sender, EventArgs e)
{
if (selectedPdfFiles.Count == 0)
{
MessageBox.Show("请先选择PDF文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
folderBrowserDialog.Description = "选择保存JPG文件的文件夹";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
try
{
UpdatePdfStatus("正在转换...");
Cursor = Cursors.WaitCursor;
int dpi = (int)nudDpi.Value;
ConvertPdfToJpg(selectedPdfFiles, folderBrowserDialog.SelectedPath, dpi);
UpdatePdfStatus("转换完成!");
MessageBox.Show($"JPG文件已保存至:{folderBrowserDialog.SelectedPath}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
UpdatePdfStatus("转换失败!");
MessageBox.Show($"转换过程中发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor = Cursors.Default;
}
}
}
}
// PDF转JPG核心方法
private void ConvertPdfToJpg(List<string> pdfFiles, string outputFolder, int dpi)
{
foreach (string pdfFile in pdfFiles)
{
try
{
string fileNameWithoutExt = Path.GetFileNameWithoutExtension(pdfFile);
string fileOutputFolder = Path.Combine(outputFolder, fileNameWithoutExt);
// 为每个PDF创建单独的文件夹
Directory.CreateDirectory(fileOutputFolder);
using (PdfiumViewer.PdfDocument document = PdfiumViewer.PdfDocument.Load(pdfFile))
{
int pageCount = document.PageCount;
for (int i = 0; i < pageCount; i++)
{
string outputPath = Path.Combine(fileOutputFolder, $"{fileNameWithoutExt}_第{i + 1}页.jpg");
using (Bitmap image = (Bitmap)document.Render(i, dpi, dpi, false))
{
image.Save(outputPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"处理文件 {Path.GetFileName(pdfFile)} 时出错:{ex.Message}", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
}
}
#endregion
}
}
Program.cs
using System;
using System.Windows.Forms;
namespace JpgToPdfConverter
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}