首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pdfium拉伸或压缩打印文档

Pdfium拉伸或压缩打印文档
EN

Stack Overflow用户
提问于 2022-04-13 11:01:31
回答 1查看 366关注 0票数 0

我在我的一个PdfiumViewer应用程序中使用C#。这是我用来打印的代码的一部分:

代码语言:javascript
复制
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查看器打印它们,则打印的内容与在适当的查看器中查看文档时所看到的相同。您可以在下面的图像中看到不同之处。

我试着简化代码,并将其转化为这个,仅仅是为了测试,但是最终结果是打印过程中相同的扩展文档。

代码语言:javascript
复制
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中所建议的那样,没有起作用--打印输出仍然被扭曲了。此外,如果有更多的内容比在这种具体情况下,打印内容将被压缩。打印出来的高度比我在问题中提到的文件稍大一点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-24 12:51:11

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

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

代码语言:javascript
复制
    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变量中提取文档维度,我如下所示:

代码语言:javascript
复制
    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打印机,80毫米卷纸宽度):

代码语言:javascript
复制
    printDocument.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("customsize", Convert.ToInt32(1.4 * docWidth), Convert.ToInt32(1.4 * docHeight));

那1.4位是我在经历了几次尝试和错误之后决定的。

同样,我意识到这很可能是--而不是--解决这个问题的最佳方法,但是它确实解决了这个特定的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71856387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档