Zur Generierung von Word-Dokumenten kann die Funktionsbibliothekt von Aspose (Aspose.dll; http://aspose.com/) genutzt werden. Diese unterstützt u.A. auch das Einbinden von Bildern.
Beispiel:
Ziel ist es, ein Bild aus einer Sharepoint-Dokumentenbibliothek in ein mit Aspose generiertes Word-Dokument einzubinden.
Stolpersteine:
- Wenn mit Tabellen gearbeitet wird, sollte (ähnlich der Html-Progammierung mit Tabellen) eine saubere Tabellenstruktur eingehalten werden. Sonst passiert es, dass das Bild irgendwo erscheint – nur nicht dort, wo man es erwartet.
- Berechtigungen des Sharepoints berücksichtigen. Im Quellcodebeispiel wird das Bild mit Adminrechten gelesen. (Sonst nicht über einen 401-Fehler wundern.)
- Reihenfolge beim Schließen des Streams beachten. Stream erst schließen, wenn die Image-Instanz ins Word-Dokument geschrieben wurde.
- Nicht auf alle Properties der SPFile-Instanz verlassen. Das Property „Exists“ hat bei mir bspw. immer false zurückgegeben, auch wenn das Bild vorhanden war.
- Um sicherzustellen, dass in der SPFile-Instanz wirklich Daten hinterlegt sind, einfach einen weiteren Try-Catch-Block drumherum legen und ggf. auswerten.
Quellcode:
Uri imageUri = new Uri(“http://mySharepoint.com/mySite/myDocumentLibrary/example.jpg”);
SPSite s = null;
SPWeb w = null;
Guid id;
SPFile f = null;
Stream str = null;
Image img = null;
try
{
//Bild aus Sharepoint holen
s = new SPSite(imageUri.ToString());
id = s.ID;
s.Close();
SPSecurity.RunWithElevatedPrivileges(delegate()
{
s = new SPSite(id);
w = s.OpenWeb();
f = w.GetFile(imageUri.ToString());
if (f == null)
{
img = null;
}
else
{
try
{
str = f.OpenBinaryStream();
img = System.Drawing.Image.FromStream(str);
}
catch (Exception ex)
{
img = null;
}
}
});
//now insert the pic in the word-document
Document doc = new Document();
doc.RemoveAllChildren();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.RowFormat.ClearCellPadding();
builder.CellFormat.ClearFormatting();
if (img == null)
{
builder.RowFormat.Height = imgHeight;
builder.RowFormat.HeightRule = HeightRule.Exactly;
builder.Font.Name = "Arial";
builder.Font.Size = 10;
builder.Font.Color = System.Drawing.Color.Black;
builder.Writeln("Es ist kein Bild vorhanden");
}
else
{
builder.RowFormat.Height = img.Height;
builder.RowFormat.HeightRule = HeightRule.Exactly;
builder.InsertImage(img, img.Width, img.Height);
img = null;
}
builder.EndRow();
}
catch (Exception ex)
{
throw new Exception("Es ist ein unerwarteter Fehler bei der Verarbeitung "+
"des Fotos '"+imageUri.ToString()+"' aufgetreten!", ex);
}
finally
{
if (str != null)
str.Close();
if (f != null)
f = null;
if (w != null)
w.Close();
if (s != null)
s.Close();
}