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 毫米宽度)的格式,并且是在我的应用程序之外创建的,但考虑到该宽度。

如果我从 Adob​​e 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)),如 中所建议的那样,但没有奏效 - 打印输出仍然失真。此外,如果内容多于此特定情况,打印的内容将被压缩。打印输出的高度比我在问题中提到的文件大一点。

我猜我做错了什么,但我不知道是什么。我应该将页面高度设置为某个值吗?我应该取消设置,让它回退到默认值吗?如果是这样,我应该怎么做?

我已经设法通过以下方式解决了这个问题(虽然我不确定这是否是最好的方法)。

首先,我想检查变量 documentprintDocument 的属性/内容(请参阅我的问题以了解它们是如何初始化的)。我通过这样做实现了这一目标:

    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;

最后,我用docWidthdocHeight改变了纸张尺寸,使其符合我的需要(热敏POS打印机,80mm卷纸宽度):

    printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("customsize", Convert.ToInt32(1.4 * docWidth), Convert.ToInt32(1.4 * docHeight));

1.4 位是我经过一系列反复试验后确定的。

同样,我知道这很可能不是普遍解决问题的最佳方法,但它确实解决了这个特定问题。