tutorial · 2026-03-16
Render a PDF Page to a Texture in Unreal Engine with Blueprints
Wire up the PDF render component, pull the current page as a UTexture2D, and feed it into a dynamic material entirely in Blueprint.
The problem: getting a PDF onto a surface in your level
Unreal Engine has no native way to show a PDF. If you want a manual on a workbench, a brochure on a kiosk, or a lore book the player can page through, you first have to turn each page into something the renderer understands, and that means a texture. The reliable answer to the Unreal Engine PDF to texture render component question is to rasterise each page to a UTexture2D and then map that texture onto a mesh or feed it into a material.
Simple PDF Viewer does exactly this. It rasterises PDF pages to UTexture2D using a bundled PDFium third-party library and gives you a reusable UPDFRenderComponent (a BlueprintSpawnableComponent) that you can attach to any actor. This tutorial walks through the component path in Blueprint: add the renderer, load a document, read the current page as a texture, control the render resolution, and push the result into a dynamic material parameter named 'PageTexture'. Everything here is grounded in the component's real Blueprint API.
One thing to be clear about up front: this is image rendering, not a text-selectable document viewer. Pages come out as rasterised textures, so there is no text extraction, form filling, or hyperlink navigation. It is Windows-only and targets Unreal Engine 5.5, 5.6, and 5.7. If your use case is putting a readable, page-by-page document on a surface in-world, that is precisely what this is built for.
Adding the PDF render component
Install Simple PDF Viewer into your project's Plugins folder and enable it; it depends on the bundled PDFium library and runs on Windows. Once enabled you have two routes. The fastest is dropping the ready-made APDFViewerActor (it shows as 'PDF Viewer' in the placement browser) into the level, which auto-builds a display mesh and a dynamic material for you. This tutorial takes the more flexible route instead: adding the renderer to your own actor so you control where the page texture ends up.
1. Open the actor Blueprint you want to display a page on, or create a new Actor Blueprint with a mesh to project the page onto.
2. In the Components panel click 'Add', search for 'PDF Renderer', and add the UPDFRenderComponent. Naming it clearly helps because you will reference it from several nodes.
3. Select the component and review its details. The component exposes the render settings (RenderWidth, RenderHeight) and the navigation and texture functions you will call from the Event Graph.
Because UPDFRenderComponent is a standard scene component you can add it to characters, props, kiosk actors, or a bespoke book actor. It does not require the APDFViewerActor; that drop-in actor simply wraps the same component with a mesh and material already wired.
LoadPDF and GetCurrentPageTexture
With the component in place, loading a document and reading its page is a two-step Blueprint flow. LoadPDF opens the file (with an optional password for encrypted PDFs), and GetCurrentPageTexture returns the current page rendered as a UTexture2D that you can use anywhere a texture is accepted.
1. From a suitable entry point such as 'Event BeginPlay', drag off your component reference and call 'LoadPDF', passing the file path. The path can be absolute, or you can use the Blueprint library's content- and project-relative path helpers to resolve it. If the PDF is encrypted, supply the Password parameter.
2. Bind the events so you react to the load result rather than guessing. The component fires 'OnPDFLoaded' with the page count on success and 'OnPDFLoadFailed' with an error message on failure; 'OnPageChanged' fires with the new page and total page count whenever you navigate. Binding 'OnPDFLoaded' is the safe place to grab your first texture, because you know the document is ready.
3. Inside your 'OnPDFLoaded' handler, call 'GetCurrentPageTexture' off the component. It returns the current page as a UTexture2D. Promote that return value to a variable if you want to reuse it.
4. To move through the document, call 'NextPage', 'PreviousPage', 'GoToPage', 'GoToFirstPage', or 'GoToLastPage'. After navigating, read 'GetCurrentPageTexture' again to get the texture for the new page. 'GetCurrentPage' and 'GetPageCount' let you build page indicators. If you ever need to force a fresh render of the page you are already on, call 'RefreshCurrentPage'.
Setting render width, height, and quality
The sharpness of your page texture is governed by the component's render resolution, and getting this right matters because the page is being rasterised, not drawn as vector text. Set the resolution before you read the texture so the first GetCurrentPageTexture returns at your target quality.
RenderWidth is clamped to the range 256 to 4096 pixels. Set this to match how large the page will appear on screen: a small in-world sign can sit at the lower end, while a full-screen tutorial page or a document the player leans in to read wants something closer to the top of the range.
RenderHeight has a special value: set it to 0 and the height is computed automatically from the page's aspect ratio, which is the setting you usually want so pages are never stretched. If you need a fixed height for a specific surface, set an explicit value instead.
If you are using the drop-in APDFViewerActor rather than a raw component, the actor exposes a RenderQuality property that is likewise clamped to 256 to 4096, alongside display controls such as DisplayWidth (10 to 1000 world units), a double-sided toggle, and EmissiveStrength (0 to 10) for making the page glow on a screen.
A practical note: the resolution is capped at 4096, so do not plan around arbitrarily large textures. Pick the smallest resolution that still looks crisp at your viewing distance, and let RenderHeight auto-derive from the aspect ratio to keep proportions correct.
Pushing the texture into a dynamic material (PageTexture)
A texture on its own does nothing until a material samples it. Simple PDF Viewer's material integration expects a single texture parameter named 'PageTexture', so the final step is creating a dynamic material instance and assigning your page texture to that parameter.
1. Build a material with a Texture parameter named exactly 'PageTexture' plugged into Base Color (and into Emissive Color if you want a self-lit screen look). The exact name matters because that is the parameter the component drives. Alternatively, let the editor auto-create the bundled M_PDFDisplay display material for you.
2. Get a dynamic material instance to write into. Call 'GetDynamicMaterial' on the component to retrieve its dynamic material, or call 'SetDynamicMaterial' to hand it the material instance you want it to use; SetDynamicMaterial is the integration point that expects the 'PageTexture' parameter.
3. With the page texture from 'GetCurrentPageTexture' and a dynamic material instance in hand, set the texture parameter value for 'PageTexture' to your page texture. The page now appears on whatever mesh that material is applied to.
4. Apply the material to your display mesh so the result is visible. When you navigate to another page, read 'GetCurrentPageTexture' again and update the same 'PageTexture' parameter to swap the displayed page.
If you would rather not wire any of this manually, the APDFViewerActor does all of it for you: set a PDF file path, drop it in the level, and it auto-builds the mesh, dynamic material, and parameter binding, auto-loads on play, and auto-orients the mesh from the page aspect ratio. The component route in this tutorial is for when you want a PDF page on your own actor and your own surface.
Where to go from here
For level-wide control there is a Blueprint function library on top of the component: 'GetAllPDFViewers' collects every viewer in the level, 'NavigateAllViewersToPage' moves them together, 'IsPDFViewerAvailable' and 'LoadPDFIntoViewer' help with setup, and 'OpenPDFFileDialog' lets editor tooling pick a file. Geometry queries such as 'GetCurrentPageSize' (in points), 'GetCurrentPageAspectRatio', and 'IsCurrentPageLandscape' help you size and orient surfaces correctly, and 'ScrollToProgress' with 'GetScrollProgress' turns a multi-page PDF into a slideshow surface.
The plugin ships a demo level (L_Demo), an example Blueprint, the M_PDFDisplay material, and a NoPDFLoaded placeholder PDF, so the quickest way to confirm your wiring is to open L_Demo and compare it against your own actor. If a document is going to be fetched rather than shipped with the project, pair this with a HTTP plugin to download the file before calling LoadPDF on the resulting path.
Simple PDF Viewer is on Fab. If you are putting readable documents in your world, in-world manuals, kiosks, tutorial screens, or paginated lore, the component-and-material flow above gets you from a PDF on disk to a page on a surface without writing any rasterisation code yourself.
Component vs drop-in actor
| Aspect | UPDFRenderComponent (this tutorial) | APDFViewerActor (drop-in) |
|---|---|---|
| Setup | Add component to your own actor and wire the material | Drag into level, set PDF path |
| Mesh + material | You provide and wire them | Auto-built on the actor |
| PageTexture binding | You set the parameter from GetCurrentPageTexture | Handled automatically |
| Resolution control | RenderWidth 256-4096, RenderHeight 0 = auto | RenderQuality 256-4096 |
| Best for | Custom surfaces and bespoke actors | Fast, standard in-world display |
Both use the same rasterisation; choose the route that fits your setup.
FAQ
How do I render a PDF page to a texture with the Unreal Engine PDF to texture render component?
Add a UPDFRenderComponent to your actor, call LoadPDF with the file path, then call GetCurrentPageTexture to get the current page as a UTexture2D. Set the texture into a dynamic material parameter named PageTexture and apply that material to your display mesh.
What resolution does the page texture render at?
RenderWidth is clamped between 256 and 4096 pixels. Set RenderHeight to 0 to derive the height automatically from the page aspect ratio, or set an explicit value for a fixed-height surface. The resolution is capped at 4096, so pick the smallest size that still looks crisp at your viewing distance.
What must the material parameter be named?
The component's material integration expects a Texture parameter named exactly PageTexture. Create that parameter in your material (or let the editor auto-create M_PDFDisplay), then set its value to the texture returned by GetCurrentPageTexture using the dynamic material from GetDynamicMaterial or SetDynamicMaterial.
Can I display a text-selectable, interactive PDF?
No. Pages are rasterised to textures, so the output is an image of each page. There is no text selection, text extraction, form filling, or hyperlink navigation in the Blueprint API. It is intended for showing readable, page-by-page documents on in-world surfaces.
Which platforms and engine versions are supported?
Simple PDF Viewer is Windows-only (Win64), with rendering backed by the bundled PDFium library, and targets Unreal Engine 5.5, 5.6, and 5.7.
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.