使用 mailitem.PrintOut() 打印单页?
Using mailitem.PrintOut() to print a single page?
我正在开发一个简单的 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 对象模型提供了三种处理项目正文的主要方式:
- Body - 表示 Outlook 项目的明文正文的字符串。
- HTMLBody - 表示指定项目的 HTML 正文的字符串。
- Word editor - 正在显示的消息的 Microsoft Word 文档对象模型。
WordEditor
属性 Inspector
class returns Document
class 的一个实例,您可以从 Word 对象模型中用于处理消息体。
中阅读有关所有这些方式的更多信息
正如@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());
}
我正在开发一个简单的 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 对象模型提供了三种处理项目正文的主要方式:
- Body - 表示 Outlook 项目的明文正文的字符串。
- HTMLBody - 表示指定项目的 HTML 正文的字符串。
- Word editor - 正在显示的消息的 Microsoft Word 文档对象模型。
WordEditor
属性Inspector
class returnsDocument
class 的一个实例,您可以从 Word 对象模型中用于处理消息体。
正如@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());
}