Geschrieben von: Christoph Wille
Kategorie: C#
This printed page brought to you by AlphaSierraPapa
Die virtuellen Businesskarten - die vCards - werden vielen von uns schon einmal untergekommen sein. Entweder als Attachment bei einer Email, oder als Download von einer Website. Einigen wird es dabei schon in den Sinn gekommen sein, für das eigene Communityportal solche vCards dynamisch für die Mitglieder zu generieren. Dieser Artikel zeigt, wie's geht.
Als ersten Schritt erzeugen wir uns eine vCard mittels Outlook Express, und sehen uns die Datenstrukturen an. Danach werden wir mit diesen Informationen an die Arbeit gehen, und uns eine Klasse programmieren, die Daten für die Erstellung der vCard annimmt, und als letzten Schritt aus diesen Daten eine vCard dynamisch erstellt.
Der einfachste und schnellste Weg zu einer vCard ist mittels Outlook Express. Dazu geht man zu den Adressen:
Und exportiert dort eine der Adressen in das vCard Format:
Dann kann man auf die neu erstellte vCard (Prefect, Ford.vcf) doppelklicken, und bekommt personenbezogene Informationen aus der vCard angezeigt:
Was steckt nun in so einer .vcf Datei drinnen? Es ist ein ganz normales Textfile mit "Feldern":
BEGIN:VCARD VERSION:2.1 N:Prefect;Ford FN:Ford Prefect ADR;HOME:;;Vordernbergerstrasse 27/8;Leoben;AT;8700;Austria LABEL;HOME:Vordernbergerstrasse 27/8;Leoben;AT;8700;Austria EMAIL;PREF;INTERNET:ford@theGuide.net REV:20020905T163340Z END:VCARD
Details zu den einzelnen Feldern erfährt man auf der Seite Personal Data Interchange - vCard and vCalendar. Allerdings kann man sich aus einem vollausgefüllten Outlook-Adresseintrag nach dem Export alles selbst zusammenreimen - für die Generierung einer vCard.
Damit man den Code möglichst in allen Anwendungen einsetzen kann - von Windows Forms bis hin zu ASP.NET - habe ich eine Klasse vCardGenerator designed, die das Erstellen einer vCard kapselt. Der Input sind die vCard-Felder, heraus kommt eine fertig korrekt formatierte elektronische Visitenkarte.
Die einzelnen Elemente der vCard werden in der Klasse in einer Hashtable verwaltet. Um den Eigenschaften den Direktzugriff (und somit Fehlerbehandlung) zu ersparen, werden die Zugriffe in einer GetProperty sowie SetProperty Methode abgewickelt:
using System; using System.Collections; using System.Text; namespace AspHeute.Utilities { public class vCardGenerator { Hashtable Elements; public vCardGenerator() { Elements = new Hashtable(); } private void SetProperty(string strElement, string strValue) { if (Elements.ContainsKey(strElement)) { Elements[strElement] = strValue; } else { Elements.Add(strElement, strValue); } } private string GetProperty(string strElement) { if (Elements.ContainsKey(strElement)) { return Elements[strElement].ToString(); } return ""; }
Details zur Verwendung der Hashtable Klasse finden Sie im Artikel Die Hashtable Klasse.
Die Eigenschaften können diese Methoden nun einsetzen, um die Werte bequem zu speichern - und zu holen (in der Klasse sind nicht alle möglichen Felder einer vCard implementiert, man kann das aber leicht nachholen):
public string FullName { get { return GetProperty("FN:"); } set { SetProperty("FN:", value); } } public string HomeTelVoice { get { return GetProperty("TEL;HOME;VOICE:"); } set { SetProperty("TEL;HOME;VOICE:", value); } } public string HomeTelFax { get { return GetProperty("TEL;HOME;FAX:"); } set { SetProperty("TEL;HOME;FAX:", value); } } public string CellTelVoice { get { return GetProperty("TEL;CELL;VOICE:"); } set { SetProperty("TEL;CELL;VOICE:", value); } } public string HomeAddress { get { return GetProperty("ADR;HOME:;;:"); } set { SetProperty("ADR;HOME:;;", value); } } public string PreferedInternetEmailAddress { get { return GetProperty("EMAIL;PREF;INTERNET:"); } set { SetProperty("EMAIL;PREF;INTERNET:", value); } }
Wie Sie sehen, verwende ich als Key für den Hashtable den linken Teil einer Zeile in der vCard, und als Wert das, was auch als Wert in der vCard rechts in der Zeile steht. Auf diese Art und Weise wird nämlich das Erstellen der vCard ein Leichtes:
public string Generate() { StringBuilder stb = new StringBuilder(); stb.Append("BEGIN:VCARD\r\n"); stb.Append("VERSION:2.1\r\n"); foreach (DictionaryEntry de in Elements) { stb.Append(de.Key); stb.Append(de.Value); stb.Append("\r\n"); } stb.Append("END:VCARD\r\n"); return stb.ToString(); }
Ein Vorspann und Ende fix in den StringBuilder einfügen, und die Datenpaare danach mit dem foreach Statement auslesen und schreiben. Die Klasse sieht im Class Scout von #develop dann so aus:
In der Beispielapplikation vCardGenerator ist neben der Klasse vCardGenerator auch noch ein Hauptprogramm mit dabei, das die Verwendung zeigt (SampleApp.cs):
using System; using System.IO; using AspHeute.Utilities; public class SampleApp { public static void Main() { vCardGenerator vcg = new vCardGenerator(); vcg.FullName = "Christoph Wille"; vcg.HomeAddress = "Vordernbergerstrasse 27/8;Leoben;AT;8700;Austria"; vcg.PreferedInternetEmailAddress = "christophw@icsharpcode.net"; vcg.CellTelVoice = "+43 4711 42"; string strVCard = vcg.Generate(); FileInfo fi = new FileInfo("sample.vcf"); StreamWriter sw = fi.CreateText(); sw.Write(strVCard); sw.Flush(); sw.Close(); } }
Heraus kommt ein perfekt gültiges sample.vcf (überprüfbar per Doppelklick):
BEGIN:VCARD VERSION:2.1 TEL;CELL;VOICE:+43 4711 42 EMAIL;PREF;INTERNET:christophw@icsharpcode.net ADR;HOME:;;Vordernbergerstrasse 27/8;Leoben;AT;8700;Austria FN:Christoph Wille END:VCARD
Natürlich kann das so generierte vCard per ASP.NET Downloadlink auch verschickt werden (zB interessant für die Mitglieder einer Community). Alles was zu tun ist, ist den entsprechenden MIME Type beim Download mitzuschicken - schon öffnet Outlook die vCard.
Die heute vorgestellte Klasse implementiert nur einige wichtige Elemente einer vCard, allerdings bin ich mir sicher, daß Sie die von Ihnen benötigten schnell mit Copy&Paste Programmierung einbauen werden können.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020906.zip
AutoCompletion für Web Formulare
http:/www.aspheute.com/artikel/20001121.htm
Das foreach Statement
http:/www.aspheute.com/artikel/20000720.htm
Das using Schlüsselwort
http:/www.aspheute.com/artikel/20020318.htm
Die Hashtable Klasse
http:/www.aspheute.com/artikel/20000823.htm
Die String Klasse in C#
http:/www.aspheute.com/artikel/20000803.htm
On-the-fly Generierung von Graphiken
http:/www.aspheute.com/artikel/20000728.htm
#develop (SharpDevelop)
http://www.icsharpcode.net/opensource/sd/
Personal Data Interchange - vCard and vCalendar
http://www.imc.org/pdi/
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.