Probleme mit einem Ausdruck

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von lris08.

    Probleme mit einem Ausdruck

    Hi,

    versuche über ein kleines Add In für Outlook (Vers. 2010) dass meine Email speichert... diese Mail auch gleich vorher auszudrucken...

    mit diesem Code versuche ich es :

    VB.NET-Quellcode

    1. Private Sub Mail_drucken()
    2. Dim objOutlook As Microsoft.Office.Interop.Outlook._Application
    3. objOutlook = New Microsoft.Office.Interop.Outlook.Application
    4. Dim mail As Microsoft.Office.Interop.Outlook.MailItem
    5. mail = objOutlook.ActiveExplorer.Selection.Item(1)
    6. PrintDocument1 = mail
    7. PrintDialog1.Document = PrintDocument1
    8. If PrintDialog1.ShowDialog() = DialogResult.OK Then
    9. PrintDocument1.Print()
    10. End If
    11. End Sub



    aber dabei bekomme ich dann folgende Fehlermeldung:

    Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Klassentyp "System.Drawing.Printing.PrintDocument" umgewandelt werden. Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.


    komm da einfach nicht weiter... könntet Ihr mir vielleicht weiterhelfen ??

    Wäre super nett...

    Viele GRüße
    lris
    das bedeutet: Eine Mail ist eben kein PrintDocument (und kann auch nicht in ein solches umgewandelt werden).

    Vlt. hat Outlook ja eine eigen Druckfunktion.

    Oder es reicht dir, den Text der Mail zu drucken - sowas wäre mit einem PrintDocument schon möglich. Gugge etwa Mehrseitigen Text drucken
    Hallo ErfinderDesRades :)

    habe es nun so gelöst... habe einfach selbst einen Ausdruck konstruiert :)

    hier erstmal der Ausdruck:

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim objOutlook As Microsoft.Office.Interop.Outlook._Application
    3. objOutlook = New Microsoft.Office.Interop.Outlook.Application
    4. Dim mail As Microsoft.Office.Interop.Outlook.MailItem
    5. mail = objOutlook.ActiveExplorer.Selection.Item(1)
    6. ' Drawing aktivieren
    7. Dim g As Graphics = e.Graphics
    8. Dim RandLinks As Integer = 80
    9. Dim StartPosition As Integer = 50
    10. Dim Zeilenhoehe As Integer = 18
    11. Dim F_Calibri08n As New Font("Calibri", 8, FontStyle.Regular)
    12. Dim F_Courier11n As New Font("Courier New", 11, FontStyle.Regular)
    13. Dim F_Courier11b As New Font("Courier New", 11, FontStyle.Bold)
    14. Dim F_Arial14b As New Font("Arial", 14, FontStyle.Bold)
    15. Dim F_Arial11n As New Font("Arial", 11, FontStyle.Bold)
    16. Dim F_Barcode As New Font("Bar-Code 39", 24, FontStyle.Regular)
    17. Dim stift1 As New Pen(Color.Black, 3)
    18. ' Druckausgabe - Kopfdaten
    19. g.DrawString("DIMS Mailarchivierung", F_Arial14b, Brushes.Black, RandLinks, StartPosition)
    20. g.DrawString("Dokumentenmappe", F_Calibri08n, Brushes.Black, 550, StartPosition)
    21. g.DrawString(DataGridView1.Rows(DataGridView1.CurrentRow.Index).Cells(12).Value, F_Barcode, Brushes.Black, 550, (StartPosition + Zeilenhoehe + 4))
    22. g.DrawLine(stift1, RandLinks, (StartPosition + 80), 750, (StartPosition + 80))
    23. ' Druckausgabe - Maildaten
    24. StartPosition += 100
    25. g.DrawString("Von:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    26. g.DrawString(mail.SenderName & " <" & mail.SenderEmailAddress & ">", F_Courier11n, Brushes.Black, 300, StartPosition)
    27. StartPosition += Zeilenhoehe
    28. g.DrawString("Gesendet:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    29. g.DrawString(mail.ReceivedTime, F_Courier11n, Brushes.Black, 300, StartPosition)
    30. StartPosition += Zeilenhoehe
    31. g.DrawString("An:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    32. g.DrawString(mail.To, F_Courier11n, Brushes.Black, 300, StartPosition)
    33. StartPosition += Zeilenhoehe
    34. g.DrawString("CC:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    35. g.DrawString(mail.CC, F_Courier11n, Brushes.Black, 300, StartPosition)
    36. StartPosition += Zeilenhoehe
    37. g.DrawString("BCC:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    38. g.DrawString(mail.BCC, F_Courier11n, Brushes.Black, 300, StartPosition)
    39. StartPosition += Zeilenhoehe
    40. g.DrawString("Betreff:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    41. 'g.DrawString(mail.Subject, F_Courier11n, Brushes.Black, 300, StartPosition)
    42. Dim TotalLength As Integer = mail.Subject.ToString.Length 'länge ermitteln
    43. Dim MaxZeichen1 As Integer = 44
    44. If TotalLength > MaxZeichen1 Then
    45. g.DrawString(mail.Subject.ToString.Substring(0, MaxZeichen1) & "...", F_Courier11n, Brushes.Black, 300, StartPosition)
    46. StartPosition += Zeilenhoehe
    47. g.DrawString(mail.Subject.ToString.Substring(MaxZeichen1, TotalLength - MaxZeichen1) & "(...)", F_Courier11n, Brushes.Black, 300, StartPosition)
    48. Else
    49. g.DrawString(mail.Subject, F_Courier11n, Brushes.Black, 300, StartPosition)
    50. End If
    51. StartPosition += Zeilenhoehe
    52. g.DrawString("Anlagen:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    53. Dim Atmt As Outlook.Attachment
    54. For Each Atmt In mail.Attachments
    55. g.DrawString(Atmt.FileName, F_Courier11n, Brushes.Black, 300, StartPosition)
    56. StartPosition += Zeilenhoehe
    57. Next Atmt
    58. StartPosition += Zeilenhoehe + Zeilenhoehe
    59. ' Mailinhalt (Text)
    60. g.DrawString("Mitteilungsinhalt:", F_Courier11b, Brushes.Black, RandLinks, StartPosition)
    61. StartPosition += Zeilenhoehe
    62. g.DrawString(mail.Body, F_Courier11n, Brushes.Black, RandLinks, StartPosition)
    63. End Sub



    Nun habe ich aber das Propblem mit dem Body.

    a.) wird alles immer mit der gleichen SChrift ausgegeben, nämlich mit Courier11n... hätte es aber gerne in der Originalformatierung

    b.) habe ich das Problem mit dem Zeilenumbruch...
    Es wird nur der Zeilenumbruch von der Mail selbst angewendet was bedeutet, dass eine Zeile durchaus abgeschnitten werden kann.

    Ausserdem habe ich das Problem mit mehreren Seiten...

    Vielleicht könntest mir da weiterhelfen ????

    Gruß
    lris
    zu a) weißichnix - was heißt ühaupt "Original-Formatierung"? Bei mir sind die Emails in der Schrift, die in meim Email-Prog eingestellt ist, oder willst du html-emails drucken?

    zu b) das ist doch im gegebenen Link gelöst, oder?
    Natürlich nur für Text - komplizierteres kannichnich.

    Gibts da echt keine Printing-Unterstützung in der Outlook-API?
    Danke für die Hilfe... hatte zuerst den Link nicht gesehen...


    Hab nun hinbekommen... läuft :)

    VB.NET-Quellcode

    1. Private Sub Mail_drucken()
    2. Page = 1
    3. MehrSeiten = False
    4. PrintDialog1.Document = PrintDocument1
    5. If PrintDialog1.ShowDialog() = DialogResult.OK Then
    6. PrintDocument1.Print()
    7. End If
    8. End Sub
    9. Private MehrSeiten As Boolean
    10. Private Page As Integer
    11. Private _CharsPrinted As Integer
    12. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    13. Dim objOutlook As Microsoft.Office.Interop.Outlook._Application
    14. objOutlook = New Microsoft.Office.Interop.Outlook.Application
    15. Dim mail As Microsoft.Office.Interop.Outlook.MailItem
    16. mail = objOutlook.ActiveExplorer.Selection.Item(1)
    17. ' Drawing aktivieren
    18. Dim g As Graphics = e.Graphics
    19. Dim RandLinks As Integer = 80
    20. Dim F_Calibri08n As New Font("Calibri", 8, FontStyle.Regular)
    21. Dim F_Courier11n As New Font("Courier New", 11, FontStyle.Regular)
    22. Dim F_Courier11b As New Font("Courier New", 11, FontStyle.Bold)
    23. Dim F_Arial14b As New Font("Arial", 14, FontStyle.Bold)
    24. Dim F_Arial11n As New Font("Arial", 11, FontStyle.Bold)
    25. Dim F_Barcode As New Font("Bar-Code 39", 24, FontStyle.Regular)
    26. Dim stift1 As New Pen(Color.Black, 3)
    27. Dim AnfangsZeile As Integer = 50
    28. Dim Zeilenhoehe As Integer = 18
    29. ' Druckausgabe - Kopfdaten
    30. g.DrawString("DIMS Mailarchivierung", F_Arial14b, Brushes.Black, RandLinks, AnfangsZeile)
    31. g.DrawString("Dokumentenmappe", F_Calibri08n, Brushes.Black, 550, AnfangsZeile)
    32. g.DrawString(DataGridView1.Rows(DataGridView1.CurrentRow.Index).Cells(12).Value, F_Barcode, Brushes.Black, 550, (AnfangsZeile + Zeilenhoehe + 4))
    33. g.DrawLine(stift1, RandLinks, (AnfangsZeile + 80), 750, (AnfangsZeile + 80))
    34. If Page = 1 Then
    35. ' Druckausgabe - Maildaten
    36. AnfangsZeile += 100
    37. g.DrawString("Von:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    38. g.DrawString(mail.SenderName & " <" & mail.SenderEmailAddress & ">", F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    39. AnfangsZeile += Zeilenhoehe
    40. g.DrawString("Gesendet:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    41. g.DrawString(mail.ReceivedTime, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    42. AnfangsZeile += Zeilenhoehe
    43. g.DrawString("An:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    44. g.DrawString(mail.To, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    45. AnfangsZeile += Zeilenhoehe
    46. g.DrawString("CC:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    47. g.DrawString(mail.CC, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    48. AnfangsZeile += Zeilenhoehe
    49. g.DrawString("BCC:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    50. g.DrawString(mail.BCC, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    51. AnfangsZeile += Zeilenhoehe
    52. g.DrawString("Betreff:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    53. 'g.DrawString(mail.Subject, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    54. Dim TotalLength As Integer = mail.Subject.ToString.Length 'länge ermitteln
    55. Dim MaxZeichen1 As Integer = 44
    56. If TotalLength > MaxZeichen1 Then
    57. g.DrawString(mail.Subject.ToString.Substring(0, MaxZeichen1) & "...", F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    58. AnfangsZeile += Zeilenhoehe
    59. g.DrawString(mail.Subject.ToString.Substring(MaxZeichen1, TotalLength - MaxZeichen1) & "(...)", F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    60. Else
    61. g.DrawString(mail.Subject, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    62. End If
    63. AnfangsZeile += Zeilenhoehe
    64. g.DrawString("Anlagen:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    65. Dim Atmt As Outlook.Attachment
    66. For Each Atmt In mail.Attachments
    67. g.DrawString(Atmt.FileName, F_Courier11n, Brushes.Black, 300, AnfangsZeile)
    68. AnfangsZeile += Zeilenhoehe
    69. Next Atmt
    70. End If
    71. If Page = 1 Then
    72. AnfangsZeile += Zeilenhoehe + Zeilenhoehe
    73. Else
    74. AnfangsZeile += (AnfangsZeile + 80)
    75. End If
    76. ' Mailinhalt (Text)
    77. g.DrawString("Mitteilungsinhalt:", F_Courier11b, Brushes.Black, RandLinks, AnfangsZeile)
    78. AnfangsZeile += Zeilenhoehe
    79. 'g.DrawString(mail.Body, F_Courier11n, Brushes.Black, RandLinks, AnfangsZeile)
    80. Dim SF As StringFormat = StringFormat.GenericDefault
    81. Dim Ft As Font = F_Courier11n
    82. Dim AllowedHeight As Integer = 0
    83. If Page = 1 Then
    84. AllowedHeight = e.MarginBounds.Height - 240
    85. Else
    86. AllowedHeight = e.MarginBounds.Height - 130
    87. End If
    88. Dim SB As New System.Text.StringBuilder(mail.Body.Substring(_CharsPrinted))
    89. Dim LinesFilled, CharsFitted As Integer ' werden von MeasureString() eingetragen (ByRef)
    90. Dim Sz As SizeF = g.MeasureString(SB.ToString, Ft, e.MarginBounds.Size, SF, CharsFitted, LinesFilled)
    91. ' Sinnigerweise zählt MeasureString() auch nur halb dargestellte Characters als "fitted".
    92. ' Da wir das beim Drucken anders sehen, Gegenprobe (Messung innerhalb einer quasi nach
    93. ' unten offenen Size):
    94. Sz.Height = Short.MaxValue
    95. ' Maße des druckbaren Bereichs
    96. Dim X As Double = e.MarginBounds.Left
    97. Dim Y As Double = e.MarginBounds.Top
    98. Dim B As Double = e.MarginBounds.Width
    99. Dim H As Double = e.MarginBounds.Height
    100. Dim drawRect As New RectangleF(RandLinks, AnfangsZeile + 20, B, Sz.Height)
    101. While g.MeasureString(SB.ToString(0, CharsFitted), Ft, Sz, SF).Height > AllowedHeight
    102. CharsFitted -= 1
    103. End While
    104. g.DrawString(SB.ToString(0, CharsFitted), Ft, Brushes.Black, drawRect, SF)
    105. 'g.DrawString(SB.ToString(0, CharsFitted), Ft, Brushes.Black, RandLinks, AnfangsZeile)
    106. _CharsPrinted += CharsFitted
    107. If mail.Body.ToString.Length > _CharsPrinted Then
    108. MehrSeiten = True
    109. End If
    110. If MehrSeiten = True Then
    111. e.HasMorePages = True
    112. Page = Page + 1
    113. AnfangsZeile = 200
    114. MehrSeiten = False
    115. Else
    116. e.HasMorePages = False
    117. End If
    118. End Sub
    119. Public Function Ausgabenhöhe(ByVal S As SizeF, ByVal B As Double) As Double
    120. Dim H As Double
    121. If S.Width > B Then
    122. H = (S.Width / B) * S.Height
    123. Else
    124. H = S.Height
    125. End If
    126. Return H
    127. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „lris08“ ()