こんにちは。
Office 365 コミュニティ ブログ で書かれているように、Office 365 Update によって、SharePoint Online で PDF ファイルの閲覧が可能です。この Update は、5 月末までの展開 (roll out) 完了予定で、もう皆さんの環境 (SharePoint Online) でも反映されていることでしょう。
ということで、今回は、この機能について簡単に紹介します。
まず、この機能は、Adobe Reader がインストールする ActiveX コントロールとの協調動作となるため、さまざまな情報ソースにも書かれていますが、必ず、以下の環境設定をおこなって使用してください。
- 使用するクライアント (ブラウザー側のマシン) に、Adobe Acrobat Reader 10.1.2 以上をインストールしてください。バージョンが古いと、Acrobat の ActiveX が対応していないため、クリック時に、「ダウンロード」(ファイルの保存) が表示されます。
- Internet Explorer のインターネット オプションで、[信頼済みサイト] (Trusted Site) に、お使いの SharePoint Online のサイトのドメインを登録してください。
- SharePoint Online のログイン時に、「サインアウトしない」 (Keep me signed in) を選択して、ログインしてください。(起動するアプリケーションの画面上でもログインが維持されるようにするためです。)
SharePoint Online で PDF ファイルをドキュメント ライブラリーに登録すると、一見、エラー アイコンのようなものが表示されますが、実は、これは「PDF」を意味するアイコンです。(細かな理由は書きませんが、きっと、いろんな理由があったのでしょう。) 大きいアイコンで見ると、以下のように、ちゃんと「PDF」と書いていますね。
登録されたファイルをクリックすると、Adobe Reader が起動し、下図のダイアログ ボックスが表示されます。あとは、開いたり、チェックアウトするなどして、そのまま閲覧が可能です。
さて、プログラマーの方は、この機能を機能開発などで、どんどん活用してみましょう。
例えば、Adobe Acrobat Pro などで PDF フォームを作成し、SharePoint のリストのプロパティとプログラムを使って同期させることで、PDF フォームの内容を SharePoint 上に収集し、Excel と連携して集計などをおこなうことができます。(ちょうど、InfoPath フォームが、PDF フォームになったイメージです。)
下記は、PDF フォームがアップロード (またはチェックイン) された際に、リスト アイテムのプロパティを変更するサンプル コード (C#) です。著名な iTextSharp のライブラリーを使用しています。
(逆に、アイテムのプロパティが変更された際に、PDF ファイルに反映することもできます。)
. . .using iTextSharp;using iTextSharp.text;using iTextSharp.text.pdf;using iTextSharp.text.xml;using System.IO;. . .public class PDFListEventReceiver : SPItemEventReceiver{ // // handle add, update, and check-in // public override void ItemAdded(SPItemEventProperties properties) {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemAdded(properties); } public override void ItemUpdated(SPItemEventProperties properties) {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemUpdated(properties); } public override void ItemCheckedIn(SPItemEventProperties properties) {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemCheckedIn(properties); } // // read PDF form, and update listitem // internal void InternalUpdate(SPListItem item, SPFile file) {using (Stream stream = file.OpenBinaryStream()){ PdfReader pdfReader = new PdfReader(stream); item["FullName"] = pdfReader.AcroFields.GetField("person"); string satString = pdfReader.AcroFields.GetField("question1"); if (satString == "t_verygood")item["satisfaction"] = 5; else if (satString == "t_good")item["satisfaction"] = 4; else if (satString == "t_bad")item["satisfaction"] = 2; else if (satString == "t_verybad")item["satisfaction"] = 1; elseitem["satisfaction"] = 3; item.Update();} }}. . .
さらに高度な実装として、Contextual Ribbon を使って PDF ファイル独自の操作を呼び出したり、上記のようなイベント レシーバーを (サンドボックス ソリューションの) リスト定義 として配布することで、PDF を活用した高度なソリューションを 1 つのインストーラー (.wsp) として提供し、SharePoint Online に展開できます。
以前、Adobe 社のイベント (Adobe License User Forum) に登壇した際に お見せしたデモ は、まさに、この方法でプログラミングしていました。
なお、試してみましたが、PDF をドキュメント テンプレートに設定しても、残念ながら作成・編集はできないようです。(ActiveX コントロールの Create が呼ばれるのですが、Acrobat が対応していません。まあ、ここ、PDF フォームの新規入力ではなく、PDF ファイル自体の新規作成の機能になってしまうので、そのまま使えないんですけどね。。。)
Categories: Uncategorized