Feedback

C# - Adobe Reader versionsunabhängig und ohne COM-Verweis hosten

Veröffentlicht von am 03.09.2009
(3 Bewertungen)
Dieses kleine Beispielprojekt zeigt, wie man - mit wenigen Zeilen Code - das ActiveX-Steuerelement des Adobe Readers (früher Acrobat Reader) verwenden kann, ohne einen COM-Verweis ins eigene Projekt einzufügen.

Außerdem funktioniert das mit Verschiedenen Versionen des Adobe Readers! Es spielt keine Rolle, ob man Version 7,8 oder 9 installiert hat.

Wer hat sich noch nicht darüber geärgert, dass jeder Kunde eine andere Reader-Version installiert hat?

Dies ist möglich, da die CLSID der verschiedenen Versionen des ActiveX-Steuerelements trotzdem immer die Selbe ist. Mit der abstrakten Basisklasse System.Windows.Forms.AxHost kann man sehr leicht Wrapper für ActiveX-Steuerelemente schreiben. Man muss nur die CLSID kennen (Wenn man nur die ProgId weiss, kann man in der Registry unter HKEY_CLASSES_ROOT danach suchen und kommt so auch an die CLSID).

Das Beispiel umfasst ein C#-Projekt mit einem Windows.Forms-Formular und einem einfachen Adobe Reader-Wrapper, der Anzeigen, Laden und Drucken kann.

Ein vollständiges Beispiel Projekt gibt´s unter http://www.mycsharp.de/wbb2/thread.php?postid=3568114#post3568114
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Reflection;

/// <summary>
/// .NET Wrapper für Adobe Reader ActiveX-Steuerelement
/// </summary>
public class AdobeReaderControl : AxHost
{
    /// <summary>
    /// Hostet das Adobe Reader ActiveX-Steuerelement in Windows.Forms.
    /// </summary>
    public AdobeReaderControl()
        : base("{CA8A9780-280D-11CF-A24D-444553540000}") // CLSID des Adobe Readers (ist bei allen 32-Bit Versionen gleich)
    { }

    /// <summary>
    /// Lädt eine PDF-Datei.
    /// </summary>
    /// <param name="path">Pfad</param>
    public void LoadFile(string path)
    {
        // LoadFile-Methode auf dem Adobe Reader aufrufen
        this.GetOcx().GetType().InvokeMember("LoadFile", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, this.GetOcx(), new object[1] { path });
    }

    /// <summary>
    /// Druckt die geladene PDF-Datei.
    /// </summary>
    public void Print()
    {
        // Print-Methode auf dem Adobe Reader aufrufen
        this.GetOcx().GetType().InvokeMember("Print", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, this.GetOcx(), new object[0]);
    }
}
Abgelegt unter Acrobat, PDF, Adobe Reader, ActiveX, AcroPDF, Drucken.

1 Kommentare zum Snippet

Günther Foidl schrieb am 04.09.2009:
Das find ich super!
 

Logge dich ein, um hier zu kommentieren!