Home > Entwicklertools > PDF for Silverlight

PDF für Silverlight


Was ist neu Features Preis Updates Wartung

PDF for Silverlight : Was ist neu

Nehmen Sie Vorteil von der Mächtigkeit von Silverlight, um PDF-Dokumente und Formulare zu visualiseren (Aktualisiert für Silverlight 3 und 4)

Mit Microsoft Silverlight können Entwickler inhaltreiche Webanwendungen mit komplexen Grafiken und besserer Benutzerinteraktion erstellen. Mit Amyuni PDF for Silverlight werden qualitativ hochwertige PDF-Dokumente dargestellt. Im Vergleich zur Darstellung von Dokumenten als JPEG-Bilder sind diese PDF-Dokumente leicht lesbar.

In diesem Paper zeigen wir Ihnen auf:
  • Wie Sie mit den Amyuni PDF-Komponenten PDF-Dokumente innerhalb eines Silverlight-Steuerelements dynamisch anzeigen
  • Wie Sie ein Silverlight 3-Steuerelement erstellen, um PDF-Dokumenten darzustellen bzw. mit denen zu interagieren.
  • Wie Sie das gleiches Steuerelement für die Darstellung von PDF-, XPS- oder Dokumenten beliebigen Typs verwenden


Jetzt ist PDF zum Standardformat für die Dokumentspeicherung und Formularverarbeitung in den meisten Unternehmen geworden. Profitieren Sie mit Ihre Silverlight Anwendungen von der Möglichkeit, PDF-Dokumente und Formulare nativ bereitzustellen.


PDF for Silverlight Demo anschauen >

PDF for Silverlight Paper

Anforderungen (Server-seitig)

Der server-seitige Code zur Konvertierung von Dokumenten in XAML und zum Aufbau von ZIP-Pakete ist ganz einfach (gebaut in einem HttpHandler)  und verwendet den Amyuni PDF Creator .NET:


Anforderungen (Client-seitig)

Jeder Webbrowser, der auf einem Betriebssystem mit Silverlight 3.0 oder höher läuft. Der PDFSilverlightControl-Beispiel wird auf dem Client-PC von dem Silverlight Framework automatisch heruntergeladen. Keine zusätzliche Komponente müssen auf dem Client laufen oder von dem Client heruntergeladen werden.


Implementation

Auf den ersten Blick sah das Anzeigen von PDF-Dokumenten innerhalb eines Silverlight Controls wie einen 15 Minute Job aus. Es würde ausreichen, das PDF-Dokument in einem XPS (ein Derivat von XAML) zu konvertieren, das XPS in das Silverlight Control einzugeben, übliche Schnickschnack hinzufügen und fertig wäre es. Die Konvertierung von PDFs oder irgendeinem anderen Dokument in XPS läßt sich leicht mit Amyuni PDF Creator realisieren; es genügt, das XPS in das Silverlight Control einzugeben. Wir standen jedoch vor großen Herausforderungen:

  1. Mit Silverlight kann nur eine einzelne XPS-Datei gelesen werden. Es ist weder möglich mehrere Seiten separat einzugeben noch die Ressourcen dieser Seiten (Bilder, Schriftarten, etc...) einzulesen. Im Gegensatz zu PDF und XPS bietet Silverlight keine geschickte Möglichkeit Dokumentenpakete zu erstellen. Aber es ezeugt alle Teile eines Dokuments separat auf dem Server und lädt sie programmtechnisch durch die aufrufende Anwendung herunter. Dadurch ist das Streamen von Dokumenten, eine grundlegende Anforderung an die meisten Applikationen, von einem Server zu einem Client ausgeschlossen.

  2. Der Javascript API für Silverlight bietet ein Downloader Objekt an, das für das asynchrone Herunterladen einer XAML-Datei oder anderen Komponenten wie Schriftarten und Bilder von einem Server verwendet werden kann. Der Downloader wird nur durch Javascript zur Verfügung gestellt. Er kann in einem Silverlight Contol nicht verwendet werden, denn dieses ist normalerweise in C codiert . Wir mussten die Kombination von WebClient-objekt einsetzen, um für den Abruf einer XAML-Datei eine asynchrone Anfrage an dem Webserver zu senden. Dann mussten wir die mächtige Application.GetResourceStream() Methode für das Extrahieren der ZIP-Datei anwenden. Diese beide Features werden von den Versionen 3 und 4 von Silverlight unterstützt.

    Weitere neue Eigenschaften wurden für das PDF Creator control in Serverbereich eingeführt. Das PDF Creator control Feature liefert eine XAML-Datei zurück und wird gewöhnlich auf die ganze PDF-Datei angewendet. Es erzeugt XAML für alle Seiten der Datei. Wenn eine PDF-Datei sehr groß ist, dauert dieser Vorgang lange. Die Anwendung auf der Clientseite müsste ohne jegliche Benachrichtigung auf dem Anwort des Servers warten. Mit der Version 4.5 des PDF Creator control kann einen Teil der Seiten des Originaldokuments zurückgeliefert werden, anstatt aller Seiten des Dokuments auf einmal zu erzeugen. Dies kann dadurch erreicht werden, dass die Dokumenteigenschaften "PageSequence" in einen Feld von aufgeruften Seiten oder "PageSequenceStr" in eine Zeichenkettendarstellung der aufgeruften Seiten gesetzt werden.

  3. Das von Silverlight angebotene Bild-Objekt findet seine Grenze darin, dass es keine Inline-Images zulässt. Die Benutzung einer URL ist die einzige Möglichkeit die Quelle eines Bildes anzugeben. Um ein Bild aus einem PDF extrahieren und als Quelle für ein Silverlight Bild-Objekt setzen zu können, müsste das Bild in eine temporäre Datei auf dem Server extrahiert und die Quelle des Bildes als temporäre URL gesetzt werden - eine Lösung, die praktisch nicht realisierbar ist.


Die Grundvoraussetzungen zum Erstellen von Document Viewer mittels Silverlight sind:

  • Die Möglichkeit jede Seite einzeln in einem Konto für umfangreiche Dokumente hinzufügen und das Herunterladen des ganzen Dokuments vom Client-PC vor dem Ansicht zu verhindern
  • Die Möglichkeit, die Ressourcen der Seiten wie Bilder und Fonts im Dokument abzupacken, ohne sie auf bzw. vom Server abspeichen bzw. abrufen zu müssen
  • Die Möglickeit, Schriften zu verwenden, die nicht auf dem Client-PC installiert, sondern eingebettet im Quelldokument sind
  • Die Möglichkeit, zusätzliche Informationen bekannt als Dokument Metadaten an den Client zu senden


Verwendung des WebClient-Objekts  und der Application.GetResourceStream() Methode

In Silverlight 3 und 4, Die Kombination des WebClient-Objekts und der static Application.GetResourceStream() Methode löst das Problem des Abrufens eines ZIP-Pakets aus einem Webserver und des Extrahierens jedes Objekts getrennt auf dem Client in einem Silverlight User Control. Der WebClient lädt ein XAML ZIP-Paket herunter, das vom PDF Creator serverseitig hergestellt wurde. Das heruntergeladene ZIP-Paket wird als ein Stream in einer Membervariable von unserer acPDFSilverlightControl-Klasse gespeichert.

Innerhalb des ZIP-Pakets wird jede Seitenbeschreibung als eine separate XAML-Datei gespeichert; und alle Ressourcen, die von dieser Seite verwendet wurden, werden in einem virtuellen Verzeichnis gespeichert.

Das Herunterladen und Entpacken des ZIP-Pakets kann asynchron geschehen. Die dynamische Herstellung des ZIP-Pakets auf dem Server und dessen Download auf dem Client ohne Zugriff auf temporären Dateien ist genau das, was wir brauchen. Die Grundsyntax für die Verwendung des WebClient-Objekts sieht wie folgt aus:

 

public void LoadFromUrl(string url)

{

// Retrieves the XAML of document packaged in a ZIP format located at the specified URL

// which can be something like:

// "http://www.amyuni.ca/PageTurnPdf/pdf.asp?PDFFile=doc.pdf" or

// "http://www.amyuni.ca/PageTurnPdf/myXAMLpackage.zip"

 

      ...

      // start web download using the WebClient object

      Uri uri = new Uri( url );

      WebClient webClient = new WebClient();

       webClient.AllowReadStreamBuffering = true; //speeds application response time

      // add event listener to detect when data is available

      webClient.OpenReadCompleted += new
           OpenReadCompletedEventHandler(webClient_OpenReadCompleted);

       

      // add event handler for catching download progress notifications

      webClient.DownloadProgressChanged += new
           
DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);

           

      // start request   

      webClient.OpenReadAsync(uri, webClient);

}

 

 

private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

{

// Start loading the document

      // e.Result will contain the XAML ZIP Stream

      m_zipStream =  e.Result;

                  ...

      // get XAML of document

      Stream stream = GetPartFromZipPackage("Document/document_1.fdoc", m_zipStream);

      StreamReader sreader = new StreamReader(stream);

      string sDoc = sreader.ReadToEnd();

      ...

 

      // get XAML of page from the ZIP package

      Stream stream = GetPartFromZipPackage("Pages/page_" + (pageNumber + 1).ToString() +
                        ".fpage", m_zipStream);

               

      // convert to string

        StreamReader sreader = new StreamReader(stream);

      string sPageXaml = sreader.ReadToEnd();

      ...

 

Extrahieren und Rendern von Bildern

Das Herunterladen der XAML-Seitenbeschreibung auf dem Client genügt nicht zur Darstellung von Bildern. Zusätzlich müssen alle Bildobjekte durchgeschleift werden und jedem Bild im ZIP-Paket wird eine Quelle zugeordnet. Jedes Mal eine neue Seite geladen wird, wird die Funktion “ProcessElements” aufgerufen. Diese Funktion sucht nach allen Bildern auf der Seite und setzt ihre “ImageSource”-Eigenschaft:

private void ProcessElements(object _elems)

{

 

// process all page elements to set:

//  - the source of all image elements

//  - the font of all text elements

//

       for ( int i = 0; i < elems.Count; i++ )

       {

              UIElement elem = elems[i]; //a child UIElment

              Image img = elem as Image;

              ...

               // the Source would be a string

              if (img.Source != null && img.Source.ToString() != "")

              {

                      var src = img.Source;

                      if (src != null)

                      {

                             string s = src.ToString();

                             // set the source after removing the leading slash

                             Stream stream = GetPartFromZipPackage(s.Substring(1),
                                                   m_zipStream);

                              BitmapImage bitmap = new BitmapImage();

                                   bitmap.SetSource(stream);

                            img.Source = bitmap;

                      }

              }

              ...

 

 

              // loop recursively through all children of the current element

           ProcessElements(elem.children);

              ...

       }

}

 

Rendering von Text

Die genaue Positionierung und das Rendern von Textelementen ist komplizierter als die von Grafiken und Bildern. PDF bietet verschiedene Möglichkeiten zur Festlegung von Text-Encodings und Schriftarten. Sowohl XPS als auch XAML beschränkt sich auf Text im Unocode und XAML bietet weniger Flexibilität gegenüber anderer Formate für Text-Rendering. Um Probleme mit Texten zu reduzieren, bieten Amyuni PDF-Kompenenten Methoden zur Optimierung der Textinhalte einer Seite und zur Konvertierung aller Texte in Unicode. Die “OptimizeDocument”-Methode wird auf dem Server für die Optimierung von Textinhalten verwendet, bevor sie in einem Silverlight-Control gerendert werden:

 

' Optimize the document to line level in order to improve the XAML export

objPdf.OptimizeDocument 1

 

Ist der in einem Quelldokument verwendete Font nicht vorhanden, wird Silverlight dieser Font durch einen anderen esetzen, der gewöhnlich keine zufriedenstellende Ergebnisse liefert. Silverlight bietet einen Mechanismus für die Angabe des Fonts, der zur Darstellung eines bestimmten Elements verwendet wird, solange dieser Font in OpenType- oder TrueType-Format ist. Das Downloader-Objekt kann in diesem Fall verwendet werden, um alle Fonts abzupacken, die in einem Dokument benutzt wurden. Die Fonts sind in einem ZIP-Paket als teilweise eingebetteten Fonts eingebunden und können vom Enduser nicht benutzt werden. Dadurch werden Lizenzprobleme mit Fonts vermieden.

Parallel zur beschriebenen Bildverarbeitung schleift der Sample Viewer alle Textobjekte durch und jedem Textobjekt wird eine Quelle zugeordnet:

// set the font source for all text elements to fonts retrieved from the ZIP package

if ( elem.GetType() == typeof(TextBlock) )

{

      TextBlock tb = (TextBlock) elem;

        // set the FontSource

        tb.FontSource = new FontSource( m_zipStream );

      ...

Die “FontFamily”-Eigenschaft des Textelements bildet den Textfont auf einem der gepackten Fonts in der ZIP-Datei ab. Die Silverlight-Komponente erledigt es automatisch, wenn der angefragte Font auf dem System des Endusers nicht vorhanden ist.


Serverseitige Skripten

Der serverseitige Code für die Konvertierung des Dokuments in XAML und die Erstellung des ZIP-Pakets ist sehr einfach und benutzt den Amyuni PDF Creator .NET:

<%@ WebHandler Language="C#" Class="PdfHandlerNet" %>

using System;using System.Web;

using System.Web.Services;

using System.IO;

using Amyuni.PDFCreator;

 

[WebService(Namespace = "http://www.amyuni.com/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class PdfHandlerNet : IHttpHandler

{   

    public void ProcessRequest (HttpContext context)

    {

        context.Response.ContentType = "application/x-zip-compressed";       

        var strFilePath = context.Request.QueryString["PDFFile"];

        var strPages = context.Request.QueryString["Pages"];

       

        // Create the PDF Creator ActiveX object

        // This will throw an exception if the control is not installed

        // or the document not found

        acPDFCreatorLib.Initialize();

        var acpdf = Activator.CreateInstance<Amyuni.PDFCreator.IacDocument>();

       

        //Use a valid evaluation license code

               acpdf.SetLicenseKey("Silverlight Evaluation", "1234..3445");

                            

        FileStream fIn = new FileStream(context.Server.MapPath(strFilePath),

                                         FileMode.Open,

                                         FileAccess.Read);

        acpdf.OpenEx(fIn, string.Empty);

       

        // Set the page sequence. If QueryString("Pages")

        //did not find that parameter, then strPages will be ""

        //and setting the attribute will clear the array of pages

        acpdf.Attribute("PageSequenceStr").Value = strPages;

       

        // Optimize the document to line level in order to improve the XAML export

        acpdf.OptimizeDocument(1);

       

        // return the XAML attribute of the document object which is a ZIP package

        var o = acpdf.Attribute("XAML").Value;

        context.Response.BinaryWrite((byte[]) o);

       

        acpdf.Dispose();

        fIn.Close();

        fIn.Dispose();

       

        acPDFCreatorLib.Terminate();

    }

 

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}


Erweiterung des Beispiels zum Anzeigen von anderen Dokumenten, die kein PDF sind

Der serverseitige Skript kann für das Rendering von Dokumenten einfach erweitert werden. Um XPS Dokumente rendern zu können, muss der Dokument von dem PDF Creator Control geladen und in XAML gespeichert werden, damit es mit Silverlight kompatibel ist. Dieses geschieht durch die Ersetzung der PDF-Datei mit einer XPS-Datei in dem serverseitigen Skript.

Um andere Dokumente rendern zu können, müssen sie erst in PDF mit dem Amyuni PDF Converter umgewandelt werden und dann auf dem Client als ZIP-Paket heruntergeladen werden.

Der PDF Converter steht auf: http://www.amyuni.com/de/developer/pdfconverter zum Download bereit.

Ein Beispiel für die Konvertierung von Dokumenten in PDF steht auf: http://www.amyuni.com/de/resources/technicalnotes/ zur Verfügung.


View PDF for Silverlight Demo >

Download der 30-Tage freien Testversion für >

Jetzt erwerben >


Base Logos


-
  © Amyuni Technologies Inc. TEL. U.S. 1-866-926-9864 (9-AMYUNI) EUR (+33). 1-30-61-07-97 Sitemap | Impressum | Blog | Kontakt | sales@amyuni.com
-