Secure PDF Viewer

ā§Ē.ā§Ģ
ā§­ā§Ļā§Ž āϟāĻž āĻĒā§°ā§āϝāĻžāϞ⧋āϚāύāĻž
ā§§Â āϞāĻžāĻ–+
āĻĄāĻžāωāύāĻ˛â€™āĻĄ
āϏāĻŽāϞ⧰ āĻŽā§‚āĻ˛ā§āϝāĻžāĻ‚āĻ•āύ
USK: āϏāĻ•āϞ⧋ āĻŦ⧟āϏ⧰ āĻŦāĻžāĻŦ⧇
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ
āĻ¸ā§āĻ•ā§ā§°ā§€āύāĻļā§āĻŦāϟ⧰ āĻĒā§āϰāϤāĻŋāĻšā§āĻ›āĻŦāĻŋ

āĻāχ āĻāĻĒā§â€ŒāĻŸā§‹ā§° āĻŦāĻŋāĻˇā§Ÿā§‡

Simple Android PDF viewer based on pdf.js and content providers. The app doesn't require any permissions. The PDF stream is fed into the sandboxed WebView without giving it access to the network, files, content providers or any other data.

Content-Security-Policy is used to enforce that the JavaScript and styling properties within the WebView are entirely static content from the APK assets along with blocking custom fonts since pdf.js handles rendering those itself.

It reuses the hardened Chromium rendering stack while only exposing a tiny subset of the attack surface compared to actual web content. The PDF rendering code itself is memory safe with dynamic code evaluation disabled, and even if an attacker did gain code execution by exploiting the underlying web rendering engine, they're within the Chromium renderer sandbox with less access than it would have within the browser.
āφāĻĒāĻĄā§‡â€™āϟ āϕ⧰āĻž āϤāĻžā§°āĻŋāĻ–
ā§Šā§§-ā§Ļā§Ž-⧍ā§Ļ⧍ā§Ģ

āĻĄā§‡āϟāĻž āϏ⧁⧰āĻ•ā§āώāĻž

āĻŦāĻŋāĻ•āĻžāĻļāĻ•ā§°ā§āϤāĻžāϏāĻ•āϞ⧇ āφāĻĒā§‹āύāĻžā§° āĻĄā§‡āϟāĻž āϕ⧇āύ⧇āĻ•ā§ˆ āϏāĻ‚āĻ—ā§ā§°āĻš āφ⧰⧁ āĻļā§āĻŦā§‡ā§ŸāĻžā§° āϕ⧰⧇ āĻ¸ā§‡ā§ŸāĻž āĻŦ⧁āϜāĻŋ āĻĒā§‹ā§ąāĻžā§° āϜ⧰āĻŋ⧟āϤ⧇ āϏ⧁⧰āĻ•ā§āώāĻž āφ⧰āĻŽā§āĻ­ āĻšā§ŸāĨ¤ āĻĄā§‡āϟāĻžā§° āĻ—ā§‹āĻĒāĻ¨ā§€ā§ŸāϤāĻž āφ⧰⧁ āϏ⧁⧰āĻ•ā§āώāĻž āĻĒā§ā§°āĻŖāĻžāϞ⧀ āφāĻĒā§‹āύāĻžā§° āĻŦā§āĻ¯ā§ąāĻšāĻžā§°, āĻ…āĻžā§āϚāϞ āφ⧰⧁ āĻŦāϝāĻŧāϏ⧰ āĻ“āĻĒā§°āϤ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āϕ⧰āĻŋ āĻ­āĻŋāĻ¨ā§āύ āĻšâ€™āĻŦ āĻĒāĻžā§°ā§‡āĨ¤ āĻŦāĻŋāĻ•āĻžāĻļāĻ•ā§°ā§āϤāĻžāĻ—ā§°āĻžāĻ•ā§€ā§Ÿā§‡ āĻāχ āϤāĻĨā§āϝāĻ–āĻŋāύāĻŋ āĻĒā§ā§°āĻĻāĻžāύ āϕ⧰āĻŋāϛ⧇ āφ⧰⧁ āϏāĻŽā§Ÿā§° āϞāϗ⧇ āϞāϗ⧇ āĻā§ŸāĻž āφāĻĒāĻĄā§‡â€™āϟ āϕ⧰āĻŋāĻŦ āĻĒāĻžā§°ā§‡āĨ¤
āϤ⧃āĻ¤ā§€ā§Ÿ āĻĒāĻ•ā§āώ⧰ āϏ⧈āϤ⧇ āϕ⧋āύ⧋ āĻĄā§‡āϟāĻž āĻļā§āĻŦ⧇āϝāĻŧāĻžā§° āϕ⧰āĻž āύāĻžāχ
āĻŦāĻŋāĻ•āĻžāĻļāĻ•ā§°ā§āϤāĻžāχ āĻĄā§‡āϟāĻž āĻļā§āĻŦā§‡ā§ŸāĻžā§° āϕ⧰āĻžā§° āĻŦāĻŋāĻˇā§Ÿā§‡ āϕ⧇āύ⧇āĻ•ā§ˆ āĻ˜ā§‹āώāĻŖāĻž āϕ⧰⧇ āϏ⧇āχ āĻŦāĻŋāĻˇā§Ÿā§‡ āĻ…āϧāĻŋāĻ• āϜāĻžāύāĻ•
āϕ⧋āύ⧋ āĻĄā§‡āϟāĻž āϏāĻ‚āĻ—ā§ā§°āĻš āϕ⧰āĻž āĻšā§‹ā§ąāĻž āύāĻžāχ
āĻŦāĻŋāĻ•āĻžāĻļāĻ•ā§°ā§āϤāĻžāχ āĻĄā§‡āϟāĻž āϏāĻ‚āĻ—ā§ā§°āĻš āϕ⧰āĻžā§° āĻŦāĻŋāĻˇā§Ÿā§‡ āϕ⧇āύ⧇āĻ•ā§ˆ āĻ˜ā§‹āώāĻŖāĻž āϕ⧰⧇ āϏ⧇āχ āĻŦāĻŋāĻˇā§Ÿā§‡ āĻ…āϧāĻŋāĻ• āϜāĻžāύāĻ•
Play āĻĒā§°āĻŋ⧟āĻžāϞ⧰ āύ⧀āϤāĻŋ āĻ…āύ⧁āϏ⧰āĻŖ āϕ⧰āĻŋāĻŦāϞ⧈ āĻŦāĻĻā§āϧāĻĒā§°āĻŋāϕ⧰

āĻŽā§‚āĻ˛ā§āϝāĻžāĻ‚āĻ•āύ āφ⧰⧁ āĻĒā§°ā§āϝāĻžāϞ⧋āϚāύāĻžāϏāĻŽā§‚āĻš

ā§Ē.ā§Ģ
ā§Ŧā§Ŧ⧝ āϟāĻž āĻĒā§°ā§āϝāĻžāϞ⧋āϚāύāĻž

āύāϤ⧁āύ āĻ•āĻŋ āφāϛ⧇

Notable changes in version 31:

â€ĸ minor fixes for edge-to-edge support
â€ĸ fix issue causing the text layer used for text selection to not rotate when the PDF is rotated within the app
â€ĸ enable hardware memory tagging for use outside of GrapheneOS in the narrow cases where it's available
â€ĸ update pdf.js to 5.4.149
â€ĸ update other npm dependencies
â€ĸ update AndroidX libraries
â€ĸ update Android SDK and toolchain

See https://github.com/GrapheneOS/PdfViewer/releases/tag/31 for the full release notes.

āĻāĻĒā§° āϏāĻŽā§°ā§āĻĨāύ

āĻŦāĻŋāĻ•āĻžāĻļāĻ•ā§°ā§āϤāĻžā§° āĻŦāĻŋāĻˇā§Ÿā§‡
GrapheneOS Foundation
contact@grapheneos.org
198 Bain Ave Toronto, ON M4K 1G1 Canada
+1 647-760-4804

GrapheneOSā§° āĻĻā§āĻŦāĻžā§°āĻž āφ⧰⧁ āĻ…āϧāĻŋāĻ•

āĻāϕ⧇āϧ⧰āĻŖā§° āĻāĻĒā§