Skip to content

Commit

Permalink
more ViewerPreferences (#745)
Browse files Browse the repository at this point in the history
* more ViewerPreferences

address issue #744

* PDFHexString ViewerPreferences

* Update ViewerPreferences.ts

* neaten ViewerPreferences

* type assertIsOneOf values

* clearer documentation of viewerPreferences

* Update tsconfig target

* README with viewer pref

* tests for viewer preferences

* more ViewerPreferences

address issue #744

* revert to ES5 target

* fix tsconfig es case

ensure it does not show up as a change in the diff

* address Hopding coments 1

* minor viewerpref doc changes

* doc viewerPref with pageMode

* set pagemode

* test existing viewerPrefs in doc

* document viewerPref enums

* lint viewerPreferences

* comment linting

* comments in 0 printpage index
  • Loading branch information
mcshaz authored Jan 24, 2021
1 parent 4be96eb commit 0813ccb
Show file tree
Hide file tree
Showing 5 changed files with 689 additions and 4 deletions.
90 changes: 90 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
- [Add Attachments](#add-attachments)
- [Set Document Metadata](#set-document-metadata)
- [Read Document Metadata](#read-document-metadata)
- [Set Viewer Preferences](#set-viewer-preferences)
- [Read Viewer Preferences](#read-viewer-preferences)
- [Draw SVG Paths](#draw-svg-paths)
- [Deno Usage](#deno-usage)
- [Complete Examples](#complete-examples)
Expand Down Expand Up @@ -101,6 +103,8 @@
- Embed Fonts (supports UTF-8 and UTF-16 character sets)
- Set document metadata
- Read document metadata
- Set viewer preferences
- Read viewer preferences
- Add attachments

## Motivation
Expand Down Expand Up @@ -835,6 +839,92 @@ Creation Date: 2010-07-29T14:26:00.000Z
Modification Date: 2010-07-29T14:26:00.000Z
```

### Set Viewer Preferences
<!-- prettier-ignore -->
```js
import { PDFDocument, StandardFonts, NonFullScreenPageMode, Direction, PrintScaling, Duplex } from 'pdf-lib'

// Create a new PDFDocument
const pdfDoc = await PDFDocument.create()

// Embed the Times Roman font
const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman)

// Add a page and draw some text on it
const page = pdfDoc.addPage([500, 600])
page.setFont(timesRomanFont)
page.drawText('The Life of an Egg', { x: 60, y: 500, size: 50 })
page.drawText('An Epic Tale of Woe', { x: 125, y: 460, size: 25 })

// Set all available viewer preferences on the PDFDocument.
const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences();
viewerPrefs.setHideToolbar(true)
viewerPrefs.setHideMenubar(true)
viewerPrefs.setHideWindowUI(true)
viewerPrefs.setFitWindow(true)
viewerPrefs.setCenterWindow(true)
viewerPrefs.setDisplayDocTitle(true)
// set the PageMode, otherwise the subsequent NonFullScreenPageMode has no meaning
pdfDoc.catalog.set(PDFName.of('PageMode'),PDFName.of('FullScreen'))
// set what happens when fullScreen is closed
viewerPrefs.setNonFullScreenPageMode(NonFullScreenPageMode.UseOutlines)
viewerPrefs.setDirection(Direction.L2R)
viewerPrefs.setPrintScaling(PrintScaling.None)
viewerPrefs.setDuplex(Duplex.DuplexFlipLongEdge)
viewerPrefs.setPickTrayByPDFSize(true)
// to set the default to print only the first page
viewerPrefs.setPrintPageRange({ start: 1, end: 1 })
// or alternatively if discontinuous ranges of pages should be the default
// for example page 1, page 3 and pages 5-7, provide an array
viewerPrefs.setPrintPageRange([
{ start: 1, end: 1 },
{ start: 3, end: 3 },
{ start: 5, end: 7 },
])
viewerPrefs.setNumCopies(2)

// Serialize the PDFDocument to bytes (a Uint8Array)
const pdfBytes = await pdfDoc.save()

// For example, `pdfBytes` can be:
// • Written to a file in Node
// • Downloaded from the browser
// • Rendered in an <iframe>
```

### Read Viewer Preferences
<!-- prettier-ignore -->
```js
import { PDFDocument } from 'pdf-lib'

// This should be a Uint8Array or ArrayBuffer
// This data can be obtained in a number of different ways
// If your running in a Node environment, you could use fs.readFile()
// In the browser, you could make a fetch() call and use res.arrayBuffer()
const existingPdfBytes = ...

// Load a PDFDocument without updating its existing metadata
const pdfDoc = await PDFDocument.load(existingPdfBytes, {
updateMetadata: false
})
const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences();

// Print all available viewer preference fields
console.log('HideToolbar:', viewerPrefs.getHideToolbar())
console.log('HideMenubar:', viewerPrefs.getHideMenubar())
console.log('HideWindowUI:', viewerPrefs.getHideWindowUI())
console.log('FitWindow:', viewerPrefs.getFitWindow())
console.log('CenterWindow:', viewerPrefs.getCenterWindow())
console.log('DisplayDocTitle:', viewerPrefs.getDisplayDocTitle())
console.log('NonFullScreenPageMode:', viewerPrefs.getNonFullScreenPageMode())
console.log('Direction:', viewerPrefs.getDirection())
console.log('PrintScaling:', viewerPrefs.getPrintScaling())
console.log('Duplex:', viewerPrefs.getDuplex())
console.log('PickTrayByPDFSize:', viewerPrefs.getPickTrayByPDFSize())
console.log('PrintPageRange:', viewerPrefs.getPrintPageRange())
console.log('NumCopies:', viewerPrefs.getNumCopies())
```

### Draw SVG Paths

_This example produces [this PDF](assets/pdfs/examples/draw_svg_paths.pdf)_.
Expand Down
Binary file added assets/pdfs/just_viewer_prefs.pdf
Binary file not shown.
7 changes: 7 additions & 0 deletions src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ export {
PageBoundingBox,
} from 'src/core/embedders/PDFPageEmbedder';

export {
NonFullScreenPageMode,
Direction,
PrintScaling,
Duplex,
} from 'src/core/interactive/ViewerPreferences';

export { default as PDFObject } from 'src/core/objects/PDFObject';
export { default as PDFBool } from 'src/core/objects/PDFBool';
export { default as PDFNumber } from 'src/core/objects/PDFNumber';
Expand Down
Loading

0 comments on commit 0813ccb

Please # to comment.