在 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();
问题消失了:
我的机器上也安装了 Adobe Acrobat。所以,我猜,一旦 Spire 退出,Adobe Acrobat 默认接管一切工作正常。现在,如果你只有 Spire,那么你就被它困住了。尝试安装 Acrobat,看看你会得到什么。
顺便说一句,他们在自己的示例中使用 Adobe:
【讨论】:
谢谢,这很有趣,在我的电脑上这两种方法都有相同的结果,我会尝试更多地调查。以上是关于在 C# 中打印由字体生成的 Pdf 文档条码的主要内容,如果未能解决你的问题,请参考以下文章