PDFViewer for WPF/Silverlight
保護されている可能性のあるファイルを開く
PdfViewer for WPF/Silverlightの概要 > タスク別ヘルプ > 保護されている可能性のあるファイルを開く

エンドユーザーが PDF ファイルを開くことができるようにする場合、そのファイルがパスワード保護されるかどうかを予測できないことがあります。次のサンプルの方法は、このことをチェックして、それに従ってドキュメントを開く方法を示しています。

コードのコピー
   Private Sub _btnOpen_Click(sender As Object, e As RoutedEventArgs)
        Dim dlg = New OpenFileDialog()
        dlg.Filter = "Pdf files (*.pdf)|*.pdf"
        If dlg.ShowDialog().Value Then
            Dim ms = New System.IO.MemoryStream()
            Using stream = dlg.File.OpenRead()
              stream.CopyTo(ms)
            End Using
            LoadProtectedDocument(ms, Nothing)
            End If
    End Sub
コードのコピー
 void _btnOpen_Click(object sender, RoutedEventArgs e)
        {
            var dlg = new OpenFileDialog();
            dlg.Filter = "Pdf files (*.pdf)|*.pdf";
            if (dlg.ShowDialog().Value)
            {
                var ms = new System.IO.MemoryStream();
                using (var stream = dlg.File.OpenRead())
                {
                    stream.CopyTo(ms);
                }
                LoadProtectedDocument(ms, null);
            }
        }

保護されたファイルを読み取る場合は、LoadProtectedDocument メソッドを呼び出します。パスワードを null にしてこのメソッドを呼び出すと、保護されていないファイルが開きます。ファイルがパスワード保護(暗号化)されている場合は、例外が生成され、キャッチされます。次に、ユーザーは、実際のパスワードの入力を要求され、メソッドが自分自身を再帰的に呼び出します。

コードのコピー
' パスワード保護された PDF ドキュメントを読み込みます。
    Private Sub LoadProtectedDocument(stream As System.IO.MemoryStream, password As String)
        Try
            stream.Position = 0
            _viewer.LoadDocument(stream, password)
        Catch x As Exception
            'if (x.Message.IndexOf("password") > -1)
            '{
            Dim msg = "This file seems to be password-protected." & vbCr & vbLf & "Please provide the password and try again."
            C1.Silverlight.C1PromptBox.Show(msg, "Enter Password", Function(text, result)
              If result = MessageBoxResult.OK Then
                ' ユーザーが指定したパスワードを使用して、もう一度試してください
                LoadProtectedDocument(stream, text)
              End If
          '}
          'else
          '{
          '    throw;
          '}
         End Function)
      End Try
    End Sub
コードのコピー
  // パスワード保護された PDF ドキュメントを読み込みます。
        void LoadProtectedDocument(System.IO.MemoryStream stream, string password)
        {
            try
            {
                stream.Position = 0;
                _viewer.LoadDocument(stream, password);
            }
            catch (Exception x)
            {
                //if (x.Message.IndexOf("password") > -1)
                //{
                var msg = "This file seems to be password-protected.\r\nPlease provide the password and try again.";
                C1.Silverlight.C1PromptBox.Show(msg, "Enter Password", (text, result) =>
                {
                    if (result == MessageBoxResult.OK)
                    {
                        // ユーザーが指定したパスワードを使用して、もう一度試してください
                        LoadProtectedDocument(stream, text);
                    }
                });
                //}
                //else
                //{
                //    throw;
                //}
            }
        }