tutorial · 2026-01-28
How to Show a PDF in Unreal Engine 5 (In the Game World)
A practical guide to rendering real PDF pages onto in-world meshes with the Simple PDF Viewer plugin, from drop-in actor to full page navigation.
Why PDFs aren't natively supported in UE5
If you have ever tried to figure out how to show a PDF in Unreal Engine, you have probably discovered that the engine has no idea what a PDF is. There is no asset type for it, no importer that turns a .pdf into something you can place in a level, and no Blueprint node that draws a page. Unreal works in textures, meshes and materials, so a document format built around vector text and embedded fonts simply has nowhere to land.
The usual workarounds are all compromises. You can pre-export every page to PNG and import a stack of textures, which bloats your content and breaks the moment the source document changes. You can shell out to an external reader, which yanks the player out of your game. Neither approach gives you a real, multi-page document living inside the 3D world that the player can page through.
Simple PDF Viewer closes that gap by rasterising PDF pages to UTexture2D and displaying them on in-world meshes and actors. The rendering is powered by the bundled PDFium third-party library, so the document is rendered for real at the resolution you choose rather than baked ahead of time. This tutorial walks through the fastest route from a .pdf file on disk to a readable, navigable document in your level.
What the plugin gives you
There are two ways into the plugin, and which one you reach for depends on how much control you want. The drop-in route is the APDFViewerActor, which shows up in the editor as 'PDF Viewer'. Drag it into the level, point it at a file, and it builds its own display mesh and a dynamic material for you. The flexible route is the UPDFRenderComponent, a BlueprintSpawnableComponent you can bolt onto any actor of your own so an existing prop, screen or book becomes a PDF surface.
Both routes are backed by the same renderer and the same Blueprint surface. Page navigation is exposed through GoToPage, NextPage, PreviousPage, GoToFirstPage, GoToLastPage, GetCurrentPage and GetPageCount, so you are never locked into a single page. Loading raises Blueprint events you can bind to: OnPDFLoaded reports the page count, OnPDFLoadFailed hands you an error message, and OnPageChanged fires with the new page and the total whenever you move.
The plugin also ships a Blueprint function library for level-wide control, including GetAllPDFViewers and NavigateAllViewersToPage, plus content-relative and project-relative path helpers and an OpenPDFFileDialog you can call from editor utilities. To see it all wired together, open the included L_Demo level, which sets up a working viewer alongside the example Blueprint, the M_PDFDisplay material and a NoPDFLoaded placeholder.
Dropping in the PDF Viewer actor
Start by installing Simple PDF Viewer into your project's Plugins folder and enabling it, then restart the editor. The plugin is Windows-only (Win64), because the bundled PDFium renderer is shipped for Windows, and it targets Unreal Engine 5.5, 5.6 and 5.7. If you are on Mac, Linux or a console, this plugin is not for you.
1. With the plugin enabled, open the Place Actors panel or the Content menu and search for 'PDF Viewer'. Drag the APDFViewerActor into your level where you want the document to appear.
2. Select the actor and look at the Details panel. The actor is made of a root scene component with a 'DisplayMesh' static mesh and a 'PDFRenderer' component, but you do not have to touch the hierarchy to get a result.
3. Position and rotate the actor like any other mesh. You do not need to size it precisely yet, because the mesh will auto-orient itself from the page aspect ratio once a document loads, swapping between portrait and landscape to match the page.
Setting the file path and quality
With the actor placed, the next job is telling it which document to render and how crisp it should be. Everything here lives in the Details panel.
1. Set 'PDF File Path' to your document. You can use an absolute path on disk, or use the content-relative and project-relative path helpers from the Blueprint library to keep the reference portable across machines. If the PDF is encrypted, supply the optional Password so the renderer can open it.
2. Set 'DisplayWidth' to size the document in the world. This value is clamped between 10 and 1000 world units, and the matching height follows from the page aspect ratio, so a portrait page stays portrait. There is also an EmissiveStrength control (range 0 to 10) if you want the page to read clearly in a dark scene, and a double-sided toggle if players will walk behind it.
3. Set 'RenderQuality' to control how many pixels each page is rasterised to. On the actor this is clamped between 256 and 4096. Higher values give sharper text on large surfaces at the cost of texture memory; for a distant wall poster you can stay low, and for a book the player reads up close you will want to push it higher. Note that 4096 is the ceiling, so do not plan around arbitrarily large textures.
4. Leave 'bAutoLoad' enabled (it is on by default) so the document loads automatically when you hit Play. If you would rather load on demand, you can disable it and trigger the load yourself.
Playing and paging through the document
Press Play. With auto-load on, the actor opens the PDF, rasterises the first page to a texture, pushes it into its dynamic material, and orients the mesh to the page. If something goes wrong, the OnPDFLoadFailed event gives you the error message rather than failing silently, which makes a bad path or a wrong password easy to diagnose.
To let the player turn pages, bind input to the navigation functions. The simplest pairing is calling 'Next Page' and 'Previous Page' from your interaction logic; for jumping around, 'Go To Page' takes an index, and 'Go To First Page' and 'Go To Last Page' cover the ends. Read the current state with 'Get Current Page' and 'Get Page Count' to drive a small on-screen page indicator.
Bind 'On Page Changed' to react whenever the page moves; it delivers the new page and the total, which is exactly what you need for a 'Page 3 of 12' label. If you are presenting the document as a slideshow rather than a book, drive it with 'Scroll To Progress' and read back 'Get Scroll Progress' to animate smoothly across the document instead of snapping page to page.
For geometry-aware layouts there are query helpers too: 'Get Current Page Size' returns the page in points, 'Get Current Page Aspect Ratio' returns width over height (and 1.0 when nothing is loaded), and 'Is Current Page Landscape' lets you branch your UI on orientation.
Going beyond the drop-in actor
When the prefab actor is not enough, attach a UPDFRenderComponent ('PDF Renderer') to one of your own actors instead. Call LoadPDF with a file path and optional password, then drive the same NextPage, PreviousPage and GoToPage functions and bind OnPDFLoaded, OnPageChanged and OnPDFLoadFailed exactly as before. This is how you turn an existing screen, kiosk or open-book mesh into a live document surface without redesigning it.
To control how the page actually appears on your mesh, read the page with GetCurrentPageTexture and feed it into a material that exposes a Texture parameter named 'PageTexture', using SetDynamicMaterial and GetDynamicMaterial. The editor can also auto-create the M_PDFDisplay material for you so you do not have to build that material by hand. If you want one input to drive many surfaces at once, the Blueprint library's GetAllPDFViewers and NavigateAllViewersToPage will move every viewer in the level together.
One honest limitation to keep in mind: the plugin renders pages as images. It is not a text-selectable or interactive document viewer, so there is no text extraction, form filling or hyperlink navigation in the Blueprint API. If your design needs the player to click a link inside the PDF, that is out of scope; if it needs the player to read and page through a real document on a mesh, this is exactly the right tool.
From here, the natural next step is to wire the navigation functions to your interaction system and decide on a sensible RenderQuality for each surface. Drop an APDFViewerActor into a test level, point it at a real multi-page PDF, and page through it before you commit to a final layout. The included L_Demo level is the quickest reference for a known-good setup.
FAQ
How do I show a PDF in Unreal Engine without exporting every page to images first?
Use Simple PDF Viewer. It rasterises the PDF's pages to UTexture2D at runtime via the bundled PDFium library, so you point the APDFViewerActor at the .pdf file itself rather than pre-baking a stack of PNG textures. Change the document and the viewer renders the new pages with no re-import step.
Can players page through a multi-page PDF in-game?
Yes. The viewer exposes GoToPage, NextPage, PreviousPage, GoToFirstPage and GoToLastPage, plus GetCurrentPage and GetPageCount for read-back. Bind these to your input and listen to the OnPageChanged event to update a 'page X of Y' indicator.
Does it work on Mac, Linux, mobile or consoles?
No. Simple PDF Viewer is Windows-only (Win64), because the bundled PDFium renderer is shipped for Windows. It targets Unreal Engine 5.5, 5.6 and 5.7.
Can the viewer select text, fill forms or follow links inside the PDF?
No. The plugin renders each page as an image (a texture on a mesh), so it is not a text-selectable or interactive document viewer. There is no text extraction, form filling or hyperlink navigation in the Blueprint API. It is built for displaying and paging through documents, not editing them.
How sharp can the pages be?
Render resolution is configurable and clamped between 256 and 4096. Higher values give crisper text on large or close-up surfaces at the cost of texture memory; 4096 is the ceiling, so plan your surfaces around that limit.
Simple PDF Viewer
Display PDFs inside Unreal — render pages to textures on meshes and actors with page navigation, a Blueprint API for loading and querying documents, and editor utilities to preview and auto-build the display material. Powered by PDFium; no telemetry.