在 C# 中打印由字体生成的 Pdf 文档条码

Posted

技术标签:

【中文标题】在 C# 中打印由字体生成的 Pdf 文档条码【英文标题】:Print Pdf document Barcode generated by font in C# 【发布时间】:2015-12-23 11:26:13 【问题描述】:

我有一个小型应用程序,我可以在其中执行 pdf 文档打印。 一切都很好,除了从字体生成条形码的文件,这部分页面看起来变形(条形码中间的条形码文本)。 有人知道为什么会发生这种情况,有什么方法可以解决这个问题吗?

我的代码:

public static void PrindDocument(string filePath, PrinterSetting printerSetting, int copies)
        

            SpirePdf.PdfDocument doc = new SpirePdf.PdfDocument();
            doc.LoadFromFile(filePath);
            PrintDialog dialogPrint = new PrintDialog();
            dialogPrint.AllowPrintToFile = true;
            dialogPrint.AllowSomePages = true;
            dialogPrint.PrinterSettings.MinimumPage = 1;
            dialogPrint.PrinterSettings.MaximumPage = doc.Pages.Count;
            dialogPrint.PrinterSettings.FromPage = 1;
            dialogPrint.PrinterSettings.ToPage = doc.Pages.Count;
            dialogPrint.PrinterSettings.Copies = (short)copies;

            var paperSize = dialogPrint.PrinterSettings.PaperSizes.Cast<PaperSize>().FirstOrDefault(e => e.PaperName == printerSetting.Pageformat);
            dialogPrint.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;
            doc.PrintFromPage = dialogPrint.PrinterSettings.FromPage;
            doc.PrintToPage = dialogPrint.PrinterSettings.ToPage;
            doc.PrinterName = printerSetting.Printer;
            PrintDocument printDoc = doc.PrintDocument;
            printDoc.DefaultPageSettings.PaperSize = paperSize;
            printDoc.PrinterSettings.Copies = (short)copies;
            dialogPrint.Document = printDoc;
            printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();
            printDoc.Print();

        

我尝试了另一种方法,但该方法的作用完全相同:

private void SendToPrinter()
    
        ProcessStartInfo info = new ProcessStartInfo();
        info.Verb = "print";
        info.FileName = @"c:\output.pdf";
        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;

        Process p = new Process();
        p.StartInfo = info;
        p.Start();

        p.WaitForInputIdle();
        System.Threading.Thread.Sleep(3000);
        if (false == p.CloseMainWindow())
            p.Kill();
    

可在此处找到 PDF 文件示例: https://www.dropbox.com/sh/7vhnyji10f4ekx3/AACI2XtG3PoiHzGzoJNbH_k7a?dl=0

另外我想提一下,当我通过正常方式打印这个文件时,比如用谷歌浏览器打开并打印,它看起来没问题。

【问题讨论】:

我不知道您的问题是与生成条形码还是与打印有关。条形码在 PDF 中看起来不错,但在打印时却很奇怪? 是的,它们看起来不错,这只是亚马逊生成的发票。我稍后会尝试上传此类文件。 这是一个此类文件的示例,其中两个条形码在打印后都不起作用。filedropper.com/test_56 什么是PdfDocument?是iText 还是Windows? @ChrisHaas 它来自 spire pdf 库 【参考方案1】:

使用尖顶,

    private void buttonSpire_Click(object sender, EventArgs e)
    
        PdfDocument doc = new PdfDocument();
        doc.LoadFromFile(filename);

        PrintDocument(doc, printername, 1);
    
    private void PrintDocument(PdfDocument doc, string printername, short copies)
    
        PrintDialog dialogPrint = new PrintDialog();
        dialogPrint.AllowPrintToFile = true;
        dialogPrint.AllowSomePages = true;
        dialogPrint.PrinterSettings.MinimumPage = 1;
        dialogPrint.PrinterSettings.MaximumPage = doc.Pages.Count;
        dialogPrint.PrinterSettings.FromPage = 1;
        dialogPrint.PrinterSettings.ToPage = doc.Pages.Count;
        dialogPrint.PrinterSettings.Copies = copies;

        var paperSize = dialogPrint.PrinterSettings.PaperSizes.Cast<PaperSize>().FirstOrDefault(e => e.PaperName == "Letter");
        dialogPrint.PrinterSettings.DefaultPageSettings.PaperSize = paperSize;

        doc.PrintFromPage = dialogPrint.PrinterSettings.FromPage;
        doc.PrintToPage = dialogPrint.PrinterSettings.ToPage;
        doc.PrinterName = printername;

        PrintDocument printDoc = doc.PrintDocument;
        printDoc.DefaultPageSettings.PaperSize = paperSize;
        printDoc.PrinterSettings.Copies = copies;
        dialogPrint.Document = printDoc;

        printDoc.PrintController = new StandardPrintController();
        printDoc.Print();
    

条码问题重现:整个条码和文字下移,还有多个字段丢失粗体文字,

但如果我把 Spire 排除在外,这样做:

    private void buttonOther_Click(object sender, EventArgs e)
    
        PrintDocument(filename);
    
    private void PrintDocument(string filename)
    
        ProcessStartInfo info = new ProcessStartInfo();
        info.Verb = "print";
        info.FileName = filename;

        Process p = new Process();
        p.StartInfo = info;
        p.Start();
    

问题消失了:

我的机器上也安装了 Adob​​e Acrobat。所以,我猜,一旦 Spire 退出,Adobe Acrobat 默认接管一切工作正常。现在,如果你只有 Spire,那么你就被它困住了。尝试安装 Acrobat,看看你会得到什么。

顺便说一句,他们在自己的示例中使用 Adob​​e:

【讨论】:

谢谢,这很有趣,在我的电脑上这两种方法都有相同的结果,我会尝试更多地调查。

以上是关于在 C# 中打印由字体生成的 Pdf 文档条码的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 怎么调用斑马条码打印机批量打印

C#条码生成及打印实例代码

如何在 DomPDF 中正确嵌入 Google 字体?打印时中断

如何使用 C# 从字符串生成条形码?

在报表中使用Code128字体 打印条码,怎么才能实现

C# 打印PDF文档的10种方法