如何用Pdfium在VB.NET中打印实际尺寸的A6标签(去除空白)
解决Pdfium打印A4中嵌入的A6标签实际尺寸打印问题
我从第三方获取的运单标签是A6尺寸,但被嵌入在A4格式的PDF页面中。我用VB.NET脚本通过API获取文件,希望用Pdfium在无交互、无预览的情况下打印。需求是把A4页面左上角的A6标签按实际尺寸打印到A6标签打印机,但使用CutMargin模式时,整个A4页面会被压缩到A6标签上,请问如何去除空白或实现实际尺寸打印?
原代码:
Dim document As PdfDocument = PdfDocument.Load(pdfPath) 'Using document As PdfDocument = PdfDocument.Load(pdfPath) ' Erstelle einen neuen PrintDocument Using printDoc = document.CreatePrintDocument(PdfiumViewer.PdfPrintMode.CutMargin) ' Setze den Drucker printDoc.PrinterSettings.PrinterName = printerName printDoc.Print() End Using
解决方案思路
CutMargin模式会将整个PDF页面缩放到打印介质尺寸,这不符合需求。我们需要指定打印A4页面中的A6区域,并使用ActualSize模式保证尺寸准确,或者先裁剪PDF生成纯A6页面再打印。
方法一:打印时直接指定裁剪区域
通过设置打印文档的可打印区域,只选取A4页面左上角的A6部分,同时强制使用A6纸张尺寸:
Dim document As PdfDocument = PdfDocument.Load(pdfPath) Using printDoc = document.CreatePrintDocument(PdfiumViewer.PdfPrintMode.ActualSize) printDoc.PrinterSettings.PrinterName = printerName ' 转换A6尺寸到PDF点(1mm≈2.83465点) Dim a6WidthPoints = 105 * 2.83465 Dim a6HeightPoints = 148 * 2.83465 Dim originalPage = document.Pages(0) ' PDF坐标原点在左下角,所以左上角区域的Y范围是 原页面高度 - A6高度 到 原页面高度 Dim printArea = New RectangleF(0, originalPage.Height - a6HeightPoints, a6WidthPoints, a6HeightPoints) ' 设置可打印区域为左上角的A6范围 printDoc.DefaultPageSettings.PrintableArea = printArea ' 强制打印机使用A6纸张 printDoc.DefaultPageSettings.PaperSize = New PaperSize(PaperName.A6, a6WidthPoints, a6HeightPoints) printDoc.Print() End Using
方法二:先裁剪PDF生成A6文档再打印
先从原A4页面中裁剪出左上角的A6区域,生成新的PDF文档后再打印,避免打印时的区域计算误差:
Dim originalDoc As PdfDocument = PdfDocument.Load(pdfPath) Using newDoc = New PdfDocument() Dim originalPage = originalDoc.Pages(0) Dim a6Width = 105 * 2.83465 Dim a6Height = 148 * 2.83465 ' 裁剪原页面的左上角A6区域(PDF坐标:左下为原点,所以Y轴从原页面高度减A6高度开始) Dim cropRect = New PdfRectangle(0, originalPage.Height - a6Height, a6Width, originalPage.Height) newDoc.AddPage(originalPage, cropRect) ' 打印新生成的A6文档 Using printDoc = newDoc.CreatePrintDocument(PdfiumViewer.PdfPrintMode.ActualSize) printDoc.PrinterSettings.PrinterName = printerName printDoc.DefaultPageSettings.PaperSize = New PaperSize(PaperName.A6, a6Width, a6Height) printDoc.Print() End Using End Using originalDoc.Dispose()
注意事项
- 确认目标打印机支持A6纸张,且已正确配置(若代码中强制指定纸张尺寸,需确保打印机能识别)。
- 若运单标签不在第一页,调整代码中的页面索引(
document.Pages(0))即可。 - PDF的坐标系统以页面左下角为原点,所以计算裁剪区域的Y坐标时需要用原页面高度减去A6高度,才能定位到左上角区域。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

