SharePoint Online で PDF ファイルを活用する


こんにちは。

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 ファイル自体の新規作成の機能になってしまうので、そのまま使えないんですけどね。。。)

 

Comments (0)

Skip to main content