使用 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 对象模型提供了三种处理项目正文的主要方式:

  1. Body - 表示 Outlook 项目的明文正文的字符串。
  2. HTMLBody - 表示指定项目的 HTML 正文的字符串。
  3. Word editor - 正在显示的消息的 Microsoft Word 文档对象模型。 WordEditor 属性 Inspector class returns Document class 的一个实例,您可以从 Word 对象模型中用于处理消息体。

您可以在 Chapter 17: Working with Item Bodies.

中阅读有关所有这些方式的更多信息

正如@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());
}