10. November 2015 · von Joerg Sager

Native PDF-Generierung in Office 365 ohne Erweiterung

In diesem Blog-Eintrag möchten wir euch eine Lösung aufzeigen, welche oft erfragt wird. „Wie kann ich in Office 365 oder SharePoint Online ein PDF generieren.“ Die Wordautomation-Services stehen in der Cloud-Version von SharePoint nicht zur Verfügung. Doch geht es trotzdem?

pdf_download

In den Word-WebApps gibt es eine Funktion „Als PDF herunterladen“. Das bedeutet, der SharePoint bzw. die Office Apps bringen diese Funktionalität mit.

Nach einer kurzen Recherche fanden wir auch die „JavaScript API for Office„, welche angeblich eine Funktion mitbringt, die wie folgt beschrieben wird:

Get the document as PDF with the getFileAsync method in add-ins for PowerPoint and Word.

Leider fehlen dort sämtliche Dokumentationen oder Beispiele. Das heißt, an dieser Stelle kamen wir nicht weiter. Gegebenenfalls können wir zukünftig dahin wechseln.

Da das aber die Anforderung nicht löst, dass eine Word-Datei (docx) zu einem PDF generiert werden soll, haben wir tiefer ins System geschaut. Mit dem Web Debugging Tool von Telerik (Fiddler) haben wir den Handshake untersucht, welcher zwischen SharePoint und den Office-Apps stattfindet.

 

 

In der Analyse durch Fiddler konnten wir ziemlich schnell den Handshake nachvollziehen. Der endgültige Link, welcher durch die Word-WebApps aufgerufen wird, damit das PDF zum Download erscheint, sieht wie folgt aus:

https://euc-word-view.officeapps.live.com/wv/WordViewer/request.pdf?WOPIsrc=https://<IHRE_URL>.sharepoint.com/_vti_bin/wopi.ashx/files/{FILE_ID}&access_token={ACCESS_TOKEN}&access_token_ttl={ACCESS_TOKEN_TTL}&type=downloadpdf

Das bedeutet, dass das Erzeugen von PDFs in den Office-Apps extern von SharePoint stattfindet. Die Office Apps können mit der SharePoint Site ähnlich wie provider hosted apps über OAUTH2.0 kommunizieren.

Dieser Weg erscheint nach einem brauchbaren Workaround, in den nicht zu viel Aufwand fließt.

Umsetzung

Wie so oft auf unserem Blog möchten wir an dieser Stelle erneut mit einem Beispielcode starten:

// Dokumenten Bibliothek abfragen
var clientContext = SP.ClientContext.get_current();
var spWeb = clientContext.get_web();
var docList = spWeb.get_lists().getByTitle("SampleDocList");

// Dokument erzeugen, zip ist ein JSZip Objekt welches eine WordDatei repräsentiert
var fileCreateInfo = new SP.FileCreationInformation();
fileCreateInfo.set_url(filename);
fileCreateInfo.set_overwrite(true);
fileCreateInfo.set_content(new SP.Base64EncodedByteArray());
var fileContent = zip.generate({ type: "uint8array" });
for (var curByte = 0; curByte < fileContent.length; ++curByte) {
    fileCreateInfo.get_content().append(fileContent[curByte]);
}
var newFile = docList.get_rootFolder().get_files().add(fileCreateInfo);

// Daten an SharePoint senden
clientContext.load(spWeb);
clientContext.load(newFile);
clientContext.executeQueryAsync(
    function () {
        // Daten des Listenitems abfragen, nötig für die UniqueId
        var listItem = newFile.get_listItemAllFields();
        clientContext.load(listItem);
        clientContext.executeQueryAsync(
        function() {
            // Access Tokens abfragen
            var sourcedoc = "{" + listItem.get_item("UniqueId").toString() + "}";
            jQuery.get(spWeb.get_url() + "/_layouts/15/WopiFrame.aspx?sourcedoc=" + sourcedoc + "&file=" + encodeURIComponent(filename) + "&action=default",
                function (data) {
                    // Microsoft Word Konvertierungsservice nutzen um Datei in PDF umzuwandeln
                    var accessToken = jQuery(data).find("input[name='access_token']").val();
                    var accessToken_ttl = jQuery(data).find("input[name='access_token_ttl']").val();
                    window.location = "https://euc-word-view.officeapps.live.com/wv/WordViewer/request.pdf?WOPIsrc=" + spWeb.get_url() + "/_vti_bin/wopi.ashx/files/" + sourcedoc.replace("{", "").replace("}", "").toLowerCase() + "&access_token=" + accessToken + "&access_token_ttl=" + accessToken_ttl + "&type=downloadpdf";
                });
            },
            function (sender, args) {
                console.log(args.get_message());
            });
        },
        function (sender, args) {
            console.log(args.get_message());
        }
);

Zu Beginn dieses Codebeispiels wird ein neues Word Dokument in einer Dokumenten Library gespeichert. Dieses Dokument wurde innerhalb von JavaScript aus einem Template generiert und mit entsprechenden Daten befüllt, dazu in einem zukünftigen Blogartikel mehr.
Das entscheidende an dieser Stelle ist, dass ein Dokument per JSOM abgefragt wird. Es wäre an dieser Stelle beispielsweise auch denkbar, ein Dokument per Id abzufragen.

Danach wird das zum Dokument gehörige Listitem abgefragt. Dies ist notwendig, um die UniqueId des Dokumentes abzufragen. Neben der UniqueId des Dokuments werden gewisse AccessTokens benötigt, um Zugriff auf die Office Apps zu erhalten. Dieses ist relativ einfach, indem man die Word Online App per Ajax Request abfragt. Innerhalb der Antwort lassen sich die notwendigen Tokens finden. Dieses wird durch den Aufruf von jQuery.get umgesetzt.

Danach sind alle notwendigen Daten zusammen und man kann den Nutzer auf die Office Apps weiterleiten, wo er die Datei als PDF Download erhält.



Diesen Blogeintrag bewerten:

8 Stimmen mit durchschnittlich 4.1/5 Punkten

Haben Sie Fragen zu diesem Artikel oder brauchen Sie Unterstützung?

Nehmen Sie mit uns Kontakt auf!

Wir unterstützen Sie gerne bei Ihren SharePoint-Vorhaben!


Schreibe einen Kommentar

Kontakt.
Lassen Sie sich von uns beraten
Wir freuen uns über Ihr Interesse an unseren Leistungen. Hinterlassen Sie
uns Ihren Namen, Ihre Telefonnummer und E-Mail Adresse – wir melden
uns schnellstmöglich bei Ihnen.
Kontakt aufnehmen