こんにちは。
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; else item["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