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

14

我有一个小应用程序,用于打印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 中,条形码看起来是否正常,只有在打印时才会出现奇怪的情况? - Chris Haas
是的,它们看起来还不错,这只是从亚马逊生成的发票。我会尝试在一会儿上传这样的文件。 - Nic
这是一个示例文件,其中两个条形码在打印后均无法正常工作。http://www.filedropper.com/test_56 - Nic
PdfDocument是什么?是iText还是Windows - Chris Haas
@ChrisHaas 这是来自 Spire PDF 库。 - Nic
显示剩余19条评论
1个回答

3
使用 Spire,
    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();
    }

条形码重现问题:整个条形码和文本向下移动,还有多个字段失去粗体文本。

enter image description here

但是如果我将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();
    }

问题得到解决: 输入图像描述 我也在我的电脑上安装了Adobe Acrobat。因此,我猜想一旦Spire不再存在,Adobe Acrobat默认接管并且一切正常运作。现在,如果你只有Spire,那么你就必须使用它。尝试安装Acrobat并查看结果。
顺便说一下,他们在自己的示例中使用Adobe: 输入图像描述

谢谢,这很有趣,在我的电脑上两种方法都有相同的结果,我会尝试更深入地调查这个问题。 - Nic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接