如何将给定的iText表格代码转换为带按钮点击的WinForms程序?
问题描述
这段iText代码看起来很简单,但我试了各种方法都没搞定——我不想做成控制台应用,也不想只写个单纯的类,更不想搞需要传参的命令行程序。我做过不少窗体和控制台应用,肯定是漏了某个简单的点,求帮忙解答。查了很多资料也没找到合适的答案。
原始代码
namespace iText.Samples.Sandbox.Tables { public class SimpleTable { public static readonly string DEST = "results/sandbox/tables/simple_table.pdf"; public static void Main(String[] args) { FileInfo file = new FileInfo(DEST); file.Directory.Create(); new SimpleTable().ManipulatePdf(DEST); } private void ManipulatePdf(String dest) { PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest)); Document doc = new Document(pdfDoc); Table table = new Table(UnitValue.CreatePercentArray(8)).UseAllAvailableWidth(); for (int i = 0; i < 16; i++) { table.AddCell("hi"); } doc.Add(table); doc.Close(); } } }
解决方案
核心是把生成PDF的逻辑从控制台入口里抽出来,改成可在任意类型应用中调用的公共方法,比如在WinForms/WPF这类窗体应用里通过按钮点击触发。
调整后的通用工具类
先把代码改成通用的工具类,让生成逻辑能被外部调用:
using System.IO; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element; using iText.Layout.Properties; namespace YourAppNamespace { public class PdfTableGenerator { // 改成公共方法,允许外部传入输出路径 public void GenerateSimpleTablePdf(string outputPath) { // 确保输出目录存在 FileInfo file = new FileInfo(outputPath); file.Directory.Create(); // 用using自动释放资源,避免内存泄漏 using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outputPath))) using (Document doc = new Document(pdfDoc)) { Table table = new Table(UnitValue.CreatePercentArray(8)).UseAllAvailableWidth(); for (int i = 0; i < 16; i++) { table.AddCell("hi"); } doc.Add(table); } } } }
在WinForms中调用示例
比如在窗体里加一个按钮,点击后生成PDF:
private void btnGeneratePdf_Click(object sender, EventArgs e) { // 可以让用户选择保存路径,或者固定到桌面等位置 string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "simple_table.pdf"); PdfTableGenerator generator = new PdfTableGenerator(); generator.GenerateSimpleTablePdf(savePath); MessageBox.Show("PDF已生成,保存在桌面!"); }
关键改动点
- 移除了控制台专用的
Main方法,把生成逻辑改成公共方法 - 使用
using语句自动释放PDF相关资源,避免内存泄漏 - 允许外部传入输出路径,适配不同应用场景的需求
这样不管是WinForms、WPF还是其他类型的应用,都能直接调用这个工具类生成PDF,完全不需要依赖控制台或命令行参数。
内容的提问来源于stack exchange,提问作者Garym
相关产品推荐
相关产品推荐

