using System;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
namespace PdfiumViewer.WPFDemo
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
CancellationTokenSource tokenSource;
Process currentProcess = Process.GetCurrentProcess();
PdfDocument pdfDoc;
public MainWindow()
{
InitializeComponent();
}
private async void RenderToMemDCButton_Click(object sender, RoutedEventArgs e)
{
if (pdfDoc == null)
{
MessageBox.Show("First load the document");
return;
}
int width = (int)(this.ActualWidth - 30) / 2;
int height = (int)this.ActualHeight - 30;
Stopwatch sw = new Stopwatch();
sw.Start();
try
{
for (int i = 1; i < pdfDoc.PageCount; i++)
{
imageMemDC.Source =
await
Task.Run(
new Func(
() =>
{
tokenSource.Token.ThrowIfCancellationRequested();
return RenderPageToMemDC(i, width, height);
}
), tokenSource.Token);
labelMemDC.Content = String.Format("Renderd Pages: {0}, Memory: {1} MB, Time: {2:0.0} sec",
i,
currentProcess.PrivateMemorySize64 / (1024 * 1024),
sw.Elapsed.TotalSeconds);
currentProcess.Refresh();
GC.Collect();
}
}
catch (Exception ex)
{
tokenSource.Cancel();
MessageBox.Show(ex.Message);
}
sw.Stop();
labelMemDC.Content = String.Format("Rendered {0} Pages within {1:0.0} seconds, Memory: {2} MB",
pdfDoc.PageCount,
sw.Elapsed.TotalSeconds,
currentProcess.PrivateMemorySize64 / (1024 * 1024));
}
private BitmapSource RenderPageToMemDC(int page, int width, int height)
{
var image = pdfDoc.Render(page, width, height, 96, 96, false);
return BitmapHelper.ToBitmapSource(image);
}
private void LoadPDFButton_Click(object sender, RoutedEventArgs e)
{
using (var dialog = new System.Windows.Forms.OpenFileDialog())
{
dialog.Filter = "PDF Files (*.pdf)|*.pdf|All Files (*.*)|*.*";
dialog.Title = "Open PDF File";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
pdfDoc = PdfDocument.Load(dialog.FileName);
}
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
tokenSource = new CancellationTokenSource();
}
private void Window_Closed(object sender, EventArgs e)
{
if (tokenSource != null)
tokenSource.Cancel();
if (pdfDoc != null)
pdfDoc.Dispose();
}
private void DoSearch_Click(object sender, RoutedEventArgs e)
{
string text = searchValueTextBox.Text;
bool matchCase = matchCaseCheckBox.IsChecked.GetValueOrDefault();
bool wholeWordOnly = wholeWordOnlyCheckBox.IsChecked.GetValueOrDefault();
DoSearch(text, matchCase, wholeWordOnly);
}
private void DoSearch(string text, bool matchCase, bool wholeWord)
{
var matches = pdfDoc.Search(text, matchCase, wholeWord);
var sb = new StringBuilder();
foreach (var match in matches.Items)
{
sb.AppendLine(
String.Format(
"Found \"{0}\" in page: {1}", match.Text, match.Page)
);
}
searchResultLabel.Text = sb.ToString();
}
}
}