Word.Document öffnen und als ExportAsFixedFormat nach PDF konvertieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von drschef.

    Word.Document öffnen und als ExportAsFixedFormat nach PDF konvertieren

    Ich öffne einzeln Word-Dokumente mit folgender Befehlsfolge:

    VB.NET-Quellcode

    1. Private Function ConvertWordToPDF(filename As String) As Boolean
    2. ConvertWordToPDF = True
    3. Dim WordApplication As Word.Application = New Microsoft.Office.Interop.Word.Application
    4. Dim WordDocument As Microsoft.Office.Interop.Word.Document = Nothing​
    5. Dim ofname As Object = filename
    6. Dim opw As Object = ""
    7. Dim PW As String
    8. Dim fehler As Boolean
    9. Dim i As Integer = 0
    10. Do While i < 3
    11. i += 1
    12. fehler = False
    13. Try 'Besitzt Dokument ein Password ?
    14. WordDocument = WordApplication.Documents.Open( _
    15. FileName:=ofname, _
    16. ReadOnly:=True, _
    17. AddToRecentFiles:=False, _
    18. PasswordDocument:=opw, _
    19. Visible:=False)
    20. Catch ex As Exception
    21. fehler = True
    22. PW = InputBox("Die Datei ist durch ein Passwort geschützt. (" & i & ")" & vbCrLf & "Wie lautet es?")
    23. opw = PW
    24. End Try
    25. If Not fehler Then Exit Do
    26. Loop
    27. If fehler Then
    28. ConvertWordToPDF = False
    29. Exit Function
    30. end if
    31. Try
    32. If Not WordDocument Is Nothing Then
    33. WordDocument.ExportAsFixedFormat( _
    34. OutputFileName:=DateiNameTemp, _
    35. ExportFormat:=Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF, _
    36. OpenAfterExport:=False, _
    37. OptimizeFor:=Microsoft.Office.Interop.Word.WdExportOptimizeFor.wdExportOptimizeForOnScreen, _
    38. Range:=Microsoft.Office.Interop.Word.WdExportRange.wdExportAllDocument,
    39. From:=0, _
    40. To:=0, _
    41. Item:=Microsoft.Office.Interop.Word.WdExportItem.wdExportDocumentContent, _
    42. IncludeDocProps:=True, _
    43. CreateBookmarks:=Microsoft.Office.Interop.Word.WdExportCreateBookmarks.wdExportCreateNoBookmarks, _
    44. DocStructureTags:=False, _
    45. BitmapMissingFonts:=True)
    46. End If
    47. Catch ex As Exception
    48. WriteProt(Err.Description, , "R")
    49. If Not Protokoll.Visible Then Protokoll.Show()
    50. Console.Beep(FRQ, DUR)
    51. ConvertWordToPDF = False
    52. '....


    Der Algorithmus ermöglicht bis zu 3 Zyklen, zwischen denen u.U. über eine InputBox ein Password eingegeben werden kann. Danach wird die nach PDF konvertierte Datei an ein WebBrowserControl zur Anzeige übergeben. Tatsächlich öffnet sich zwischendurch ein leeres Word-Fenster mit einer dazugehörigen Passwortabfrage. Nachdem diese beantwortet und das Fenster geschlossen wurde, erscheint dann meine eigene Abfrage und die PDF-Datei erscheint in meinem Anzeige-Control. Wenn die Datei kein Passwort besitzt, funktioniert alles bestens. öffnet sich kein Word-Fenster und keine zusätzlich Passwortabfrage. Ich habe bis jetzt noch keine Lösung und keinen Parameter gefunden, um das Word-Fenster und die Passwortabfrage zu unterdrücken.

    Interessanterweise gibt es bei dem analogen Problem von Excel nach PDF einen Parameter unter ExportAsFixedFormat der die Anzeige und Passwortabfrage unterdrückt.

    drschef schrieb:

    Tatsächlich öffnet sich zwischendurch ein leeres Word-Fenster mit einer dazugehörigen Passwortabfrage
    Das passiert in dem Try-Zweig, da du da eine geschützte Datei ohne Passwort öffnen willst.
    Du kannst das unterdrücken mit

    VB.NET-Quellcode

    1. ​WordApplication.DisplayAlerts = wdAlertsNone


    Ansonsten solltest du die Datentypen etwas genauer angeben

    drschef schrieb:

    Dim ofname As Object = filename
    Dim opw As Object = ""
    Nimm hier nicht Object sondern String.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    drschef schrieb:

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    2. Do While i < 3
    3. i += 1
    4. ' ...
    5. Loop

    machst Du

    VB.NET-Quellcode

    1. For i = 0 to 2
    2. '
    3. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke erst mal für die schnelle Reaktion.

    Rod empfahl:

    VB.NET-Quellcode

    1. For i = 0 to 2
    2. '
    3. Next



    Danke. Ist natürlich klar. In der Schnelle ist mir gerade nicht dümmeres eingefallen.

    Die Empfehlung von petaod

    WordApplication.DisplayAlerts = wdAlertsNone

    hat mein Herz schneller schlagen lassen. Aber no success! Das blöde Fenster öffnet sich weiterhin. Bei Excel sieht das so aus:

    VB.NET-Quellcode

    1. ExcelWorkbook.ExportAsFixedFormat( _
    2. Type:=dtype, _
    3. Filename:=DateiNameTemp, _
    4. Quality:=dquality, _
    5. OpenAfterPublish:=False)


    Und OpenAfterPublish = false (default) löst dieses vertrackte Problem.

    Was gibt es noch für Chancen ???
    @drschef Kannst Du mal den Befehl identifizieren, bei dem das auftritt?

    petaod schrieb:

    Das passiert in dem Try-Zweig
    Steppe den mal durch.
    Und:

    VB.NET-Quellcode

    1. If Not WordDocument Is Nothing Then
    machst Du

    VB.NET-Quellcode

    1. If WordDocument IsNot Nothing Then
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das passiert praktisch bei jedem Aufruf von

    WordDocument = WordApplication.Documents.Open( ...

    In dem 3er-Zyklus werde ich bei Falscheingabe durch die Mehrfachanforderung des Passworts 6 mal gefragt. Immer zuerst von dem Word-Fenster aus und dann von meiner InputBox. Den Zyklus habe ich inzwischen raus gehauen. Aber dieses Word-Fenster mit der Passwortabfrage ist sehr irritierend und macht meine ganze Oberfläche dicht.

    Nochmal zu dem Hinweis von petaod:

    ​Nimm hier nicht Object sondern String.


    genau das geht beim Aufruf von WordApplication.Documents.Open nicht. Da will er ein Object (Option Explicit on).
    Ich habe immer noch ein wenig herum geklimpert. Der jetzige Code sieht nicht grundlegend anders aus, ist aber überschaubarer:

    VB.NET-Quellcode

    1. Dim WordApplication As Word.Application = New Microsoft.Office.Interop.Word.Application
    2. WordApplication.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
    3. Dim WordDocument As Microsoft.Office.Interop.Word.Document = Nothing
    4. Dim ofname As Object = filename
    5. Dim PW As String = ""
    6. Dim opw As Object = PW
    7. Try 'Besitzt Dokument ein Password ?
    8. WordDocument = WordApplication.Documents.Open( _
    9. FileName:=ofname, _
    10. ReadOnly:=True, _
    11. AddToRecentFiles:=False, _
    12. PasswordDocument:=opw, _
    13. Visible:=False)
    14. Catch ex As Exception
    15. PW = InputBox("Die Datei ist durch ein Passwort geschützt." & vbCrLf & "Wie lautet es?")
    16. opw = PW
    17. End Try
    18. Try 'Öffnen des Workbooks mit eingegebenem Passwort as ExcelWorkbook
    19. WordDocument = WordApplication.Documents.Open( _
    20. FileName:=ofname, _
    21. ReadOnly:=True, _
    22. AddToRecentFiles:=False, _
    23. PasswordDocument:=opw, _
    24. Visible:=False)
    25. Catch ex As Exception
    26. WriteProt(Err.Description, , "R")
    27. If Not Protokoll.Visible Then Protokoll.Show()
    28. Console.Beep(FRQ, DUR)
    29. ConvertWordToPDF = False
    30. Exit Function
    31. End Try
    32. Try 'Export Word nach PDF
    33. If WordDocument IsNot Nothing Then
    34. 'https://msdn.microsoft.com/de-de/library/office/ff840962.aspx
    35. WordDocument.ExportAsFixedFormat( _
    36. OutputFileName:=DateiNameTemp, _
    37. ExportFormat:=Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF, _
    38. OpenAfterExport:=False, _
    39. OptimizeFor:=Microsoft.Office.Interop.Word.WdExportOptimizeFor.wdExportOptimizeForOnScreen, _
    40. Range:=Microsoft.Office.Interop.Word.WdExportRange.wdExportAllDocument,
    41. From:=0, _
    42. To:=0, _
    43. Item:=Microsoft.Office.Interop.Word.WdExportItem.wdExportDocumentContent, _
    44. IncludeDocProps:=True, _
    45. CreateBookmarks:=Microsoft.Office.Interop.Word.WdExportCreateBookmarks.wdExportCreateNoBookmarks, _
    46. DocStructureTags:=False, _
    47. BitmapMissingFonts:=True)
    48. End If
    49. Catch ex As Exception
    50. WriteProt(Err.Description, , "R")
    51. If Not Protokoll.Visible Then Protokoll.Show()
    52. Console.Beep(FRQ, DUR)
    53. ConvertWordToPDF = False


    Er hat meines Wissens keine wesentlichen Änderungen außer der Abschaffung der Zyklen. Das Problem ist noch da.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „drschef“ ()

    Ich habe nichts gegen die Word-Passwort-Eingabe, aber ich möchte das völlig überflüssige Fenster, von dem die Passwortabfrage ausgeht nicht sehen.
    Dann wird mein eigenes auch noch leeres Fenster von einem riesigen leeren Word-Fenster überlagert und darüber die Password-Abfrage. Nach dem Eintragen des Passworts verschwindet dann das Word- Fenster. Bei dem kleinen Zyklus den ich drin hatte, hat sich das sogar bis zu drei mal wiederholt. Es ist mir bisher auch nicht gelungen, das Word-Fenster zu minimieren. oder unsichtbar zu machen.

    Im Übrigen klappt das wie gesagt bei Excel. Und da sollte man schon erwarten, dass die Programme einer Familie an der seit 30 Jahren gearbeitet wird, annähernd gleiches Verhalten zeigen.
    Ich hab ne Idee (die ich auch schon erfolgreich ausprobiert habe):
    Du schreibst ja in Deinem Try-Teil:

    VB.NET-Quellcode

    1. WordDocument = WordApplication.Documents.Open( _
    2. FileName:=ofname, _
    3. ReadOnly:=True, _
    4. AddToRecentFiles:=False, _
    5. PasswordDocument:=opw, _
    6. Visible:=False)

    Wobei Du opw mit "" standardfestgelegt hast. Lege da stattdessen für opw (fast) totalen nonsens fest, also ein falsches Passwort. Dann kommt eine Exception, Word wird nicht gezeigt, Deine InputBox ist (VB6-Style, aber sie ist) zu sehen. Dann kann man das richtige PW eingeben. Wenn man hingegen einen Leerstring als PW übergibt (so wie Du es in Runde 1 derzeit machst), wird das wohl als Anweisung gesehen, explizit in der Word-InputBox ein Passwort einzugeben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    es ist der blanke Wahnsinn! Dein Vorschlg funktioniert wirklich. Für mich beginnt ein neuer Lebensabschnitt, wenn auch die Lösung eine Art Metaphysik ist.
    Ich danke Dir ganz sehr, denn das Problem hat mich in den letzten Tagen sehr beschäftigt. Nun ist es gelöst.

    Danke nochmal!