Pdfium 在打印时拉伸或挤压文档
Pdfium stretches or squashes document on printing
我在我的一个 C# 应用程序中使用 PdfiumViewer。这是我用于打印的代码的一部分:
public documentCopies = 2; // here for example's sake, in the app it's set in another part of the code
private void Completed(string newDocName)
{
short numCopies = 1;
if (documentCopies > 0)
{
numCopies = Convert.ToInt16(documentCopies);
}
var path = localDocLocation + "\" + newDocName;
string extension = GetExtension(newDocName).ToLower();
if (extension == "pdf")
{
using (var document = PdfiumViewer.PdfDocument.Load(path))
{
using (var printDocument = document.CreatePrintDocument())
{
// check the current default printer
System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings();
string defaultPrinterName = settings.PrinterName;
printDocument.OriginAtMargins = true;
printDocument.PrinterSettings.PrintFileName = newDocName;
printDocument.PrinterSettings.Copies = numCopies;
printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
printDocument.PrinterSettings.PrinterName = printerName;
try
{
printDocument.Print();
} catch (Exception pex)
{
MessageBox.Show(pex.Message.ToString()));
printDocument.PrinterSettings.PrinterName = defaultPrinterName;
try
{
printDocument.Print();
} catch(Exception pex2)
{
MessageBox.Show(pex2.Message.ToString());
}
}
}
}
}
else
{
// do smth else
}
}
打印的 PDF 文档采用适合热敏打印机(80 毫米宽度)的格式,并且是在我的应用程序之外创建的,但考虑到该宽度。
如果我从 Adobe Acrobat 或 Foxit Reader(直接或通过 CLI)或任何其他 PDF 查看器打印它们,打印的内容与我在适当的查看器中查看文档时看到的相同.您可以在下图中看到差异。
我试过简化代码,并将其变成这样,只是为了测试,但最终结果是一样的——在打印时拉伸了文档。
private void Completed(string newDocName)
{
var path = localDocLocation + "\" + newDocName;
using (var document = PdfiumViewer.PdfDocument.Load(path))
{
using (var printDocument = document.CreatePrintDocument())
{
printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
printDocument.Print();
}
}
}
尝试强制缩小到边距 (document.CreatePrintDocument(PdfiumViewer.PdfPrintMode.ShrinkToMargin)
),如 中所建议的那样,但没有奏效 - 打印输出仍然失真。此外,如果内容多于此特定情况,打印的内容将被压缩。打印输出的高度比我在问题中提到的文件大一点。
我猜我做错了什么,但我不知道是什么。我应该将页面高度设置为某个值吗?我应该取消设置,让它回退到默认值吗?如果是这样,我应该怎么做?
我已经设法通过以下方式解决了这个问题(虽然我不确定这是否是最好的方法)。
首先,我想检查变量 document
和 printDocument
的属性/内容(请参阅我的问题以了解它们是如何初始化的)。我通过这样做实现了这一目标:
string tempConvert = JsonConvert.SerializeObject(document);
dynamic docProperties = JsonConvert.DeserializeObject(tempConvert);
MessageBox.Show(docProperties.ToString());
string tmpProp = "";
foreach (var iProp in printDocument.GetType().GetProperties())
{
tmpProp += iProp.Name + ":" + iProp.GetValue(printDocument, null) + "\r\n";
}
MessageBox.Show(tmpProp.Trim());
第一个 - document
- 包含有关我要打印的文档尺寸的信息,而 printDocument
包含有关当前打印机设置(纸张方向、页边距、纸张大小)的各种信息等)。
我的下一步是从 docProperties
变量中提取文档维度,我是这样做的:
string[] docDimensions = docProperties.PageSizes[0].ToString().Split(' ');
char[] toTrim = { ' ', ',' };
int docWidth = Convert.ToInt32(FormatNumber(docDimensions[0].Trim(toTrim)));
int docHeight = Convert.ToInt32(FormatNumber(docDimensions[1].Trim(toTrim))) + 1;
最后,我用docWidth
和docHeight
改变了纸张尺寸,使其符合我的需要(热敏POS打印机,80mm卷纸宽度):
printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("customsize", Convert.ToInt32(1.4 * docWidth), Convert.ToInt32(1.4 * docHeight));
1.4 位是我经过一系列反复试验后确定的。
同样,我知道这很可能不是普遍解决问题的最佳方法,但它确实解决了这个特定问题。
我在我的一个 C# 应用程序中使用 PdfiumViewer。这是我用于打印的代码的一部分:
public documentCopies = 2; // here for example's sake, in the app it's set in another part of the code
private void Completed(string newDocName)
{
short numCopies = 1;
if (documentCopies > 0)
{
numCopies = Convert.ToInt16(documentCopies);
}
var path = localDocLocation + "\" + newDocName;
string extension = GetExtension(newDocName).ToLower();
if (extension == "pdf")
{
using (var document = PdfiumViewer.PdfDocument.Load(path))
{
using (var printDocument = document.CreatePrintDocument())
{
// check the current default printer
System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings();
string defaultPrinterName = settings.PrinterName;
printDocument.OriginAtMargins = true;
printDocument.PrinterSettings.PrintFileName = newDocName;
printDocument.PrinterSettings.Copies = numCopies;
printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
printDocument.PrinterSettings.PrinterName = printerName;
try
{
printDocument.Print();
} catch (Exception pex)
{
MessageBox.Show(pex.Message.ToString()));
printDocument.PrinterSettings.PrinterName = defaultPrinterName;
try
{
printDocument.Print();
} catch(Exception pex2)
{
MessageBox.Show(pex2.Message.ToString());
}
}
}
}
}
else
{
// do smth else
}
}
打印的 PDF 文档采用适合热敏打印机(80 毫米宽度)的格式,并且是在我的应用程序之外创建的,但考虑到该宽度。
如果我从 Adobe Acrobat 或 Foxit Reader(直接或通过 CLI)或任何其他 PDF 查看器打印它们,打印的内容与我在适当的查看器中查看文档时看到的相同.您可以在下图中看到差异。
我试过简化代码,并将其变成这样,只是为了测试,但最终结果是一样的——在打印时拉伸了文档。
private void Completed(string newDocName)
{
var path = localDocLocation + "\" + newDocName;
using (var document = PdfiumViewer.PdfDocument.Load(path))
{
using (var printDocument = document.CreatePrintDocument())
{
printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
printDocument.Print();
}
}
}
尝试强制缩小到边距 (document.CreatePrintDocument(PdfiumViewer.PdfPrintMode.ShrinkToMargin)
),如
我猜我做错了什么,但我不知道是什么。我应该将页面高度设置为某个值吗?我应该取消设置,让它回退到默认值吗?如果是这样,我应该怎么做?
我已经设法通过以下方式解决了这个问题(虽然我不确定这是否是最好的方法)。
首先,我想检查变量 document
和 printDocument
的属性/内容(请参阅我的问题以了解它们是如何初始化的)。我通过这样做实现了这一目标:
string tempConvert = JsonConvert.SerializeObject(document);
dynamic docProperties = JsonConvert.DeserializeObject(tempConvert);
MessageBox.Show(docProperties.ToString());
string tmpProp = "";
foreach (var iProp in printDocument.GetType().GetProperties())
{
tmpProp += iProp.Name + ":" + iProp.GetValue(printDocument, null) + "\r\n";
}
MessageBox.Show(tmpProp.Trim());
第一个 - document
- 包含有关我要打印的文档尺寸的信息,而 printDocument
包含有关当前打印机设置(纸张方向、页边距、纸张大小)的各种信息等)。
我的下一步是从 docProperties
变量中提取文档维度,我是这样做的:
string[] docDimensions = docProperties.PageSizes[0].ToString().Split(' ');
char[] toTrim = { ' ', ',' };
int docWidth = Convert.ToInt32(FormatNumber(docDimensions[0].Trim(toTrim)));
int docHeight = Convert.ToInt32(FormatNumber(docDimensions[1].Trim(toTrim))) + 1;
最后,我用docWidth
和docHeight
改变了纸张尺寸,使其符合我的需要(热敏POS打印机,80mm卷纸宽度):
printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("customsize", Convert.ToInt32(1.4 * docWidth), Convert.ToInt32(1.4 * docHeight));
1.4 位是我经过一系列反复试验后确定的。
同样,我知道这很可能不是普遍解决问题的最佳方法,但它确实解决了这个特定问题。