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]);
}
}
1 Kommentare zum Snippet