在实际项目中,打印的纸张的默认一般都是纵向,但有一些是横向,但发现在一些很特殊的情况下,即使在打印之前设置了横向,但实际打印依然是纵向。目前发现这个问题有两个原因。
1 是纸张名称不对,会导致横向设置不起作用。
例如,设置为A4纸,但实际没有这种类型的纸张,或者有名称不一样,偶尔会导致即使设置了横向,但实际打印依然是纵向。也就是横向设置不起作用。
private PaperSize GetPaperSize(PrintDocument pDoc, string paperName, string pageType, Size pageSize)
{
bool fitPaper = false;
PaperSize sizeFit = null;
PaperSize sizeA4 = null;
PaperSize sizeCustomMin = null;
int minPiancha = 300;
Size pageSizeTmp = new Size(pageSize.Width, pageSize.Height);
//把毫米转为(以0.001英寸为单位)的数据,本来需要乘以10,但PaperSize的单位是百分之一英寸,又需要除以10,因此不处理
Size pageSizeNew = PrinterUnitConvert.Convert(pageSizeTmp, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.ThousandthsOfAnInch);
bool isCustomPaperSize = pageType== PaperKind.Custom.ToString();
//获取打印机支持的所有纸张类型
foreach (PaperSize size in pDoc.PrinterSettings.PaperSizes)
{
//看该打印机是否有我们需要的纸张类型
string PaperName = size.PaperName;
if (size.Kind.ToString() == pageType)
{
if(size.PaperName.IndexOf(paperName) >= 0)
{
fitPaper = true;
sizeFit = size;
return sizeFit;
}
if(isCustomPaperSize && size.Kind== PaperKind.Custom)
{
int heightPiancha = Math.Abs(size.Height - pageSizeNew.Height);
int widthPiancha = Math.Abs(size.Width - pageSizeNew.Width);
int Piancha = heightPiancha * heightPiancha + widthPiancha * widthPiancha;
if (Piancha <= minPiancha)
{
minPiancha = Piancha;
sizeCustomMin = size;
}
}
}
if (size.Kind == PaperKind.A4)
{
sizeA4 = size;
}
}
if (!fitPaper)
{
if(isCustomPaperSize && sizeCustomMin != null)
{
if(minPiancha<50)
{
LogInfo.Error("未找到自定义纸张类型,使用找到的最接近的纸张PaperName=" + paperName + ",使用Custom" + sizeCustomMin);
return sizeCustomMin;
}
else
{
LogInfo.Error("未找到自定义纸张类型,使用找到的最接近的纸张PaperName=" + paperName + ",minPiancha=" + minPiancha);
}
}
if (sizeA4 == null)
{
// Size pageSize = doc.PageSize;//纸张大小,单位毫米
PaperSize sizeCustom = new PaperSize("Custom", pageSizeNew.Width, pageSizeNew.Height);
LogInfo.Error("未找到纸张类型PaperName=" + paperName + ",使用Custom" + sizeCustom);
return sizeCustom;
}
else
{
LogInfo.Error("未找到纸张类型PaperName=" + paperName + ",使用sizeA4" + sizeA4);
return sizeA4;
}
}
System.Diagnostics.Debug.Assert(sizeFit != null);
return sizeFit;
}
2 动态修改了打印机,也就是在弹出打印对话框时,动态修改了打印机,也会导致整个问题。
修改为其他的打印机:如下图