我在我的一个PdfiumViewer应用程序中使用C#。这是我用来打印的代码的一部分:
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毫米宽),并且是在我的应用程序之外创建的,但要考虑到这个宽度。
如果我从Acrobat或Foxit (直接或通过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)),就像在这个SO answer中所建议的那样,没有起作用--打印输出仍然被扭曲了。此外,如果有更多的内容比在这种具体情况下,打印内容将被压缩。打印出来的高度比我在问题中提到的文件稍大一点。
我猜我做错了什么,但我不知道是什么。我是否应该将页面高度设置为某个值?我应该取消它,让它倒退到任何默认值吗?如果是的话,我该怎么做呢?
发布于 2022-04-24 12:51:11
我设法以以下方式解决了这个问题(虽然我不确定这是否是最好的方法)。
首先,我想检查变量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打印机,80毫米卷纸宽度):
printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("customsize", Convert.ToInt32(1.4 * docWidth), Convert.ToInt32(1.4 * docHeight));那1.4位是我在经历了几次尝试和错误之后决定的。
同样,我意识到这很可能是--而不是--解决这个问题的最佳方法,但是它确实解决了这个特定的问题。
https://stackoverflow.com/questions/71856387
复制相似问题