如何消除PrintDocument转PDF的多余空白或转存为无空白图像?
解决PrintDocument转PDF/JPG时的多余空白问题
问题背景
基于购物车和结账数据开发支付收据功能,已实现动态创建PrintDocument并转存PDF,同时支持热敏小票打印机直接打印(功能正常)。业务需补充两个选项:
- 选项a:用热敏小票打印机打印账单(已实现)
- 选项b:将账单发送至客户WhatsApp
当前遇到的问题:
- 使用系统内置PDF打印机转存时,尽管指定了250宽、700高的纸张尺寸,仍生成全A4尺寸PDF,右侧和底部存在大量空白
- 尝试过在线JPG打印工具,但要么收费、带水印,要么生成
.prn文件需手动操作,无法满足自动生成需求
需求:解决以下任一问题即可
- 消除PDF中的多余空白,便于直接分享
- 将
PrintDocument转存为无多余空白的JPG等图像文件,全程无需用户干预
方案一:消除PDF转存时的多余空白
核心是确保PrintDocument的自定义纸张设置完全覆盖PDF打印机的默认配置,避免系统A4尺寸强制覆盖。
代码示例(C#)
// 初始化PrintDocument实例 PrintDocument pd = new PrintDocument(); // 定义自定义纸张尺寸(单位:百分之一英寸) PaperSize customReceiptSize = new PaperSize("CustomReceipt", 250, 700); customReceiptSize.RawKind = (int)PaperKind.Custom; pd.DefaultPageSettings.PaperSize = customReceiptSize; // 设置边距为0(根据实际收据内容微调,避免内容被裁剪) pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); // 指定PDF打印机(以Microsoft Print to PDF为例) pd.PrinterSettings.PrinterName = "Microsoft Print to PDF"; // 禁用自动纸张来源选择,强制使用自定义尺寸 pd.DefaultPageSettings.PaperSource = pd.DefaultPageSettings.PaperSources[0]; // 绑定打印内容绘制事件(确保内容适配自定义尺寸) pd.PrintPage += (sender, e) => { // 绘制收据内容,严格控制在自定义纸张范围内 e.Graphics.DrawString("支付收据", new Font("Arial", 12), Brushes.Black, new PointF(10, 10)); // 补充其他收据内容绘制逻辑... }; // 自动转存为PDF pd.PrintToFile(@"C:\Receipts\user_receipt.pdf");
关键注意事项
- 必须设置
PaperSize.RawKind = (int)PaperKind.Custom,否则系统会忽略自定义尺寸 - 确保PDF打印机支持自定义纸张尺寸(主流PDF打印驱动均支持)
- 绘制内容时严格贴合自定义纸张边界,避免内容仅占小区域导致空白残留
方案二:将PrintDocument转存为无空白的JPG图像
绕过打印驱动,直接将收据内容绘制到Bitmap对象生成图像,全程自动执行,无第三方工具依赖。
代码示例(C#)
// 定义收据尺寸(与PrintDocument统一单位:百分之一英寸) int receiptWidth = 250; int receiptHeight = 700; // 创建对应尺寸的Bitmap画布 Bitmap receiptBitmap = new Bitmap(receiptWidth, receiptHeight); // 获取Graphics对象用于绘制内容 using (Graphics g = Graphics.FromImage(receiptBitmap)) { // 配置高质量绘制参数 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; g.Clear(Color.White); // 设置白色背景 // 绘制收据内容(与PrintDocument的PrintPage逻辑一致) g.DrawString("支付收据", new Font("Arial", 12), Brushes.Black, new PointF(10, 10)); // 补充其他收据内容绘制逻辑... } // 保存为高质量JPG EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L); ImageCodecInfo jpgCodec = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == ImageFormat.Jpeg.Guid); receiptBitmap.Save(@"C:\Receipts\user_receipt.jpg", jpgCodec, encoderParams); // 释放资源 receiptBitmap.Dispose();
方案优势
- 完全无第三方工具依赖,无水印、无收费问题
- 全程自动执行,无需用户交互
- 生成的图像尺寸严格匹配收据大小,无多余空白
内容的提问来源于stack exchange,提问作者Ankit Srivastava
相关产品推荐
相关产品推荐

