# PdfViewer
**Also known as:** PdfReader, Pdf
## Description
BitPdfViewer is a native pure-C# pdf viewer component for Blazor. It parses pdf files and renders pages as plain HTML/CSS DOM with no browser pdf plugin and no js library dependency, offering page navigation, zoom, rotation, search, thumbnails, bookmarks, download, print and fullscreen out of the box.
## Parameters
| Name | Type | Default Value | Description |
| :--- | :--- | :------------ | :---------- |
| Source | `BitPdfSource?` | null | The document to display. |
| Height | `string?` | 780px | The CSS height of the viewer container. |
| ShowToolbar | `bool` | true | Whether the toolbar is shown. |
| InitialZoomMode | `BitPdfZoomMode` | BitPdfZoomMode.FitWidth | The initial zoom behavior. |
| TextCoalescing | `BitPdfTextCoalescing` | BitPdfTextCoalescing.Exact | How painted text is emitted. Compact merges same-line, same-style runs into one span per visual line (far fewer DOM nodes on per-glyph pdfs). |
| RenderMode | `BitPdfRenderMode` | BitPdfRenderMode.Html | How page content is painted. Canvas replays a display list onto a per-page canvas, while Html (the default) renders prerenderable positioned DOM. |
| OnDocumentLoaded | `EventCallback` | | The callback for when a document has finished loading. |
| OnPageChanged | `EventCallback<int>` | | The callback for when the focused page changes (with the 1-based page number). |
| OnError | `EventCallback<string>` | | The callback for when loading or rendering fails, with the error message. |
| OnWarnings | `EventCallback<IReadOnlyList<string>>` | | The callback raised after a document loads with any non-fatal diagnostics (e.g. a damaged file whose cross-reference table had to be rebuilt). |
| OnPasswordRequested | `Func<Task<string?>>?` | null | Invoked when an encrypted document needs a password. Return the password to retry, or null/empty to cancel. If unset, a password error surfaces through OnError instead. |
| AriaLabel | `string?` | null | Gets or sets the accessible label for the component, used by assistive technologies. |
| Class | `string?` | null | Gets or sets the CSS class name(s) to apply to the rendered element. |
| Dir | `BitDir?` | null | Gets or sets the text directionality for the component's content. |
| HtmlAttributes | `Dictionary<string, object>` | new Dictionary<string, object>() | Captures additional HTML attributes to be applied to the rendered element, in addition to the component's parameters. |
| Id | `string?` | null | Gets or sets the unique identifier for the component's root element. |
| IsEnabled | `bool` | true | Gets or sets a value indicating whether the component is enabled and can respond to user interaction. |
| Style | `string?` | null | Gets or sets the CSS style string to apply to the rendered element. |
| TabIndex | `string?` | null | Gets or sets the tab order index for the component when navigating with the keyboard. |
| Visibility | `BitVisibility` | BitVisibility.Visible | Gets or sets the visibility state (visible, hidden, or collapsed) of the component. |
## Public Members
| Name | Type | Default Value | Description |
| :--- | :--- | :------------ | :---------- |
| PageCount | `int` | | The number of pages of the current document. |
| CurrentPage | `int` | | The currently focused page (1-based). |
| Zoom | `double` | | The current zoom factor (1 means 100%). |
| HasOutline | `bool` | | Whether the document exposes any bookmarks. |
| GoToPage | `Task GoToPage(int pageNumber)` | | Navigates to the provided page number (1-based). |
| NextPage | `Task NextPage()` | | Navigates to the next page. |
| PrevPage | `Task PrevPage()` | | Navigates to the previous page. |
| ZoomIn | `Task ZoomIn()` | | Zooms in by 20%. |
| ZoomOut | `Task ZoomOut()` | | Zooms out by 20%. |
| SetZoomMode | `Task SetZoomMode(BitPdfZoomMode mode)` | | Sets the zoom mode (fit-width, fit-page, actual size or custom). |
| RotateClockwise | `Task RotateClockwise()` | | Rotates all pages 90 degrees clockwise. |
| Download | `Task Download()` | | Downloads the original document bytes. |
| Print | `Task Print()` | | Opens the browser print dialog with all pages of the document. |
| ToggleFullscreen | `Task ToggleFullscreen()` | | Toggles the fullscreen mode of the viewer. |
| RenderPageHtml | `string RenderPageHtml(int pageNumber)` | | Renders a single page (1-based) to self-contained HTML, or an empty string when no document is loaded or the number is out of range. |
| ExtractPageText | `string ExtractPageText(int pageNumber)` | | Extracts the visible text of a single page (1-based) for search or copy, or an empty string when unavailable. |
| UniqueId | `Guid` | Guid.NewGuid() | Gets the readonly unique identifier for the component's root element, assigned when the component instance is constructed. |
| RootElement | `ElementReference` | | Gets the reference to the root HTML element associated with this component. |
## Enums
### BitPdfZoomMode Enum
| Name | Value | Description |
| :--- | :--- | :---------- |
| Custom | 0 | An explicit zoom factor is applied (the user picked a percentage). |
| FitWidth | 1 | Each page is scaled so its width fills the viewport. |
| FitPage | 2 | Each page is scaled so the whole page fits in the viewport. |
| ActualSize | 3 | Pages are shown at their natural size (one CSS pixel per point). |
### BitPdfRenderMode Enum
| Name | Value | Description |
| :--- | :--- | :---------- |
| Html | 0 | Pages render to positioned HTML/CSS DOM (the default). Fully prerenderable and crisp at any zoom. |
| Canvas | 1 | Page content is painted onto a per-page canvas by replaying a display list produced by the C# engine. Far fewer DOM nodes; selection, search and links still work through the DOM text layer, and zoom changes re-rasterize the canvases so text stays crisp. Requires JavaScript, so no prerender. |
### BitPdfTextCoalescing Enum
| Name | Value | Description |
| :--- | :--- | :---------- |
| Exact | 0 | Every show-text run keeps its own positioned span, so each glyph run lands at its exact pdf-computed position. Highest fidelity, but per-glyph pdfs emit one span per character. |
| Compact | 1 | Adjacent runs on the same baseline with identical style are merged into one span per visual line. Dramatically fewer DOM nodes on per-glyph pdfs, at the cost of small intra-line position drift. Rotated text is never coalesced and stays exact. |
### BitVisibility Enum
| Name | Value | Description |
| :--- | :--- | :---------- |
| Visible | 0 | The content of the component is visible. |
| Hidden | 1 | The content of the component is hidden, but the space it takes on the page remains (visibility:hidden). |
| Collapsed | 2 | The component is hidden (display:none). |
### BitDir Enum
| Name | Value | Description |
| :--- | :--- | :---------- |
| Ltr | 0 | Ltr (left to right) is to be used for languages that are written from the left to the right (like English). |
| Rtl | 1 | Rtl (right to left) is to be used for languages that are written from the right to the left (like Arabic). |
| Auto | 2 | Auto lets the user agent decide. It uses a basic algorithm as it parses the characters inside the element until it finds a character with a strong directionality, then applies that directionality to the whole element. |
## Sub Classes
### BitPdfSource Properties
Identifies where a pdf document is loaded from. A source is either a byte buffer already in memory (BitPdfSource.FromBytes), or a URL the document can be fetched from (BitPdfSource.FromUrl).
| Name | Type | Default Value | Description |
| :--- | :--- | :------------ | :---------- |
| Bytes | `byte[]?` | null | Raw document bytes, when the source is an in-memory buffer. |
| Url | `string?` | null | The URL to fetch the document from, when the source is remote. |
| FileName | `string?` | null | An optional display name (e.g. the original file name). |
| Password | `string?` | null | The password to open an encrypted document, if known up front (also see the WithPassword method). |
## Examples
\n**Basic**:
```razor
```
```csharp
private readonly BitPdfSource basicSource = BitPdfSource.FromUrl("url-to-the-pdf-file.pdf", "file-name.pdf");
// or from in-memory bytes:
// private readonly BitPdfSource basicSource = BitPdfSource.FromBytes(pdfBytes, "file-name.pdf");
```
\n**Toolbar & Height**:
```razor
```
```csharp
private readonly BitPdfSource plainSource = BitPdfSource.FromUrl("url-to-the-pdf-file.pdf", "file-name.pdf");
```
\n**Canvas render mode**:
```razor
```
```csharp
private readonly BitPdfSource canvasSource = BitPdfSource.FromUrl("url-to-the-pdf-file.pdf", "file-name.pdf");
```
\n**Events**:
```razor
eventsLog = [];
```
\n**Public API**:
```razor
First
Prev
Next
Last
Zoom -
Zoom +
Rotate
Print
```
```csharp
private readonly BitPdfSource publicApiSource = BitPdfSource.FromUrl("url-to-the-pdf-file.pdf", "file-name.pdf");
private BitPdfViewer pdfViewerRef = default!;
```
Events:
@foreach (var log in Enumerable.Reverse(eventsLog).Take(5))
{
```
```csharp
private readonly BitPdfSource eventsSource = BitPdfSource.FromUrl("url-to-the-pdf-file.pdf", "file-name.pdf");
private readonly List@log
}