Skip to content

Commit c3cb5b2

Browse files
committed
Optimize PDF view performance and stability
* Prevent unnecessary property updates in handlers by checking for value changes before assigning. * Ensure all PDF document and view updates on iOS are performed on the main thread. * Optimize stream-based PDF loading on iOS for better efficiency. * Correct the method call for stream-based PDF loading on Android.
1 parent 004e734 commit c3cb5b2

File tree

4 files changed

+42
-44
lines changed

4 files changed

+42
-44
lines changed

src/MauiNativePdfView/Platforms/Android/PdfViewAndroid.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ private void LoadDocument()
294294
{
295295
FilePdfSource fileSource => _pdfView.FromFile(new Java.IO.File(fileSource.FilePath)),
296296
UriPdfSource uriSource => _pdfView.FromUri(global::Android.Net.Uri.Parse(uriSource.Uri.ToString())),
297-
StreamPdfSource streamSource => FromStream(streamSource.Stream),
297+
StreamPdfSource streamSource => _pdfView.FromStream(streamSource.Stream),
298298
BytesPdfSource bytesSource => _pdfView.FromBytes(bytesSource.Data),
299299
AssetPdfSource assetSource => _pdfView.FromAsset(assetSource.AssetName),
300300
_ => throw new NotSupportedException($"PDF source type {_source.GetType().Name} is not supported.")

src/MauiNativePdfView/Platforms/Android/PdfViewHandler.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,135 +148,135 @@ private void OnRendered(object? sender, RenderedEventArgs e)
148148

149149
private static void MapSource(PdfViewHandler handler, PdfView view)
150150
{
151-
if (handler._pdfViewWrapper != null)
151+
if (handler._pdfViewWrapper != null && !ReferenceEquals(handler._pdfViewWrapper.Source, view.Source))
152152
{
153153
handler._pdfViewWrapper.Source = view.Source;
154154
}
155155
}
156156

157157
private static void MapEnableZoom(PdfViewHandler handler, PdfView view)
158158
{
159-
if (handler._pdfViewWrapper != null)
159+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableZoom != view.EnableZoom)
160160
{
161161
handler._pdfViewWrapper.EnableZoom = view.EnableZoom;
162162
}
163163
}
164164

165165
private static void MapEnableSwipe(PdfViewHandler handler, PdfView view)
166166
{
167-
if (handler._pdfViewWrapper != null)
167+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableSwipe != view.EnableSwipe)
168168
{
169169
handler._pdfViewWrapper.EnableSwipe = view.EnableSwipe;
170170
}
171171
}
172172

173173
private static void MapEnableTapGestures(PdfViewHandler handler, PdfView view)
174174
{
175-
if (handler._pdfViewWrapper != null)
175+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableTapGestures != view.EnableTapGestures)
176176
{
177177
handler._pdfViewWrapper.EnableTapGestures = view.EnableTapGestures;
178178
}
179179
}
180180

181181
private static void MapEnableLinkNavigation(PdfViewHandler handler, PdfView view)
182182
{
183-
if (handler._pdfViewWrapper != null)
183+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableLinkNavigation != view.EnableLinkNavigation)
184184
{
185185
handler._pdfViewWrapper.EnableLinkNavigation = view.EnableLinkNavigation;
186186
}
187187
}
188188

189189
private static void MapZoom(PdfViewHandler handler, PdfView view)
190190
{
191-
if (handler._pdfViewWrapper != null)
191+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.Zoom - view.Zoom) > float.Epsilon)
192192
{
193193
handler._pdfViewWrapper.Zoom = view.Zoom;
194194
}
195195
}
196196

197197
private static void MapMinZoom(PdfViewHandler handler, PdfView view)
198198
{
199-
if (handler._pdfViewWrapper != null)
199+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.MinZoom - view.MinZoom) > float.Epsilon)
200200
{
201201
handler._pdfViewWrapper.MinZoom = view.MinZoom;
202202
}
203203
}
204204

205205
private static void MapMaxZoom(PdfViewHandler handler, PdfView view)
206206
{
207-
if (handler._pdfViewWrapper != null)
207+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.MaxZoom - view.MaxZoom) > float.Epsilon)
208208
{
209209
handler._pdfViewWrapper.MaxZoom = view.MaxZoom;
210210
}
211211
}
212212

213213
private static void MapPageSpacing(PdfViewHandler handler, PdfView view)
214214
{
215-
if (handler._pdfViewWrapper != null)
215+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.PageSpacing - view.PageSpacing) > float.Epsilon)
216216
{
217217
handler._pdfViewWrapper.PageSpacing = view.PageSpacing;
218218
}
219219
}
220220

221221
private static void MapFitPolicy(PdfViewHandler handler, PdfView view)
222222
{
223-
if (handler._pdfViewWrapper != null)
223+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.FitPolicy != view.FitPolicy)
224224
{
225225
handler._pdfViewWrapper.FitPolicy = view.FitPolicy;
226226
}
227227
}
228228

229229
private static void MapDisplayMode(PdfViewHandler handler, PdfView view)
230230
{
231-
if (handler._pdfViewWrapper != null)
231+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.DisplayMode != view.DisplayMode)
232232
{
233233
handler._pdfViewWrapper.DisplayMode = view.DisplayMode;
234234
}
235235
}
236236

237237
private static void MapScrollOrientation(PdfViewHandler handler, PdfView view)
238238
{
239-
if (handler._pdfViewWrapper != null)
239+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.ScrollOrientation != view.ScrollOrientation)
240240
{
241241
handler._pdfViewWrapper.ScrollOrientation = view.ScrollOrientation;
242242
}
243243
}
244244

245245
private static void MapDefaultPage(PdfViewHandler handler, PdfView view)
246246
{
247-
if (handler._pdfViewWrapper != null)
247+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.DefaultPage != view.DefaultPage)
248248
{
249249
handler._pdfViewWrapper.DefaultPage = view.DefaultPage;
250250
}
251251
}
252252

253253
private static void MapEnableAntialiasing(PdfViewHandler handler, PdfView view)
254254
{
255-
if (handler._pdfViewWrapper != null)
255+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableAntialiasing != view.EnableAntialiasing)
256256
{
257257
handler._pdfViewWrapper.EnableAntialiasing = view.EnableAntialiasing;
258258
}
259259
}
260260

261261
private static void MapUseBestQuality(PdfViewHandler handler, PdfView view)
262262
{
263-
if (handler._pdfViewWrapper != null)
263+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.UseBestQuality != view.UseBestQuality)
264264
{
265265
handler._pdfViewWrapper.UseBestQuality = view.UseBestQuality;
266266
}
267267
}
268268

269269
private static void MapBackgroundColor(PdfViewHandler handler, PdfView view)
270270
{
271-
if (handler._pdfViewWrapper != null)
271+
if (handler._pdfViewWrapper != null && !Equals(handler._pdfViewWrapper.BackgroundColor, view.BackgroundColor))
272272
{
273273
handler._pdfViewWrapper.BackgroundColor = view.BackgroundColor;
274274
}
275275
}
276276

277277
private static void MapEnableAnnotationRendering(PdfViewHandler handler, PdfView view)
278278
{
279-
if (handler._pdfViewWrapper != null)
279+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableAnnotationRendering != view.EnableAnnotationRendering)
280280
{
281281
handler._pdfViewWrapper.EnableAnnotationRendering = view.EnableAnnotationRendering;
282282
}

src/MauiNativePdfView/Platforms/iOS/PdfViewHandler.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -144,135 +144,135 @@ private void OnAnnotationTapped(object? sender, AnnotationTappedEventArgs e)
144144

145145
public static void MapSource(PdfViewHandler handler, PdfView view)
146146
{
147-
if (handler._pdfViewWrapper != null)
147+
if (handler._pdfViewWrapper != null && !ReferenceEquals(handler._pdfViewWrapper.Source, view.Source))
148148
{
149149
handler._pdfViewWrapper.Source = view.Source;
150150
}
151151
}
152152

153153
public static void MapEnableZoom(PdfViewHandler handler, PdfView view)
154154
{
155-
if (handler._pdfViewWrapper != null)
155+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableZoom != view.EnableZoom)
156156
{
157157
handler._pdfViewWrapper.EnableZoom = view.EnableZoom;
158158
}
159159
}
160160

161161
public static void MapEnableSwipe(PdfViewHandler handler, PdfView view)
162162
{
163-
if (handler._pdfViewWrapper != null)
163+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableSwipe != view.EnableSwipe)
164164
{
165165
handler._pdfViewWrapper.EnableSwipe = view.EnableSwipe;
166166
}
167167
}
168168

169169
public static void MapEnableTapGestures(PdfViewHandler handler, PdfView view)
170170
{
171-
if (handler._pdfViewWrapper != null)
171+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableTapGestures != view.EnableTapGestures)
172172
{
173173
handler._pdfViewWrapper.EnableTapGestures = view.EnableTapGestures;
174174
}
175175
}
176176

177177
public static void MapEnableLinkNavigation(PdfViewHandler handler, PdfView view)
178178
{
179-
if (handler._pdfViewWrapper != null)
179+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableLinkNavigation != view.EnableLinkNavigation)
180180
{
181181
handler._pdfViewWrapper.EnableLinkNavigation = view.EnableLinkNavigation;
182182
}
183183
}
184184

185185
public static void MapZoom(PdfViewHandler handler, PdfView view)
186186
{
187-
if (handler._pdfViewWrapper != null)
187+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.Zoom - view.Zoom) > float.Epsilon)
188188
{
189189
handler._pdfViewWrapper.Zoom = view.Zoom;
190190
}
191191
}
192192

193193
public static void MapMinZoom(PdfViewHandler handler, PdfView view)
194194
{
195-
if (handler._pdfViewWrapper != null)
195+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.MinZoom - view.MinZoom) > float.Epsilon)
196196
{
197197
handler._pdfViewWrapper.MinZoom = view.MinZoom;
198198
}
199199
}
200200

201201
public static void MapMaxZoom(PdfViewHandler handler, PdfView view)
202202
{
203-
if (handler._pdfViewWrapper != null)
203+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.MaxZoom - view.MaxZoom) > float.Epsilon)
204204
{
205205
handler._pdfViewWrapper.MaxZoom = view.MaxZoom;
206206
}
207207
}
208208

209209
public static void MapPageSpacing(PdfViewHandler handler, PdfView view)
210210
{
211-
if (handler._pdfViewWrapper != null)
211+
if (handler._pdfViewWrapper != null && Math.Abs(handler._pdfViewWrapper.PageSpacing - view.PageSpacing) > float.Epsilon)
212212
{
213213
handler._pdfViewWrapper.PageSpacing = view.PageSpacing;
214214
}
215215
}
216216

217217
public static void MapFitPolicy(PdfViewHandler handler, PdfView view)
218218
{
219-
if (handler._pdfViewWrapper != null)
219+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.FitPolicy != view.FitPolicy)
220220
{
221221
handler._pdfViewWrapper.FitPolicy = view.FitPolicy;
222222
}
223223
}
224224

225225
public static void MapDisplayMode(PdfViewHandler handler, PdfView view)
226226
{
227-
if (handler._pdfViewWrapper != null)
227+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.DisplayMode != view.DisplayMode)
228228
{
229229
handler._pdfViewWrapper.DisplayMode = view.DisplayMode;
230230
}
231231
}
232232

233233
public static void MapScrollOrientation(PdfViewHandler handler, PdfView view)
234234
{
235-
if (handler._pdfViewWrapper != null)
235+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.ScrollOrientation != view.ScrollOrientation)
236236
{
237237
handler._pdfViewWrapper.ScrollOrientation = view.ScrollOrientation;
238238
}
239239
}
240240

241241
public static void MapDefaultPage(PdfViewHandler handler, PdfView view)
242242
{
243-
if (handler._pdfViewWrapper != null)
243+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.DefaultPage != view.DefaultPage)
244244
{
245245
handler._pdfViewWrapper.DefaultPage = view.DefaultPage;
246246
}
247247
}
248248

249249
public static void MapEnableAntialiasing(PdfViewHandler handler, PdfView view)
250250
{
251-
if (handler._pdfViewWrapper != null)
251+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableAntialiasing != view.EnableAntialiasing)
252252
{
253253
handler._pdfViewWrapper.EnableAntialiasing = view.EnableAntialiasing;
254254
}
255255
}
256256

257257
public static void MapUseBestQuality(PdfViewHandler handler, PdfView view)
258258
{
259-
if (handler._pdfViewWrapper != null)
259+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.UseBestQuality != view.UseBestQuality)
260260
{
261261
handler._pdfViewWrapper.UseBestQuality = view.UseBestQuality;
262262
}
263263
}
264264

265265
public static void MapBackgroundColor(PdfViewHandler handler, PdfView view)
266266
{
267-
if (handler._pdfViewWrapper != null)
267+
if (handler._pdfViewWrapper != null && !Equals(handler._pdfViewWrapper.BackgroundColor, view.BackgroundColor))
268268
{
269269
handler._pdfViewWrapper.BackgroundColor = view.BackgroundColor;
270270
}
271271
}
272272

273273
public static void MapEnableAnnotationRendering(PdfViewHandler handler, PdfView view)
274274
{
275-
if (handler._pdfViewWrapper != null)
275+
if (handler._pdfViewWrapper != null && handler._pdfViewWrapper.EnableAnnotationRendering != view.EnableAnnotationRendering)
276276
{
277277
handler._pdfViewWrapper.EnableAnnotationRendering = view.EnableAnnotationRendering;
278278
}

src/MauiNativePdfView/Platforms/iOS/PdfViewiOS.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ public PdfSource? Source
5858
get => _source;
5959
set
6060
{
61+
if (ReferenceEquals(_source, value))
62+
return;
63+
6164
_source = value;
6265
LoadDocument();
6366
}
@@ -303,12 +306,7 @@ private void LoadDocument()
303306
break;
304307

305308
case StreamPdfSource streamSource:
306-
using (var memoryStream = new MemoryStream())
307-
{
308-
streamSource.Stream.CopyTo(memoryStream);
309-
var data = NSData.FromArray(memoryStream.ToArray());
310-
document = new PdfDocument(data);
311-
}
309+
document = new PdfDocument(NSData.FromStream(streamSource.Stream));
312310
break;
313311

314312
case BytesPdfSource bytesSource:
@@ -360,7 +358,7 @@ private void LoadDocument()
360358
}
361359
}
362360

363-
_pdfView.Document = document;
361+
MainThread.BeginInvokeOnMainThread(() => _pdfView.Document = document);
364362

365363
// Get document metadata
366364
var pageCount = (int)document.PageCount;
@@ -395,7 +393,7 @@ private void LoadDocument()
395393
if (!_documentLoaded)
396394
{
397395
_documentLoaded = true;
398-
System.Threading.Tasks.Task.Delay(100).ContinueWith(_ =>
396+
Task.Delay(100).ContinueWith(_ =>
399397
{
400398
MainThread.BeginInvokeOnMainThread(() =>
401399
{
@@ -435,7 +433,7 @@ private void UpdateAnnotationVisibility()
435433
}
436434

437435
// Force refresh the view
438-
_pdfView.SetNeedsDisplay();
436+
MainThread.BeginInvokeOnMainThread(() => _pdfView.SetNeedsDisplay());
439437
}
440438

441439
private void OnPageChangedNotification(NSNotification notification)

0 commit comments

Comments
 (0)