我正在开发一个简单的Outlook 2016/2019 VSTO插件。
当选择电子邮件并按下功能区按钮时,它只需要将电子邮件的第一页打印到默认打印机。mailitem.PrintOut();
有效,但将打印整个电子邮件。有没有办法只指定第一页?
var m = e.Control.Context as Inspector;
var mailitem = m.CurrentItem as MailItem;
if (mailitem != null)
{
mailitem.PrintOut();
}
更新:请参阅我的答案,了解我用来让它工作的代码。
Outlook对象模型没有为此提供任何属性或方法。您需要自己解析消息正文,并使用.net机制自己打印这篇文章。
请注意,您可以尝试使用Word对象模型打印邮件正文(特定范围的页面(。Document.PrintOut方法打印指定文档的全部或部分内容。可选参数允许指定页面范围。
Outlook对象模型提供了三种处理项目主体的主要方法:
- 正文-表示Outlook项目的明文正文的字符串
- HTMLBody-表示指定项的HTML正文的字符串
- Word编辑器-显示的消息的Microsoft Word文档对象模型。
Inspector
类的WordEditor
属性从Word对象模型返回Document
类的一个实例,您可以使用它来处理消息体
您可以在第17章:使用项目主体中阅读更多关于所有这些方法的信息。
正如@Eugene所说,没有办法使用mailItem.PrintOut.指定单个页面
我终于想办法做到这一点了。我将文档保存为临时目录中的.doc文件,然后使用Microsoft.Office.Interop.Word
设置页边距/大小,然后将当前页面发送到打印机。希望这能帮助到一些人,因为我找不到任何c#的工作示例!
private void btnPrintOnePage_Click(object sender, RibbonControlEventArgs e)
{
string randFile = Path.GetTempPath() + "POP_" + RandomString(35) + ".doc";
var m = e.Control.Context as Inspector;
var mailitem = m.CurrentItem as MailItem;
if (mailitem != null)
{
mailitem.SaveAs(randFile, OlSaveAsType.olDoc);
Word.Application ap = new Word.Application();
Word.Document document = ap.Documents.Open(randFile);
document.PageSetup.PaperSize = Word.WdPaperSize.wdPaperA4;
document.PageSetup.TopMargin = 25;
document.PageSetup.RightMargin = 25;
document.PageSetup.BottomMargin = 25;
document.PageSetup.LeftMargin = 25;
Word.WdPrintOutRange printRange = Word.WdPrintOutRange.wdPrintCurrentPage;
document.PrintOut(false,null,printRange);
document.Close(false, false, false);
File.Delete(randFile);
}
}
public static string RandomString(int length)
{
Random random = new Random();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}