From 9161a7677455f6e5da02e2415989f0c81650e4f2 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 3 Dec 2025 12:30:47 +0530 Subject: [PATCH 01/13] 994201-dev: Added EJ2 PDF library UG documentation. --- Document-Processing-toc.html | 10 +- .../javascript/EJ2-images/Helloworld.png | Bin 0 -> 39998 bytes .../PDF-Library/javascript/Getting-Started.md | 90 + .../javascript/Open-and-save-PDF-files.md | 95 + .../Overview.md | 14 +- .../Supported-and-Unsupported-Features.md | 557 +++++ .../javascript/Working-with-Annotations.md | 1840 +++++++++++++++++ .../javascript/Working-with-Bookmarks.md | 231 +++ .../Working-with-DigitalSignature.md | 581 ++++++ .../javascript/Working-with-HyperLinks.md | 308 +++ .../javascript/Working-with-Images.md | 279 +++ .../javascript/Working-with-Layers.md | 266 +++ .../javascript/Working-with-Lists.md | 154 ++ .../javascript/Working-with-PDF-Pages.md | 459 ++++ .../javascript/Working-with-PDF-Templates.md | 111 + .../javascript/Working-with-PDF-document.md | 215 ++ .../javascript/Working-with-Redaction.md | 209 ++ .../javascript/Working-with-Shapes.md | 844 ++++++++ .../Working-with-Text-Extraction.md | 277 +++ .../javascript/Working-with-Text.md | 445 ++++ .../javascript/Working-with-forms.md | 1317 ++++++++++++ 21 files changed, 8295 insertions(+), 7 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Library/javascript/EJ2-images/Helloworld.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md rename Document-Processing/PDF/PDF-Library/{javascript-es6 => javascript}/Overview.md (70%) create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Supported-and-Unsupported-Features.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Bookmarks.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index ed3c7467f..3a2460b66 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -2542,17 +2542,17 @@
  • - Flutter + JavaScript
  • - JavaScript (ES6) + Flutter -
  • +
  • diff --git a/Document-Processing/PDF/PDF-Library/javascript/EJ2-images/Helloworld.png b/Document-Processing/PDF/PDF-Library/javascript/EJ2-images/Helloworld.png new file mode 100644 index 0000000000000000000000000000000000000000..003ad9420536ca5d5e51d87c6d50705243348f58 GIT binary patch literal 39998 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�hrX5WiE~VcWTo8&0k`Pw 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 S(#Jw_>)d_Z3S2(^?7sjg#$~Yp literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md b/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md new file mode 100644 index 000000000..93d95b33e --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md @@ -0,0 +1,90 @@ +--- +layout: post +title: Getting started with JavaScript PDF library | Syncfusion +description: Learn how to set up and use the Syncfusion JavaScript PDF library using the EJ2 quickstart, including local resource configuration and module injection. +platform: document-processing +control: PDF +documentation: ug +domainurl: ##DomainURL## +--- + +# Getting started with JavaScript PDF library + +This guide explains how to create the PDF library component and configure its features in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository. + +> This application is integrated with a webpack configuration (`webpack.config.js`) and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires Node.js `v14.15.0` or higher. For more information, refer to the [webpack getting started guide](https://webpack.js.org/guides/getting-started/). + +## Dependencies + +The following list of dependencies are required to use the `EJ2 PDF library` component in your application. + +```javascript +|-- @syncfusion/ej2-compression +|-- @syncfusion/ej2-base +|-- @syncfusion/ej2-file-utils + +``` + +## Add Syncfusion JavaScript packages + +Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. Install all EJ2 controls with the [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) meta package or install individual control packages. + +The quickstart application is preconfigured with [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) in `~/package.json`. Use the following command to install dependencies: + +{% tabs %} +{% highlight bash tabtitle="NPM" %} + +npm install + +{% endhighlight %} +{% endtabs %} + +## Create EJ2 PDF with local resources + +This example demonstrates how to create a PDF document directly using Syncfusion EJ2 PDF library. A button is provided to trigger the PDF creation process. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a page + const page = document.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +By executing the program, you will get the PDF document as follows. + +![Output EJ2 PDF document](EJ2-images/Helloworld.png) + diff --git a/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md b/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md new file mode 100644 index 000000000..f92c5ff71 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md @@ -0,0 +1,95 @@ +--- +layout: post +title: Open and save PDF files in JavaScript PDF library | Syncfusion +description: Learn to load and save PDFs in Syncfusion JavaScript PDF library using URLs, base64 strings, or byte arrays with server-backed services. +platform: document-processing +control: PDF +documentation: ug +domainurl: ##DomainURL## +--- + +# Open and save PDF files in JavaScript PDF library + +## Opening an existing PDF document + +Open an existing PDF document using the `PdfDocument` class with the specified string data. + +```javascript +// Load an existing PDF document from string data +let document: PdfDocument = new PdfDocument("Input.pdf"); + +``` + + ## Opening an existing PDF document from a byte array + +Open an existing PDF document using the `PdfDocument` class with the specified byte array. + +```javascript +// Load the PDF data from a file +const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); +// Create a new PdfDocument instance using the byte array +const loadedDocument = new PdfDocument(inputPDFByteArray); +``` + +## Opening an Encrypted PDF document + +Open an encrypted PDF document using the `PdfDocument` class by providing the correct password. + +```javascript +// Load an existing PDF document from string data +let document: PdfDocument = new PdfDocument("Input.pdf", "password"); +``` + +## Opening an Encrypted PDF document from a byte array + +Open an encrypted PDF document from a byte array using the `PdfDocument` class by providing the correct password. + +```javascript +// Load the PDF data from a file +const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); +// Load an existing PDF document from string data +let document: PdfDocument = new PdfDocument(inputPDFByteArray, "password"); +``` + +## Saving a PDF document + +Save the manipulated PDF document using the `Save` method of `PdfDocument` class with the specified string data. + +```javascript +// Load an existing PDF document from string data +let document: PdfDocument = new PdfDocument("Input.pdf"); +//To-Do some manipulation +//To-Do some manipulation +// Save the PDF document +document.save('Output.pdf'); +``` + +## Saving a PDF Document from a byte array + +Open an existing PDF document using the `PdfDocument` class with the specified byte array. + +```javascript +// Load the PDF data from a file +const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); +// Create a new PdfDocument instance using the byte array +const loadedDocument = new PdfDocument(inputPDFByteArray); +//To-Do some manipulation +//To-Do some manipulation +// Save the document +let data: Uint8Array = document.save(); +``` + +## Closing a document + +After the document manipulation and save operation are completed, you should close the instance of `PdfDocument`, in order to release all the memory consumed by PDF DOM. The following code example illustrates how to destroy a `PdfDocument` instance. + +```javascript +// Load an existing PDF document from string data +let document: PdfDocument = new PdfDocument("Input.pdf"); +//To-Do some manipulation +//To-Do some manipulation +// Save the PDF document +document.save('Output.pdf'); +// Destroy the document +document.destroy(); +``` \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript-es6/Overview.md b/Document-Processing/PDF/PDF-Library/javascript/Overview.md similarity index 70% rename from Document-Processing/PDF/PDF-Library/javascript-es6/Overview.md rename to Document-Processing/PDF/PDF-Library/javascript/Overview.md index d693fc73f..146eb01ae 100644 --- a/Document-Processing/PDF/PDF-Library/javascript-es6/Overview.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Overview.md @@ -10,7 +10,7 @@ domainurl: ##DomainURL## # Overview of the TypeScript PDF library control -The Essential® TypeScript PDF library is a feature-rich, high-performance, non-UI PDF library written natively in TypeScript. It enables you to seamlessly integrate robust PDF functionalities into your TypeScript applications. The library allows users to read and manipulate PDF documents without requiring Adobe Acrobat. +The Essential® TypeScript PDF Library is a powerful, high-performance, non-UI solution built natively in TypeScript. It provides seamless integration of advanced PDF functionalities into applications developed with TypeScript, JavaScript, Angular, React, Vue, ASP.NET Core, and ASP.NET MVC. With this library, you can easily read, create, and manipulate PDF documents—without relying on Adobe Acrobat. ## Key features @@ -32,4 +32,14 @@ The following are the key features of this library. * Digitally sign PDF documents for secure authentication. * Extract or redact text from PDF files. * Extract images from PDF documents. -* Redact shapes to protect sensitive graphical content. \ No newline at end of file +* Redact shapes to protect sensitive graphical content. + +## Supported web platforms + +* ASP.Net core +* ASP.Net MVC +* Angular +* React +* Vue +* JavaScript +* TypeScript \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Supported-and-Unsupported-Features.md b/Document-Processing/PDF/PDF-Library/javascript/Supported-and-Unsupported-Features.md new file mode 100644 index 000000000..bf4d6346d --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Supported-and-Unsupported-Features.md @@ -0,0 +1,557 @@ +--- +title: Supported and Unsupported EJ2 Features | Syncfusion +description: This section explains about features available in Essential EJ2 PDF and their availability in different platforms. +platform: document-processing +control: PDF +documentation: UG +--- +# Supported and Unsupported EJ2 Features + +The following table shows the various features available in the Essential® EJ2 PDF and their availability in different platforms. + + + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Drawing Text

    +Yes

    +
    +Text Formatting

    +Yes

    +
    +Multilingual Support

    +Yes

    +
    +Drawing RTL text

    +Yes

    +
    +Drawing complex script text

    +No

    +
    +Text Extraction

    +Yes

    +
    +Unicode

    +Yes

    +
    +Pagination

    +No

    +
    + +Graphics: + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Pen and Brush

    +Yes

    +
    +Layers

    +Yes

    +
    +Transparent Graphics

    +Yes

    +
    +Color Spaces

    +No

    +
    +Image Extraction

    +Yes

    +
    +Enhanced Printing Support

    +No

    +
    +Barcode

    +No

    +
    + +Document-level Operations: + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Merge Documents

    +Yes

    +
    +Split Document

    +Yes

    +
    +Overlay Documents

    +No

    +
    +Import Pages

    +Yes

    +
    +Stamp

    +Yes

    +
    +Booklet

    +Yes

    +
    + +Document Settings: + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Custom Metadata

    +No

    +
    +Document Properties

    +Yes

    +
    +Page Orientation

    +Yes

    +
    +Page Sizes

    +Yes

    +
    +Viewer Preferences

    +No

    +
    +Tagged PDF with section 508 compliant

    +No

    +
    + +Forms: + + + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Fields

    +Yes

    +
    +Form Filling

    +Yes

    +
    +Flatten

    +Yes

    +
    +Import Form Data

    +Yes

    +
    +Form Export

    +Yes

    +
    + +XFA Forms: + + + + + + + + + +
    +Features

    +EJ2

    +
    +Fields

    +No

    +
    +Form Filling

    +No

    +
    + +
    +Document Conversion: + + + + + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +TIFF to PDF

    +No

    +
    +HTML to PDF

    +No

    +
    +RTF To PDF

    +No

    +
    +DOC To PDF

    +No

    +
    +Excel To PDF

    +No

    +
    +PDF OCR

    +No

    +
    +XPS to PDF

    +No

    +
    +SVG to PDF

    +No

    +
    +EMF to PDF

    +No

    +
    +JPEG to PDF

    +No

    +
    +PDF to JPEG

    +No

    +
    +PDF to PDF/A-1b

    +No

    +
    + +
    +PDF Standards: + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +PDF/ A-1b Compliance

    +No

    +
    +PDF/ A-2b Compliance

    +No

    +
    +PDF/ A-3b Compliance

    +No

    +
    +PDF/x1a: 2001 Compliance

    +No

    +
    +ZUGFeRD Invoice

    +No

    +
    + +Fonts: + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Standard Fonts

    +Yes

    +
    +CJK Fonts

    +Yes

    +
    +TrueType Fonts

    +Yes

    +
    +Unicode TrueType

    +Yes

    +
    + +Images: + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Scalar Images

    +Yes

    +
    +Soft Mask

    +Yes

    +
    +Vector Images

    +Yes

    +
    +Watermarks

    +Yes

    +
    +Raster images (JPEG and PNG)

    +Yes

    +
    + +Tables: + + + + + + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +ADO.Net Tables Support

    +No

    +
    +Cell / Row / Column Formatting

    +No

    +
    +Header

    +No

    +
    +Pagination

    +No

    +
    +Borders

    +No

    +
    +RowSpan and ColumnSpan

    +No

    +
    +Nested table

    +No

    +
    +Cell Padding and Spacing

    +No

    +
    + +Page Level Operations: + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Headers and Footers

    +No

    +
    +Page Label

    +No

    +
    +Automatic Fields

    +No

    +
    + +Interactive Elements: + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +3D-Annotation

    +No

    +
    +Measurement Annotations

    +Yes

    +
    +Action

    +No

    +
    +Attachment

    +No

    +
    +Bookmark

    +Yes

    +
    +Hyperlink

    +Yes

    +
    +Portfolio

    +No

    +
    +Import Annotation Data

    +Yes

    +
    +Export Annotation Data

    +Yes

    +
    + +Security: + + + + + + + + + + + + +
    +Features

    +EJ2

    +
    +Digital Signature

    +Yes

    +
    +Digital Signature with LTV

    +No

    +
    +Validate Digital Signature

    +No

    +
    +Encryption and Decryption

    +No

    +
    +Redaction

    +Yes

    +
    \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md new file mode 100644 index 000000000..b64efff32 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md @@ -0,0 +1,1840 @@ +--- +title: Working with EJ2 Annotations | Syncfusion +description: This section explains how to create or modify or remove different type of interactive Annotation by using EJ2 PDF +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Annotations + +EJ2 Annotations in the PDF Library enable users to add, edit, and manage interactive elements within PDF documents. These annotations help highlight content, provide comments, and enhance document review workflows without altering the original file. + +## Adding annotations to a PDF document + +This example demonstrates how to add annotations to a PDF document using the `PdfAnnotation` class. Adding annotations allows users to include comments, highlights, shapes, and other interactive elements within a PDF, enhancing collaboration and document review. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new popup annotation + const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new popup annotation + const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Supported annotation types + +### 3D Annotation + +3D Annotations are used to represent 3D artworks in a PDF document. EJ2 PDF provides support to embed 3D files (u3d) in PDF. + +This example demonstrates how to access a 3D annotation from a PDF page using the `Pdf3DAnnotation` class. A 3D annotation allows embedding and interacting with 3D content within a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the annotation at index 0 + let annotation: Pdf3DAnnotation = page.annotations.at(0) as Pdf3DAnnotation; + // Added bounds + annotation.bounds = {x: 10, y: 10, width: 150, height: 5}; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### File Link Annotation + +This example demonstrates how to add a file link annotation to a PDF page using the `PdfFileLinkAnnotation` class. A file link annotation allows linking to an external file from within a PDF document, enabling users to access related resources directly. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new file link annotation + let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a file link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new file link annotation + let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Rich Media Annotation + +A rich media annotation is used to play the media clip in a PDF Document. + +The following rich media types are supported: + +1. Video +2. Sound + +This example demonstrates how to access a rich media annotation to a PDF page using the `PdfRichMediaAnnotation` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the annotation at index 0 + let annotation: PdfRichMediaAnnotation = page.annotations.at(0) as PdfRichMediaAnnotation; + // Added bounds + annotation.bounds = {x: 10, y: 10, width: 150, height: 5}; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Free Text Annotation + +This example demonstrates how to add a free text annotation to a PDF page using the `PdfFreeTextAnnotation` class. A free text annotation allows placing text directly on a PDF page, enabling users to add comments or notes that remain visible without requiring interaction. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new free text annotation + const annotation: PdfFreeTextAnnotation = new PdfFreeTextAnnotation(50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a free text annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new free text annotation + const annotation: PdfFreeTextAnnotation = new PdfFreeTextAnnotation(50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Line Annotation + +This example demonstrates how to add a line annotation to a PDF page using the `PdfLineAnnotation` class. A line annotation allows drawing straight lines between two points on a PDF page, often used to highlight connections or indicate measurements. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new line annotation with line points + const annotation: PdfLineAnnotation = new PdfLineAnnotation([10, 50, 250, 50]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a line annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new line annotation with line points + const annotation: PdfLineAnnotation = new PdfLineAnnotation([10, 50, 250, 50]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Rubber stamp Annotation + +This example demonstrates how to add a rubber stamp annotation to a PDF page using the `PdfRubberStampAnnotation` class. A rubber stamp annotation allows applying predefined or custom stamp to visually indicate the status or purpose of a document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new rubber stamp annotation + const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation (50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a rubber stamp annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new rubber stamp annotation + const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation (50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Ink Annotation + +This example demonstrates how to add an ink annotation to a PDF page using the `PdfInkAnnotation` class. An ink annotation allows drawing freehand marks or sketches directly on a PDF page. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new ink annotation with the bounds and ink points + const annotation: PdfInkAnnotation = new PdfInkAnnotation([0, 0, 300, 400], [40, 300, 60, 100, 40, 50, 40, 300]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a ink annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new ink annotation with the bounds and ink points + const annotation: PdfInkAnnotation = new PdfInkAnnotation([0, 0, 300, 400], [40, 300, 60, 100, 40, 50, 40, 300]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Pop-up Annotation + +This example demonstrates how to add a popup annotation to a PDF document using the `PdfPopupAnnotation` class. A popup annotation allows you to display additional information or comments within the PDF at a specified position and size. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new popup annotation + const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new popup annotation + const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### File Attachment Annotation + +This example demonstrates how to add a file attachment annotation to a PDF page using the `PdfAttachmentAnnotation` class. A file attachment annotation allows embedding external files within a PDF document, enabling users to include supporting documents or resources for easy access. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new attachment annotation + const annotation: PdfAttachmentAnnotation = new PdfAttachmentAnnotation(300, 200, 30, 30, "Nature.jpg", imageData); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a attachment annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new attachment annotation + const annotation: PdfAttachmentAnnotation = new PdfAttachmentAnnotation(300, 200, 30, 30, "Nature.jpg", imageData); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Sound Annotation + +This example demonstrates how to access a sound annotation to a PDF page using the `PdfSoundAnnotation` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the annotation at index 0 + let annotation: PdfSoundAnnotation = page.annotations.at(0) as PdfSoundAnnotation; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### URI Annotation + +This example demonstrates how to add a URI annotation to a PDF page using the `PdfUriAnnotation` class. A URI annotation allows linking to a web address or online resource from within a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new URI annotation + let annotation: PdfUriAnnotation = new PdfUriAnnotation(100, 150, 200, 100, ‘http://www.google.com’); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a URI annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new URI annotation + let annotation: PdfUriAnnotation = new PdfUriAnnotation(100, 150, 200, 100, ‘http://www.google.com’); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Document Link Annotation + +This example demonstrates how to add a document link annotation to a PDF page using the `PdfDocumentLinkAnnotation` class. A document link annotation allows creating clickable links that navigate to a specific page or location within the same PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new document link annotation + let annotation: PdfDocumentLinkAnnotation = new PdfDocumentLinkAnnotation(100, 150, 40, 60); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a document link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new document link annotation + let annotation: PdfDocumentLinkAnnotation = new PdfDocumentLinkAnnotation(100, 150, 40, 60); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Redaction Annotation + +This example demonstrates how to add a redaction annotation to a PDF page using the `PdfRedactionAnnotation` class. A redaction annotation allows marking areas of a PDF for permanent removal of sensitive content, ensuring confidentiality and compliance with privacy requirements. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new redaction annotation + const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation (50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a document link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new redaction annotation + const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation (50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Watermark Annotation + +This example demonstrates how to add a watermark annotation to a PDF page using the `PdfWatermarkAnnotation` class. A watermark annotation allows overlaying text or images on a PDF page, typically used for branding, confidentiality notices, or document status indicators. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new water mark annotation + const annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', 50, 100, 100, 50); + // Set the color of the annotation + annotation.color = [0, 0, 0]; + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a watermark annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new water mark annotation + const annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', 50, 100, 100, 50); + // Set the color of the annotation + annotation.color = [0, 0, 0]; + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Text Markup Annotation + +This example demonstrates how to add a text markup annotation to a PDF page using the `PdfTextMarkupAnnotation` class. A text markup annotation allows highlighting, underlining, or striking out text within a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new text markup annotation + const annotation: PdfTextMarkupAnnotation = new PdfTextMarkupAnnotation(); + // Sets the bounds of the annotation. + annotation.bounds = {x: 50, y: 100, width: 100, height: 100}; + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a text markup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new text markup annotation + const annotation: PdfTextMarkupAnnotation = new PdfTextMarkupAnnotation(); + // Sets the bounds of the annotation. + annotation.bounds = {x: 50, y: 100, width: 100, height: 100}; + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Cloud border style Annotation + +### PdfRectangleAnnotation + +This example demonstrates how to add a rectangle annotation to a PDF page using the `PdfRectangleAnnotation` class. A rectangle annotation allows drawing rectangular shapes on a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new square annotation with bounds + const annotation: PdfRectangleAnnotation = new PdfRectangleAnnotation(10, 10, 200, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a rectangle annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new square annotation with bounds + const annotation: PdfRectangleAnnotation = new PdfRectangleAnnotation(10, 10, 200, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Polygon Annotation + +This example demonstrates how to add a polygon annotation to a PDF page using the `PdfPolygonAnnotation` class. A polygon annotation allows drawing multi-sided shapes on a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new polygon annotation with bounds + const annotation: PdfPolygonAnnotation = new PdfPolygonAnnotation([100, 300, 150, 200, 300, 200, 350, 300, 300, 400, 150, 400]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a polygon annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new polygon annotation with bounds + const annotation: PdfPolygonAnnotation = new PdfPolygonAnnotation([100, 300, 150, 200, 300, 200, 350, 300, 300, 400, 150, 400]); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### PdfCircleAnnotation + +This example demonstrates how to add a circle annotation to a PDF page using the `PdfCircleAnnotation` class. A circle annotation allows drawing circular or oval shapes on a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new circle annotation with circle bounds + const annotation: PdfCircleAnnotation = new PdfCircleAnnotation(10, 10, 100, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a circle annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new circle annotation with circle bounds + const annotation: PdfCircleAnnotation = new PdfCircleAnnotation(10, 10, 100, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### PdfEllipseAnnotation + +This example demonstrates how to add an ellipse annotation to a PDF page using the `PdfEllipseAnnotation` class. An ellipse annotation allows drawing elliptical shapes on a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new ellipse annotation with bounds + const annotation: PdfEllipseAnnotation = new PdfEllipseAnnotation(10, 10, 100, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a ellipse annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new ellipse annotation with bounds + const annotation: PdfEllipseAnnotation = new PdfEllipseAnnotation(10, 10, 100, 100); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Measurement Annotations + +This example demonstrates how to access a measurement annotation from a PDF page using the PdfLineAnnotation class. A measurement annotation allows defining and displaying dimensions such as distances or lengths within a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the annotation at index 0 + let annotation: PdfLineAnnotation = page.annotations.at(0) PdfLineAnnotation; + // Sets the measurement unit of line measurement annoation as centimeter + annotation.unit = PdfMeasurementUnit.centimeter; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Modifying the annotations + +This example demonstrates how to modify an existing annotation in a PDF page using the PdfAnnotation class. Modifying annotations allows updating properties such as position, color, content, or appearance, enabling customization and refinement of the document’s interactive elements. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Get the first annotation of the page + let annotation: PdfPopupAnnotation = page.annotations.at(0) as PdfPopupAnnotation; + // Gets the boolean flag indicating whether annotation has open or not. + let open: boolean = annotation.open; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Removing annotations from an existing PDF + +This example demonstrates how to remove an annotation from a PDF page using the PdfAnnotationCollection class. Removing annotations allows deleting comments, shapes, or other interactive elements from a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access first annotation from the PDF page + let annotation: PdfAnnotation = page.annotations.at(0); + // Remove an annotation from the collection + page.annotations.remove(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Flatten annotation + +This example demonstrates how to flatten annotations in a PDF document using the PdfAnnotation class. Flattening annotations converts interactive elements such as comments, highlights, and shapes into static content. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Flatten PDF annotations and form fields + document.flatten = true; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Importing annotations + +This example demonstrates how to import annotations into a PDF document using the PdfDocument. `importAnnotations` method. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load the base PDF document from resources + let pdfDocument: PdfDocument = new PdfDocument('Input.pdf'); + // Imports annotations from to the PDF document. + document.importAnnotations('annotations.json', DataFormat.json); + // Save the PDF document + pdfDocument.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Exporting annotations + +This example demonstrates how to export annotations from a PDF document using the PdfDocument.exportAnnotations method. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Exports the annotations from the PDF document. + let data: Uint8Array = document.exportAnnotations(); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Bookmarks.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Bookmarks.md new file mode 100644 index 000000000..e805ad3d4 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Bookmarks.md @@ -0,0 +1,231 @@ +--- +title: Working with EJ2 Bookmarks | PDF library | Syncfusion +description: This section explains how to add, modify and remove bookmarks in the PDF document by using Essential EJ2 PDF +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Bookmarks + +Essential® EJ2 PDF provides support to insert, remove and modify the bookmarks in the PDF Document. + +## Adding Bookmarks in a PDF + +This example demonstrates how to add bookmarks to a PDF document using the `PdfBookmark` class. Bookmarks provide an easy way to navigate through different sections of a PDF file. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Add a new outline to the PDF document + let bookmark: PdfBookmark = bookmarks.add('Introduction'); + // Sets destination to the bookmark + bookmark.destination = new PdfDestination(page, [10, 10]); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding Bookmarks in an existing PDF document + +This example demonstrates how to add bookmarks to an existing PDF document using the `PdfBookmark` class. This allows you to enhance navigation in already created PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Gets the bookmark at the specified index + let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark; + // Set the destination + bookmark.destination = new PdfDestination(page, [100, 200]); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Inserting Bookmarks in an existing PDF + +This example demonstrates how to insert bookmarks at a specific position in an existing PDF document using the `PdfBookmark` class. This feature allows precise control over bookmark order. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Add a new outline to the PDF document + let bookmark: PdfBookmark = bookmarks.add('Introduction'); + // Sets destination to the bookmark + bookmark.destination = new PdfDestination(page, [10, 10]); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Removing Bookmarks from an existing PDF + +This example demonstrates how to remove bookmarks from an existing PDF document using the `PdfBookmark` class. Removing bookmarks helps clean up unnecessary navigation links. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Remove specified bookmark from the document. + bookmarks.remove('Introduction'); + // Sets destination to the bookmark + bookmark.destination = new PdfDestination(page, [10, 10]); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Bookmark page index in an existing PDF document + +This example demonstrates how to retrieve the page index associated with a bookmark in an existing PDF document using the `PdfBookmark` class. This helps identify the exact location of the bookmark. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Get bookmark at the specified index + let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md new file mode 100644 index 000000000..10b182a90 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md @@ -0,0 +1,581 @@ +--- +title: Working with EJ2 Digital Signature | Syncfusion +description: This section explains how to create a digital signature in the PDF document by using Syncfusion .NET EJ2 PDF library. +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Digital Signature + +## Adding a digital signature + +This example demonstrates how to add a digital signature to a PDF document using the `PdfSignature` class. Digital signatures ensure document authenticity and integrity by applying cryptographic standards. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new signature field + let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); + // Create a new signature using PFX data and private key + const sign: PdfSignature = PdfSignature.create({ cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 }, certData, password); + // Sets the signature to the field + field.setSignature(sign); + // Add the field into PDF form + form.add(field); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding a digital signature using byte array + +This example demonstrates how to add a digital signature to a PDF document by loading certificate data from a byte array. This approach is useful when certificates are stored in memory or retrieved dynamically. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new signature field + let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); + // Create a new signature using PFX data and private key + const sign: PdfSignature = PdfSignature.create({ cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 }, certData, password); + // Sets the signature to the field + field.setSignature(sign); + // Add the field into PDF form + form.add(field); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Create a Signature Without Certificate Data for External Signing + +This example demonstrates how to create a signature field and configure a PDF signature for external signing without embedding certificate data. External signing enables you to implement custom signing logic outside the PDF library while maintaining compliance with cryptographic standards. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load the document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Gets the first page of the document + let page: PdfPage = document.getPage(0); + // Access the PDF form + let form: PdfForm = document.form; + // Create a new signature field + let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); + // Define a callback function used for external signing + const externalSignatureCallback = (data: Uint8Array, + options: { + algorithm: DigestAlgorithm, + cryptographicStandard: CryptographicStandard, + }): {signedData: Uint8Array, timestampData?: Uint8Array} => { + // Implement external signing logic here + return new Uint8Array(); // Placeholder return + }; + // Create a new signature using external signing + const signature: PdfSignature = PdfSignature.create({ + cryptographicStandard: CryptographicStandard.cms, + algorithm: DigestAlgorithm.sha256 + }, externalSignatureCallback); + // Set the signature to the field + field.setSignature(signature); + // Add the field into PDF form + form.add(field); + // Save the document + document.save('output.pdf'); + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Create Signature with Public Certificates for External Signing + +This example demonstrates how to create a new PDF signature using the `PdfSignature` class with public certificates for external signing. External signing allows you to implement custom signing logic outside the PDF library while maintaining compliance with cryptographic standards. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + +// Load the document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Define a callback function used for external signing +const externalSignatureCallback = ( + data: Uint8Array, + options: { + algorithm: DigestAlgorithm, + cryptographicStandard: CryptographicStandard + } +): { signedData: Uint8Array; timestampData?: Uint8Array } => { + // Implement external signing logic here + return new Uint8Array(); // Placeholder return +}; +// Create a new signature using external signing with public certificate collection +const signature: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + algorithm: DigestAlgorithm.sha256 + }, + externalSignatureCallback, + publicCertificates +); +// Set the signature to the field +field.setSignature(signature); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Create Signature Using PFX Data and Private Key + +This example demonstrates how to create a new PDF signature using the `PdfSignature` class with PFX certificate data and a private key. This approach is commonly used for digital signing when you have access to a personal certificate file and its password. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { +// Load the document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Create a new signature using PFX data and private key +const sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); +// Set the signature to the field +field.setSignature(sign); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Check Signature Visibility + +This example demonstrates how to check whether a PDF signature is visible using the `isVisible()` method of the `PdfSignature` class. This property helps determine if the signature appearance is displayed on the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { + +// Load the document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Create a new signature using PFX data and private key +const sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); +// Set the signature to the field +field.setSignature(sign); +// Check the signature visibility +sign.isVisible(); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Get Signed Date + +This example demonstrates how to retrieve the signed date of a PDF signature using the `getSignedDate()` method of the `PdfSignature` class. This property helps identify when the document was digitally signed. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { + +// Load the document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Create a new signature using PFX data and private key +const sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); +// Set the signature to the field +field.setSignature(sign); +// Get the signed date +sign.getSignedDate(); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Get Certificate Information of the Signature + +This example demonstrates how to retrieve the certificate information of a PDF signature using the `getCertificateInformation()` method of the `PdfSignature` class. This information includes details about the signer’s certificate used for digital signing. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { +// Load the document +let document: PdfDocument = new PdfDocument(data); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Create a new signature using PFX data and private key +const sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); +// Set the signature to the field +field.setSignature(sign); +// Get the certificate information of the signature +const certificateInfo: PdfCertificateInformation = sign.getCertificateInformation(); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Get Digital Signature Options + +This example demonstrates how to retrieve the configuration options of a digital signature in a PDF document using the `getSignatureOptions()` method of the `PdfSignature` class. These options include details such as the cryptographic standard and digest algorithm used for signing. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { +// Load the document +let document: PdfDocument = new PdfDocument(data); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Get the signature field +let field: PdfSignatureField = form.fieldAt(0) as PdfSignatureField; +// Get the PDF signature +let signature: PdfSignature = field.getSignature(); +// Get the signature options +let options: PdfSignatureOptions = signature.getSignatureOptions(); +// Get the cryptographic standard of the signature +let cryptographicStandard: CryptographicStandard = options.cryptographicStandard; +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Replace Empty Signature with Externally Signed Data + +This example demonstrates how to replace an empty signature field in a PDF document with externally signed data using the `replaceEmptySignature()` method of the `PdfSignature` class. This method allows embedding externally signed content, certificates, and optional timestamp data into the PDF. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { +// Load the document +let document: PdfDocument = new PdfDocument('data'); +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); +// Placeholder for signed data +let signedData: Uint8Array; +// Define a callback function used for external signing +const externalSignatureCallback = ( + data: Uint8Array, + options: { + algorithm: DigestAlgorithm; + cryptographicStandard: CryptographicStandard; + } +): void => { + // Implement external signing logic here + signedData = new Uint8Array(); // Placeholder return +}; +// Create a new signature using external signing with public certificate collection +const signature: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + algorithm: DigestAlgorithm.sha256 + }, + externalSignatureCallback, + publicCertificates +); +// Set the signature to the field +field.setSignature(signature); +// Add the field into PDF form +form.add(field); +// Save the document data +const data: Uint8Array = document.save(); +// Destroy the document +document.destroy(); +// Replace the empty signature with externally signed hash and certificates +const signedDocumentData: Uint8Array = PdfSignature.replaceEmptySignature( + data, + 'Signature', + signedData, + DigestAlgorithm.sha256, + publicCertificates +); +// Destroy the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md new file mode 100644 index 000000000..2a8639193 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md @@ -0,0 +1,308 @@ +--- +title: Working with EJ2 Hyperlinks | Syncfusion +description: This section explains how to add hyperlink in a new and existing PDF document using Syncfusion EJ2 PDF library +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Hyperlinks in PDF + +In EJ2 PDF, hyperlinks can be added to allow the users to navigate to another part of PDF file, web page or any other external content. Essential® EJ2 PDF provides support for all these types of hyperlink. + +## Working with Web navigation + +This example demonstrates how to create a web link annotation in a PDF document using the `PdfTextWebLinkAnnotation` class. A web link annotation allows users to navigate to a specified URL directly from the PDF by clicking the annotated text. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new PDF string format + const format: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.left, PdfVerticalAlignment.top); + // Create a new standard font + const font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Get the text size + let size: number[] = font.measureString("Syncfusion Site", format, [0, 0], 0, 0); + // Create a new text web link annotation + let annot: PdfTextWebLinkAnnotation = new PdfTextWebLinkAnnotation(50, 40, size[0], size[1], [0, 0, 0], [165, 42, 42], 1); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a text web link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new PDF string format + const format: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.left, PdfVerticalAlignment.top); + // Create a new standard font + const font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Get the text size + let size: number[] = font.measureString("Syncfusion Site", format, [0, 0], 0, 0); + // Create a new text web link annotation + let annot: PdfTextWebLinkAnnotation = new PdfTextWebLinkAnnotation(50, 40, size[0], size[1], [0, 0, 0], [165, 42, 42], 1); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Working with internal document navigation + +This example demonstrates how to create internal navigation within a PDF document using destination-based annotations. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new PDF string format + const format: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.left, PdfVerticalAlignment.top); + // Create a new standard font + const font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Get the text size + let size: number[] = font.measureString("Syncfusion Site", format, [0, 0], 0, 0); + // Create a new text web link annotation + let annot: PdfTextWebLinkAnnotation = new PdfTextWebLinkAnnotation(50, 40, size[0], size[1], [0, 0, 0], [165, 42, 42], 1); + // Initializes a new instance of the `PdfDestination` class. + let destination: PdfDestination = new PdfDestination(); + // Sets the zoom factor. + destination.zoom = 20; + // Sets the page where the destination is situated. + destination.page = page; + // Sets the mode of the destination. + destination.mode = PdfDestinationMode.fitToPage; + // Sets the location of the destination. + destination.location = [20, 20]; + // Sets the bounds of the destination. + destination.destinationBounds = [20, 20, 100, 50]; + // Sets destination to document link annotation. + annotation.destination = destination; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet demonstrates how to add internal document navigation to a web link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the annotation at index 0 + let annotation: PdfDocumentLinkAnnotation = document.getPage(0).annotations.at(0) as PdfDocumentLinkAnnotation; + // Initializes a new instance of the `PdfDestination` class. + let destination: PdfDestination = new PdfDestination(); + // Sets the zoom factor. + destination.zoom = 20; + // Sets the page where the destination is situated. + destination.page = page; + // Sets the mode of the destination. + destination.mode = PdfDestinationMode.fitToPage; + // Sets the location of the destination. + destination.location = [20, 20]; + // Sets the bounds of the destination. + destination.destinationBounds = [20, 20, 100, 50]; + // Sets destination to document link annotation. + annotation.destination = destination; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Working with external document navigation + +This example demonstrates how to create external navigation in a PDF document using `PdfFileLinkAnnotation` annotations. External navigation allows users to open and navigate to another PDF or an external file from within the current document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new file link annotation + let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet demonstrates how to add internal document navigation to a web link annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Create a new file link annotation + let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md new file mode 100644 index 000000000..91c499beb --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md @@ -0,0 +1,279 @@ +--- +title: Working with EJ2 Images | Syncfusion +description: This section explains how to add and replace images in the EJ2 PDF document using Essential PDF. It supports both raster and vector images. +platform: document-processing +control: PDF +documentation: UG +domainurl: ##DomainURL## +--- + +# Working with EJ2 images using various options + +Essential® PDF supports both raster and vector images. + +Images are supported through the `PdfImage` class, which is an abstract base class that provides the common functionality for `PdfBitmap` class. + +## Inserting an EJ2 image in a new document + +The following raster images are supported in Essential® PDF. + +* BMP +* JPEG +* JPEG with Exif standard +* GIF +* PNG +* TIFF +* ICO and ICON + +## Adding image in PDF document + +This example demonstrates how to add an image to a PDF document using the `PdfBitmap` class and the `draw` method of the `PdfImage` class. The image is loaded from a file and drawn at the specified coordinates on the page. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Load the image + let image: PdfImage = new PdfBitmap('Image.jpg'); + // Draw the image. + image.draw(graphics, 0,0); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Inserting an image in an existing document + +This example demonstrates how to insert an image into an existing PDF document using the `PdfBitmap` class and the `draw` method of the `PdfImage` class. The image is loaded from a file and rendered at the specified position on the selected page. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('input.pdf'); + // Access first page + let page: PdfPage = document.getPage(0); + // Get graphics from the page + let graphics = page.graphics; + // Load the image + let image: PdfImage = new PdfBitmap('Image.jpg'); + // Draw the image. + image.draw(graphics, 0,0); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Image Pagination + +This example demonstrates how to enable image pagination in a PDF document using the `PdfLayoutFormat` class. By setting the `break` property to PdfLayoutBreakType.fitPage and the `layout` property to PdfLayoutType.paginate, the image is automatically split across multiple pages when it exceeds the page size. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Load the image + let image: PdfImage = new PdfBitmap('Image.jpg'); + // Create a layout for drawing + let pageLayout: PdfLayoutFormat = new PdfLayoutFormat(); + // Set the layout break type for drawing + pageLayout.break = PdfLayoutBreakType.fitPage; + pageLayout.Layout = PdfLayoutType.paginate; + // Draw the image. + image.draw(graphics, 20, 20, pageLayout); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Clipping and graphics state + +This example demonstrates how to apply clipping and manage graphics state in a PDF document using the `PdfGraphics` class. The `save` and `restore` methods preserve the current graphics state, while the `setClip` method defines a clipping region to restrict drawing operations, ensuring precise control over rendering. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Load the image— only the part within the clipping region will be visible + let image: PdfImage = new PdfBitmap('Image.jpg'); + // Save the current graphics state (to restore later) + let state: PdfGraphicsState = graphics.save(); + graphics.setClip( [50, 50, 200, 100] ); + // Draw the image. + image.draw(graphics, 20, 20); + // Restore the graphics state to remove the clipping region + graphics.restore(state); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Applying transparency and rotation to the image + +This example demonstrates how to apply transparency and rotation to an image in a PDF document using the `PdfGraphics` class. Transparency can be controlled through the graphics state, while rotation is applied by transforming the graphics context before drawing the image, enabling advanced visual effects in the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Load the image— only the part within the clipping region will be visible + let image: PdfImage = new PdfBitmap('Image.jpg'); + // Save the current graphics state (to restore later) + let state: PdfGraphicsState = graphics.save(); + //Translate the coordinate system to the required position + graphics.translateTransform(20, 100); + //Apply transparency + graphics.setTransparency(0.5); + //Rotate the coordinate system + graphics.rotateTransform(-45); + // Draw the image. + image.draw(graphics, 20, 20); + // Restore the graphics state to remove the clipping region + graphics.restore(state); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md new file mode 100644 index 000000000..175298811 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md @@ -0,0 +1,266 @@ +--- +title: Working with EJ2 Layers | Syncfusion +description: This section explains adding the layer in the EJ2 PDF document and the layers refers to section of Content of EJ2 PDF document +platform: document-processing +control: PDF +documentation: UG +--- + +# Working with EJ2 Layers + +Layers, also known as Option Content refers to sections of content in a PDF document that can be selectively viewed or hidden by document authors or consumers. This capability is useful in items such as CAD drawings, layered artwork, maps, and multi-language documents. + +Essential® EJ2 PDF provides support to create, add and merge the layers into PDF document. + +## Adding Layers in a PDF document + +This example demonstrates how to add layers to a PDF document using the `PdfLayer` class. Layers allow you to organize content into separate, optional sections that can be shown or hidden by the user. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Access the collection of layers in the PDF document + let layers: PdfLayerCollection = document.layers; + // Add a new layer named 'Layer1' to the PDF document + let layer: PdfLayer = layers.add('Layer1'); + // Create a graphics object for the newly added layer on the specified page + let graphics: PdfGraphics = layer.createGraphics(page); + // Translate the graphics origin to the specified coordinates (x: 100, y: 60) + graphics.translateTransform({ x: 100, y: 60 }); + // Create a black pen with a thickness of 1 unit + let pen: PdfPen = new PdfPen({ r: 0, g: 0, b: 0 }, 1); + // Draw a line using the pen from point (200, 10) to point (300, 100) + graphics.drawLine(pen, { x: 200, y: 10 }, { x: 300, y: 100 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding annotation to layer + +This example demonstrates how to add an annotation to a specific layer in a PDF document using the `PdfLayer` class. Associating annotations with layers allows you to control their visibility dynamically. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the collection of layers in the document + let layers: PdfLayerCollection = document.layers; + // Add a new layer to the document with the name 'Layer1' + let layer: PdfLayer = layers.add('Layer1'); + // Access the first annotation on the page + let annotation: PdfAnnotation = page.annotations.at(0); + // Assign the layer to the annotation + annotation.layer = layer; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Nested Layers + +This example demonstrates how to create nested layers in a PDF document using the `PdfLayer` class. Nested layers enable hierarchical organization of content for better control and user experience. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get the collection of layers from the PDF document + let layers: PdfLayerCollection = document.layers; + // Add a new layer named 'Layer1' to the document + let layer: PdfLayer = layers.add('Layer1'); + // Create graphics context for 'Layer1' on the specified page + let graphics: PdfGraphics = layer.createGraphics(page); + // Add two child layers under 'Layer1': 'ChildLayer1' and 'ChildLayer2' + let layer1: PdfLayer = layer.layers.add('ChildLayer1'); + let layer2: PdfLayer = layer.layers.add('ChildLayer2'); + // Create graphics context for 'ChildLayer2' on the same page + graphics = layer2.createGraphics(page); + // Apply a translation transform to shift the drawing origin by (100, 60) + graphics.translateTransform({ x: 100, y: 60 }); + // Create a black pen with a thickness of 1 unit for drawing + let pen: PdfPen = new PdfPen({ r: 0, g: 0, b: 0 }, 1); + // Draw a straight line from point (200, 10) to point (300, 100) using the pen + graphics.drawLine(pen, { x: 200, y: 10 }, { x: 300, y: 100 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Removing layers from an existing PDF document + +This example demonstrates how to remove layers from an existing PDF document using the `PdfLayerCollection` class. Removing unnecessary layers helps simplify the document structure. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the layer collection. + let layers: PdfLayerCollection = document.layers; + //Remove the layer + layers.RemoveAt(0); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Lock or Unlock layers + +This example demonstrates how to lock or unlock layers in a PDF document using the `PdfLayer` class. Locking layers prevents users from toggling their visibility, ensuring that critical content remains displayed. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Access the collection of layers in the PDF document + let layers: PdfLayerCollection = document.layers; + // Add a new layer named 'Layer1' to the PDF document + let layer: PdfLayer = layers.add('Layer1'); + // Create a graphics object for the newly added layer on the specified page + let graphics: PdfGraphics = layer.createGraphics(page); + //Set a lock state. + layer.Locked = true; + // Translate the graphics origin to the specified coordinates (x: 100, y: 60) + graphics.translateTransform({ x: 100, y: 60 }); + // Create a black pen with a thickness of 1 unit + let pen: PdfPen = new PdfPen({ r: 0, g: 0, b: 0 }, 1); + // Draw a line using the pen from point (200, 10) to point (300, 100) + graphics.drawLine(pen, { x: 200, y: 10 }, { x: 300, y: 100 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md new file mode 100644 index 000000000..f81efb9f3 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md @@ -0,0 +1,154 @@ +--- +title: Working with EJ2 Lists | Syncfusion +description: This section explains working with EJ2 lists, which are used to display and manage a collection of items in a structured list format. +platform: document-processing +control: PDF +documentation: UG +--- + +# Bullets and Lists in EJ2 PDF + +The Syncfusion® EJ2 PDF allows you list the content in ordered and unordered list. The ordered list can be number or alphabets and the unordered list can be bullets, circles, and images. + +## Adding an ordered list + +This example demonstrates how to create an ordered list in a PDF document using the `PdfOrderedList` class. Ordered lists allow you to present items in a structured, sequential format, typically numbered or lettered, enhancing readability and organization within the PDF content. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create an ordered list instance + let list: PdfList = new PdfOrderedList(new PdfListItemCollection(['PDF', 'XlsIO', 'DocIO', 'PPT'])); + // draw the list + list.draw(page, {x: 50, y: 50}); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding an unordered list + +This example demonstrates how to create an unordered list in a PDF document using the `PdfUnorderedList` class. Unordered lists display items with bullet points instead of numbers, making them ideal for presenting non-sequential information in a clear and organized manner. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create an unordered list instance + let subList: PdfList = new PdfUnorderedList(new PdfListItemCollection(['PDF.Base', 'PDF.Portable', 'Flutter', 'EJ2'])); + // draw the unorder list + subList.draw(page, {x: 50, y: 50}); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding a sub list + +This example demonstrates how to add a sublist within a parent list in a PDF document using the `PdfOrderedList` classes. Sub lists allow you to create hierarchical list structures, improving content organization and readability by nesting related items under a main list item. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a parent ordered list + let mainList: PdfOrderedList = new PdfOrderedList(); + mainList.items.add('Chapter 1: Introduction'); + mainList.items.add('Chapter 2: Working with Lists'); + // Create a sublist (unordered) with related items + let subList: PdfUnorderedList = new PdfUnorderedList( + new PdfListItemCollection(['PDF.Base', 'PDF.Portable', 'Flutter', 'EJ2']) + ); + // Add the sublist under the second item of the main list + mainList.items.getItem(1).subList = subList; + // Draw the main list (with sublist) on the page + mainList.draw(page, { x: 50, y: 50 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md new file mode 100644 index 000000000..fedd1db27 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md @@ -0,0 +1,459 @@ +--- +title: Working with EJ2 PDF pages | Syncfusion +description: This section explains how to add, rearrange, remove pages and detect empty pages from the EJ2 PDF document +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 PDF Pages + +## Adding a new page to the document + +The following code sample explains you on how to add a `PdfPage` in a PDF document. When multiple pages are added, the new page is always added to the end of the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a PDF document + let document: PdfDocument = new PdfDocument('input.pdf', 'password'); + // Add a new PDF page + let page: PdfPage = document.addPage(); + // Save the document + document.save('output.pdf'); + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding margin to the PDF pages + +The `PdfPageSettings` class is used to define properties such as margins, orientation, rotation, and page size. In this example, margins are set using the `PdfMargins` class to ensure consistent spacing around the page content. These settings can be applied when creating sections or pages in the PDF for precise layout control. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Create a new PDF page settings instance + let pageSettings: PdfPageSettings = new PdfPageSettings(); + + // Sets the margins + pageSettings.margins = new PdfMargins(40); + + // Add a page + const page = document.addPage(pageSettings); + // Get graphics from the page + let graphics = page.graphics; + // Set font + font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Adding sections with different page settings + +This example demonstrates how to add sections with different page settings in a PDF document. It shows how to configure rotation, orientation, margins, and page size using `PdfPageSettings`. The `PdfSection` class is used to apply unique page customizations within a single PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + + // Define first page settings + let settings1: PdfPageSettings = new PdfPageSettings(); + settings1.rotation = PdfRotationAngle.angle90; + settings1.orientation = PdfPageOrientation.landscape; + settings1.margins = new PdfMargins(40); + settings1.size = [595, 842]; + // Add a section to the document with the specified settings + let section1: PdfSection = document.addSection(settings1); + // Add a page to the section + let page1: PdfPage = section1.addPage(); + // Get graphics object to draw on the page + let graphics1 = page1.graphics; + // Set font for text + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); + // Draw text on the page with specified font, position, and styles + graphics1.drawString('Rotated by 90 degree', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); + + // Define Second page settings + let settings2: PdfPageSettings = new PdfPageSettings(); + settings2.rotation = PdfRotationAngle.angle180; + settings2.orientation = PdfPageOrientation.landscape; + settings2.margins = new PdfMargins(40); + settings2.size = [595, 842]; + // Add a section to the document with the specified settings + let section2: PdfSection = document.addSection(settings2); + // Add a page to the section + let page2: PdfPage = section2.addPage(); + // Get graphics object to draw on the page + let graphics2 = page2.graphics; + // Draw text on the page with specified font, position, and styles + graphics2.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); + + // Save the PDF document + let data = document.save('Output.pdf'); + // Close and dispose the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Get number of pages from a PDF document + +This example demonstrates how to retrieve the total number of pages in a PDF document using the `pageCount` property of the `PdfDocument` class. The page count returns an integer value representing the number of pages currently in the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Gets the page count + let count: number = document.pageCount; + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Importing pages from an existing document + +This example demonstrates how to import pages from an existing PDF document into a new PDF document using the `importPageRange` method of the `PdfDocument` class. This method allows you to specify a start and end index to copy a range of pages from the source document into the target document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Define start and end page indices + const startIndex = 0; + const endIndex = document.pageCount - 1; + + // Import all pages from the loaded document into the new document + document.importPageRange(document, startIndex, endIndex); + + // Save the new document + document.save('Output.pdf'); + // Close the loaded document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Rearranging pages in an existing document + +This example demonstrates how to rearrange the pages in an existing PDF document using the `reorderPages` method of the `PdfDocument` class. The method accepts an array of page indices that defines the new order of pages within the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Reorders the pages in the PDF document + document.reorderPages([3, 2, 1]); + // Save the document + document.save('output.pdf'); + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Removing pages from a document + +This example demonstrates how to remove a page from a PDF document using the `removePage` method of the `PdfDocument` class. The method takes the zero-based index of the page to be removed, effectively deleting that page from the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument("Input.pdf"); + // Removes the first page + document.removePage(0); + // Save the document + document.save('output.pdf'); + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Rotating a PDF page + +This example demonstrates how to rotate a PDF page using the `rotation` property of the `PdfPageSettings` class. The property accepts a value from the `PdfRotationAngle` enumeration, such as angle180, to specify the rotation angle applied to the page. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + //Rotate a section/page + let settings: PdfPageSettings = new PdfPageSettings(); + settings.rotation = PdfRotationAngle.angle180; + + // Add a section to the document with the specified settings + let section: PdfSection = document.addSection(settings); + + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics object to draw on the page + let graphics = page.graphics; + // Set font for text + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); + // Draw text on the page with specified font, position, and styles + graphics.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); + // Save the PDF document + let data = document.save('Output.pdf'); + // Close and dispose the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Rotating an existing PDF page + +This example demonstrates how to rotate an existing PDF page using the `rotation` property of the `PdfPage` class. The property accepts a value from the `PdfRotationAngle` enumeration, such as angle180, to specify the rotation angle applied to the selected page. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access first page + let page: PdfPage = document.getPage(0); + //Set the rotation for loaded page + page.rotation = PdfRotationAngle.angle180; + // Save the document + document.save('output.pdf'); + // Destroy the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Splitting a PDF file to individual pages + +This example demonstrates how to split a PDF file into individual pages by importing a specific page from the source document using the `importPage` method of the `PdfDocument` class. The method takes the zero-based index of the page to be copied and adds it as a new page in the target document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let sourceDocument: PdfDocument = new PdfDocument('Input.pdf'); + // Copy the second page and add it as third page + sourceDocument.importPage(1); + // Save the output PDF + sourceDocument.save('Output.pdf'); + // Destroy the documents + sourceDocument.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md new file mode 100644 index 000000000..43ca8e0a9 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md @@ -0,0 +1,111 @@ +--- +title: Working with EJ2 PDF templates | Syncfusion +description: This section explains how to create a PDF template is a drawing surface, where contents can be added using EJ2 PDF library. +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 PDF Templates + +A EJ2 PDF template is a drawing surface, where contents can be added. All the elements that can be added to a PdfPage is supported in PdfTemplate as well. The template in turn can be drawn over the page or can be positioned at any part of the page. + +## Creating a new PDF template + +This example demonstrates how to create a new PDF template using the `PdfTemplate` class. A PDF template allows you to define reusable graphics or content that can be drawn on multiple pages or annotations within a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new rubber stamp annotation + const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation(50, 100, 100, 50); + // Get the normal appearance of the annotation + let normalAppearance: PdfTemplate = annotation.appearance.normal; + // Create new image object by using JPEG image data as Base64 string format + let image: PdfImage = new PdfBitmap('/9j/4AAQSkZJRgABAQEAkACQAAD/4....QB//Z'); + // Draw the image as the custom appearance for the annotation + normalAppearance.graphics.drawImage(image, 0, 0, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Creating templates from existing PDF document + +This example demonstrates how to create templates from an existing PDF document using the `PdfTemplate` class. A PDF template allows you to extract and reuse content from a PDF page or annotation, enabling consistent design and repeated elements across multiple pages. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument(data, password); + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Create a new rubber stamp annotation + const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation(50, 100, 100, 50); + // Get the normal appearance of the annotation + let normalAppearance: PdfTemplate = annotation.appearance.normal; + // Create new image object by using JPEG image data as Base64 string format + let image: PdfImage = new PdfBitmap('/9j/4AAQSkZJRgABAQEAkACQAAD/4....QB//Z'); + // Draw the image as the custom appearance for the annotation + normalAppearance.graphics.drawImage(image, 0, 0, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md new file mode 100644 index 000000000..f84ebe37b --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md @@ -0,0 +1,215 @@ +--- +title: Working with EJ2 PDF Document | Syncfusion +description: This section explains how to set document Settings and properties to the EJ2 PDF document using Essential PDF +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 PDF Document + +## Adding the document settings + +This example shows how to configure custom page settings before adding a page to a PDF document. It creates a `PdfPageSettings` instance, applies margins, page size and sets the orientation. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Create a new PDF page settings instance + let pageSettings: PdfPageSettings = new PdfPageSettings(); + // Sets the margins + pageSettings.margins = new PdfMargins(40); + // Sets the page size + pageSettings.size = [595, 842]; + // Sets the page orientation + pageSettings.orientation = PdfPageOrientation.landscape; + // Add a page + const page = document.addPage(pageSettings); + // Get graphics from the page + let graphics = page.graphics; + // Set font + font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Creating sections in a PDF + +This example demonstrates how to create a section in a PDF document with custom page settings. It shows how to configure rotation, orientation, margins, and page size using `PdfPageSettings`. The `PdfSection` class is used to apply different page customizations within a single PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Define page settings + let settings: PdfPageSettings = new PdfPageSettings(); + settings.rotation = PdfRotationAngle.angle180; + settings.orientation = PdfPageOrientation.landscape; + settings.margins = new PdfMargins(40); + settings.size = [595, 842]; + + // Add a section to the document with the specified settings + let section: PdfSection = document.addSection(settings); + + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics object to draw on the page + let graphics = page.graphics; + // Set font for text + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); + // Draw text on the page with specified font, position, and styles + graphics.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); + // Save the PDF document + let data = document.save('Output.pdf'); + // Close and dispose the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Working with document properties + +This example demonstrates how to create a PDF document, set its metadata properties such as title, author, subject, keywords, creator, producer, language, and dates, and then retrieve these properties using the `PdfDocumentInformation` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a PDF document + let document: PdfDocument = new PdfDocument(); + // Access the document information (metadata) + let documentProperties: PdfDocumentInformation = document.getDocumentInformation(); + + // Set document properties + documentProperties.title = "Sample PDF Document"; // Title of the PDF + documentProperties.author = "John Doe"; // Author name + documentProperties.subject = "PDF Metadata Example"; // Subject of the document + documentProperties.keywords = "PDF, Metadata, Example"; // Keywords for search + documentProperties.creator = "Syncfusion PDF Library"; // Application that created the PDF + documentProperties.producer = "Syncfusion PDF Engine"; // PDF producer + documentProperties.language = "en-US"; // Language of the document + documentProperties.creationDate = new Date(); // Creation date + documentProperties.modificationDate = new Date(); // Last modified date + // Add a page + const page = document.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Performing incremental update for PDF document + +The `isIncrementalUpdate` property allows you to check if the PDF document supports incremental updates, which can improve performance during modifications by appending changes rather than rewriting the entire document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a PDF document + let document: PdfDocument = new PdfDocument(); + + // Disable incremental update to rewrite the entire file + document.fileStructure.isIncrementalUpdate = false; + + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md new file mode 100644 index 000000000..28298f570 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md @@ -0,0 +1,209 @@ +--- +title: Working with EJ2 Redaction |Syncfusion +description: This section explains how to Redact the content from an existing PDF document by using Essential EJ2 PDF +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 PDF Redaction + +Redacting a PDF is the process of permanently removing sensitive or confidential information from PDF documents. Syncfusion® EJ2 PDF library provides an easy way to redact PDF documents. + +## Removing sensitive content from the PDF document + +Redaction permanently removes confidential or sensitive information from a PDF. The `PdfRedactionAnnotation` class allows you to define areas to redact, ensuring the underlying text or image data is completely deleted from the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new redaction annotation + const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation (50, 100, 100, 50); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Display text on the redacted area + +You can overlay custom text on the redacted region to indicate the reason for redaction or provide context. For example, adding "Confidential" or "Redacted" helps users understand why the content was removed. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new redaction annotation + const font: PdfFont = new PdfStandardFont(PdfFontFamily.timesRoman, 12); + const annot: PdfRedactionAnnotation = new PdfRedactionAnnotation(100, 100, 100, 100, { borderColor: [255, 0, 0], repeatText: true, + overlayText: 'Redacted', font: font, textColor: [0, 0, 0], appearanceFillColor: [255, 255, 255]}); + // Add annotation to the page + page.annotations.add(annotation); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Fill color on the redacted area + +You can apply a solid fill color to cover the redacted content. This is the most common approach for redaction. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new redaction annotation with specified position and size + let annot: PdfRedactionAnnotation = new PdfRedactionAnnotation({ x: 100, y: 100, width: 300, height: 200 }); + // Define multiple rectangular areas (bounds) within the annotation for redaction + annot.boundsCollection = [ + { x: 50, y: 50, width: 100, height: 100 }, // First redaction area + { x: 200, y: 100, width: 60, height: 30 }, // Second redaction area + { x: 100, y: 400, width: 60, height: 30 } // Third redaction area + ]; + // Set the overlay text that will appear on the redacted areas + annot.overlayText = "Confidential"; + // Enable repeating the overlay text across the redacted region + annot.repeatText = true; + // Set the fill color for the redaction appearance (red) + annot.appearanceFillColor = { r: 255, g: 0, b: 0 }; + // Set the color of the overlay text (blue) + annot.textColor = { r: 0, g: 0, b: 255 }; + // Set the opacity level for the redaction annotation (50% transparent) + annot.opacity = 0.5; + // Set the inner color for the redaction area (green) + annot.innerColor = { r: 0, g: 255, b: 0 }; + // Align the overlay text to the center of the redaction area + annot.textAlignment = PdfTextAlignment.center; + // Specify the author of the annotation + annot.author = "QA Tester"; + // Specify the subject or purpose of the annotation + annot.subject = "Redaction Test"; + // Add the configured redaction annotation to the page's annotations collection + page.annotations.add(annot); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Redaction appearance fill color + +Customize the appearance of the redacted area by applying specific fill colors. This helps maintain a consistent design or highlight redacted sections in a visually appealing way. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + //Appearance Fill color + annot = new PdfRedactionAnnotation({x: 100, y: 100, width: 100, height: 50}); + annot.appearanceFillColor = {r: 255, g: 255, b: 0}; + page.annotations.add(annot); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md new file mode 100644 index 000000000..39d17c3a2 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md @@ -0,0 +1,844 @@ +--- +title: PDF Working with EJ2 Shapes | Syncfusion +description: This section explains how to add shapes such as Line, curve, path, text, rectangle, pie, arc, Bezier, ellipse in the EJ2 PDF document +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Shapes in PDF Documents + +Essential® PDF has support for adding the below shapes. + +* Line +* Curve +* Path +* Text +* Rectangle +* Pie +* Arc +* Bezier +* Ellipse + +## Adding Shapes to a PDF document + +Essential® EJ2 PDF supports adding shapes with different types of brushes like solid bush, gradient brush, tiling brush, and image brush along with various color spaces and transparency levels. + +### Polygon + +This example demonstrates how to draw a polygon shape in a PDF document using the `drawPolygon` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Define the polygon points + let points: number[][] = [[10, 100], [10, 200], [100, 100], [100, 200], [55, 150]]; + // Draw the polygon on the page graphics + graphics.drawPolygon(points, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw a polygon in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Get graphics from the page + let graphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Define the polygon points + let points: number[][] = [[10, 100], [10, 200], [100, 100], [100, 200], [55, 150]]; + // Draw the polygon on the page graphics + graphics.drawPolygon(points, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Line + +This example demonstrates how to draw a straight line in a PDF document using the `drawLine` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a line on the page graphics + graphics.drawLine(pen, 10, 10, 100, 100); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw a line in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Get graphics from the page + let graphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a line on the page graphics + graphics.drawLine(pen, 10, 10, 100, 100); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Path + +This example demonstrates how to draw a path in a PDF document using the `drawPath` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a new path + let path: PdfPath = new PdfPath(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Add lines to the path + path.addLine(10, 100, 50, 100); + path.addLine(50, 100, 50, 150); + path.addLine(50, 150, 10, 100); + // Draw the path on the page graphics + graphics.drawPath(path, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw path in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Create a new path + let path: PdfPath = new PdfPath(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Add lines to the path + path.addLine(10, 100, 50, 100); + path.addLine(50, 100, 50, 150); + path.addLine(50, 150, 10, 100); + // Draw the path on the page graphics + graphics.drawPath(path, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Text + +This example demonstrates how to draw a text in a PDF document using the `drawString` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw text in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Rectangle + +This example demonstrates how to draw a rectangle in a PDF document using the `drawRectangle` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen. + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a rectangle on the page graphics. + graphics.drawRectangle(10, 20, 100, 200, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw rectangle in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen. + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a rectangle on the page graphics. + graphics.drawRectangle(10, 20, 100, 200, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Pie + +This example demonstrates how to draw a pie in a PDF document using the `drawPie` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a pie slice on the page graphics + graphics.drawPie(10, 50, 200, 200, 180, 60, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw pie in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a pie slice on the page graphics + graphics.drawPie(10, 50, 200, 200, 180, 60, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Arc + +This example demonstrates how to draw a arc in a PDF document using the `drawArc` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a arc slice on the page graphics + graphics.drawArc(10, 20, 100, 200, 20, 30, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw arc in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a aec slice on the page graphics + graphics.drawArc(10, 20, 100, 200, 20, 30, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Bezier + +This example demonstrates how to draw a bezier in a PDF document using the `drawBezier` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a Bezier curve on the page graphics + graphics.drawBezier(50, 100, 200, 50, 100, 150, 150, 100, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw bezier in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw a Bezier curve on the page graphics + graphics.drawBezier(50, 100, 200, 50, 100, 150, 150, 100, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Ellipse + +This example demonstrates how to draw a ellipse in a PDF document using the `drawEllipse` method of the `PdfGraphics` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw an ellipse on the page graphics + graphics.drawEllipse(10, 20, 100, 200, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to draw ellipse in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Gets the graphics of the PDF page + let graphics: PdfGraphics = page.graphics; + // Create a new pen + let pen: PdfPen = new PdfPen([0, 0, 0], 1); + // Draw an ellipse on the page graphics + graphics.drawEllipse(10, 20, 100, 200, pen); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md new file mode 100644 index 000000000..01a596e67 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md @@ -0,0 +1,277 @@ +--- +title: Working with EJ2 Text Extraction | Syncfusion +description: This section explains how to extract text and its bounds from a particular page or the entire EJ2 PDF document. +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 Text Extraction + +Essential® EJ2 PDF allows you to extract the text from a particular page or the entire PDF document. + +## Working with basic text extraction + +This example demonstrates how to extract text from a PDF page using the `PdfDataExtractor` class. Basic text extraction allows retrieving plain text content from a PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Initialize a new instance of the `PdfDataExtractor` class + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extract text content from the PDF document. + let text: string = extractor.extractText(); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Working with layout based text extraction + +This example demonstrates how to extract text from a PDF page using the `PdfDataExtractor` class with layout-based options. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Initialize a new instance of the `PdfDataExtractor` class + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extracts text from the PDF Page based on its layout + let text: string = extractor.extractText({isLayout: true}); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +N> Layout based text extraction may take additional processing time when compared to the normal extraction mode. + +## Text Extraction with Bounds + +### Working with Lines + +This example demonstrates how to extract text from a PDF page based on individual lines using the `extractTextLines` method. This approach provides a collection of `TextLine` objects, allowing precise access to text content line by line. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Initialize a new instance of the `PdfDataExtractor` class + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extracts text from the PDF Page based on its line + let textCollection: TextLine[] = extractor.extractTextLines({ startPageIndex: 0, endPageIndex: 0 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Working with words + +This example demonstrates how to extract words from a PDF document using the `extractTextLines` method. Each line contains a collection of `TextWord` objects. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Create a PdfDataExtractor instance for the given PDF document + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extract text lines from all pages in the document + let textCollection: TextLine[] = extractor.extractTextLines({ + startPageIndex: 0, + endPageIndex: document.pageCount - 1 + }); + let page: PdfPage; + // Iterate through each extracted text line + for (let i: number = 0; i < textCollection.length; i++) { + // Get the page corresponding to the current text line + page = document.getPage(textCollection[i].pageIndex); + // Retrieve all words from the current text line + const wordCollection: TextWord[] = textCollection[i].words; + // Iterate through each word in the line + for (let j: number = 0; j < wordCollection.length; j++) { + const word: TextWord = wordCollection[j]; + if (word) { + // Iterate through each glyph (character shape) in the word + for (let k: number = 0; k < word.glyphs.length; k++) { + let glyph: TextGlyph = word.glyphs[k]; + // Draw a rectangle around the glyph's bounding box on the page + page.graphics.drawRectangle( + glyph.bounds[0], // X-coordinate + glyph.bounds[1], // Y-coordinate + glyph.bounds[2], // Width + glyph.bounds[3], // Height + new PdfPen([238, 130, 238], 1) // Violet-colored pen with thickness 1 + ); + } + } + } + } + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Working with characters + +This example demonstrates how to access individual characters from a PDF document using the `TextGlyph` class. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Create a PdfDataExtractor instance for the given PDF document + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extract text lines from all pages in the document + let textCollection: TextLine[] = extractor.extractTextLines({ + startPageIndex: 0, + endPageIndex: document.pageCount - 1 + }); + let page: PdfPage; + // Iterate through each extracted text line + for (let i: number = 0; i < textCollection.length; i++) { + // Get the page corresponding to the current text line + page = document.getPage(textCollection[i].pageIndex); + // Retrieve all words from the current text line + const wordCollection: TextWord[] = textCollection[i].words; + // Iterate through each word in the line + for (let j: number = 0; j < wordCollection.length; j++) { + const word: TextWord = wordCollection[j]; + if (word) { + // Iterate through each glyph (character shape) in the word + for (let k: number = 0; k < word.glyphs.length; k++) { + let glyph: TextGlyph = word.glyphs[k]; + // Draw a rectangle around the glyph's bounding box on the page + page.graphics.drawRectangle( + glyph.bounds[0], // X-coordinate + glyph.bounds[1], // Y-coordinate + glyph.bounds[2], // Width + glyph.bounds[3], // Height + new PdfPen([238, 130, 238], 1) // Violet-colored pen with thickness 1 + ); + } + } + } + } + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md new file mode 100644 index 000000000..bcdbc38e2 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md @@ -0,0 +1,445 @@ +--- +title: Working with EJ2 Text | Syncfusion +description: This section explains how to add text to the EJ2 PDF document using different type of fonts, TrueType fonts and standard fonts +platform: document-processing +control: PDF +documentation: UG +--- +# Working with text in the EJ2 PDF document + +## Drawing text in a new document + +This example demonstrates how to draw text in a new PDF document using the `drawString` method of the `PdfGraphics` class. The method allows you to specify the text content, font, brush, and position to render the text on a page within the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +N> Due to the inherent limitations of the PDF specification and the rendering capabilities of PDF libraries, emojis with skin tone modifiers are not supported in generated PDF documents. Only the base versions of emojis can be displayed. This limitation is common across most PDF libraries, as the PDF format does not explicitly support rendering skin tone variations in emojis. + +## The importance of saving and restoring graphics state in PDF content rendering + +This example demonstrates the importance of saving and restoring the graphics state when rendering PDF content using the `save` and `restore` methods of the `PdfGraphics` class. These methods ensure that any transformations, such as scaling, rotation, or color changes, applied to the graphics context do not affect subsequent drawing operations, maintaining consistent layout and design. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Save the current graphics state and apply transformations + graphics.save(); + graphics.translateTransform(100, 50); + graphics.rotateTransform(45); + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Drawing text in an existing document + +This example demonstrates how to draw text in an existing PDF document using the `drawString` method of the `PdfGraphics` class. The method allows you to specify the text content, font, brush, and position to render the text on a selected page within the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('input.pdf'); + // Access first page + let page: PdfPage = document.getPage(0); + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + page.graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Drawing text using different fonts + +Essential® PDF allows you to add text to the PDF document using the following types of fonts. + +1. Standard fonts +2. TrueType fonts +3. Chinese, Japanese and Korean (CJK) fonts + +### Draw text using standard fonts + +This example demonstrates how to draw text using standard fonts in a PDF document by utilizing the `drawString` method of the `PdfGraphics` class along with predefined font types from the `PdfStandardFont` class. Standard fonts such as Helvetica, TimesRoman, or Courier can be specified to render text with consistent and widely supported typography. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + page.graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Draw Text using TrueType fonts + +This example demonstrates how to draw text using TrueType fonts in a PDF document by utilizing the `drawString` method of the `PdfGraphics` class along with a `PdfTrueTypeFont` instance. The TrueType font provides enhanced text rendering with support for custom font styles. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Set font + let font: PdfTrueTypeFont = new PdfTrueTypeFont('Arial.ttf', 10); + // Draw text + page.graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Draw text using CJK fonts + +This example demonstrates how to draw text using fonts in a PDF document by utilizing the `drawString` method of the `PdfGraphics` class along with a `PdfCjkStandardFont` instance. CJK fonts provide support for Chinese, Japanese, and Korean characters, ensuring accurate rendering of multilingual text in the document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Set font + let font: PdfCjkStandardFont = new PdfCjkStandardFont(PdfCjkFontFamily.heiseiMinchoW3, 10); + // Draw text + page.graphics.drawString('こんにちは世界', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Drawing text using OpenType font + +This example demonstrates how to draw text using an OpenType font in a PDF document by utilizing the `drawString` method of the `PdfGraphics` class along with a `PdfTrueTypeFont` instance. OpenType fonts provide advanced typographic features and support for a wide range of characters. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Set font + let font: PdfTrueTypeFont = new PdfTrueTypeFont("Arial.otf", 10); + // Draw text + page.graphics.drawString('Syncfusion Essential EJ2 PDF library used to create, read, and edit PDF files in any application', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Drawing text using different text alignment + +This example demonstrates how to draw text in a PDF document using different text alignment options by utilizing the `PdfStringFormat` class. The alignment can be set through the alignment property, which supports values such as Left, Center, and Right, allowing precise control over the positioning of text within the page or a defined rectangle. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Add a new section to the document + let section: PdfSection = document.addSection(); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Create a string format object to define text layout + let format = new PdfStringFormat(); + format.alignment = PdfTextAlignment.right; // Align text to the right + format.wordSpacing = 2; // Set word spacing + format.characterSpacing = 1; // Set character spacing + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Draw text + page.graphics.drawString('Syncfusion Essential EJ2 PDF library', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255]), format); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## LineLimit, ClipPath, NoClip properties in PdfStringFormat + +**LineLimit:** When LineLimit is enabled, the provided string will be laid out within the specified bounds. If the LineLimit property is disabled, the layout will continue to fill any remaining space. The default value of the LineLimit property is true. + +**NoClip:** If we enable the NoClip option, it will show the text without cutting any words. If we disable the NoClip option, any text outside the fitting area will be hidden. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Set the page margins to zero + let settings: PdfPageSettings = new PdfPageSettings(); + settings.margins = new PdfMargins(0); + // Add a new section to the document + let section: PdfSection = document.addSection(settings); + // Add a page to the section + let page: PdfPage = section.addPage(); + // Set font + let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + // Create a new PdfStringFormat and set its properties + let format: PdfStringFormat = new PdfStringFormat(); + // Set no clip + format.noClip = true; + // Set line limit + format.lineLimit = false; + // Draw text + page.graphics.drawString('PDF text line 1 \r\nPDF text line 3', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255]), format); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md new file mode 100644 index 000000000..108bac2e1 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md @@ -0,0 +1,1317 @@ +--- +title: Working with EJ2 Forms | Syncfusion +description: This section explains how to create, fill, modify, read only and flatten form fields in the EJ2 PDF document +platform: document-processing +control: PDF +documentation: UG +--- +# Working with EJ2 PDF Forms + +An interactive form, sometimes referred to as an AcroForm is a collection of fields for gathering information. A EJ2 PDF document can contain any number of fields appearing on any combination of pages, all of that make a single, globally interactive form spanning the entire document. + +## Creating a new PDF form + +Essential® EJ2 PDF allows you to create and manage the form in PDF document by using `PdfForm` class. The `PdfForm` class represents the entire field collection of the form. + +### Adding the text box field + +This example demonstrates how to add a text box field to a PDF document using the `PdfTextBoxField` class. A text box field allows users to enter text data in interactive PDF forms. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +//Add the PDF page. +let page = document.addPage(); +// Access the PDF form from the document +let form = document.form; +// Create a new text box field named 'Name' on the first page at specified position and size +let field: PdfTextBoxField = new PdfTextBoxField(page, 'Name', { x: 0, y: 0, width: 100, height: 50 }); +// Set the default text value for the text box +field.text = 'John'; +// Apply a standard font (Helvetica) with size 10 to the text box +field.font = new PdfStandardFont(PdfFontFamily.helvetica, 10); +// Set the background color of the text box to red +field.backColor = { r: 255, g: 0, b: 0 }; +// Set the border color of the text box to blue +field.borderColor = { r: 0, g: 0, b: 255 }; +// Add a tooltip to the text box for user guidance +field.toolTip = 'FirstName'; +// Set the text color inside the text box to green +field.color = { r: 0, g: 255, b: 0 }; +// Add the configured text box field to the PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form from the document +let form = document.form; +// Create a new text box field named 'Name' on the first page at specified position and size +let field: PdfTextBoxField = new PdfTextBoxField(page, 'Name', { x: 0, y: 0, width: 100, height: 50 }); +// Set the default text value for the text box +field.text = 'John'; +// Apply a standard font (Helvetica) with size 10 to the text box +field.font = new PdfStandardFont(PdfFontFamily.helvetica, 10); +// Set the background color of the text box to red +field.backColor = { r: 255, g: 0, b: 0 }; +// Set the border color of the text box to blue +field.borderColor = { r: 0, g: 0, b: 255 }; +// Add a tooltip to the text box for user guidance +field.toolTip = 'FirstName'; +// Set the text color inside the text box to green +field.color = { r: 0, g: 255, b: 0 }; +// Add the configured text box field to the PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the combo box field + +This example demonstrates how to add a combo box field to a PDF document using the `PdfComboBoxField` class. A combo box field provides a drop-down list for users to select predefined options. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new combo box field +let field: PdfComboBoxField = new PdfComboBoxField(page, 'list1', { x: 100, y: 60, width: 100, height: 50 }); +// Add list items to the field +field.addItem(new PdfListFieldItem('English', 'English')); +field.addItem(new PdfListFieldItem('French', 'French')); +field.addItem(new PdfListFieldItem('German', 'German')); +// Set the selected index +field.selectedIndex = 2; +// Set the flag indicating whether the combo box allows multiple selections +field.multiSelect = true; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new combo box field +let field: PdfComboBoxField = new PdfComboBoxField(page, 'list1', { x: 100, y: 60, width: 100, height: 50 }); +// Add list items to the field +field.addItem(new PdfListFieldItem('English', 'English')); +field.addItem(new PdfListFieldItem('French', 'French')); +field.addItem(new PdfListFieldItem('German', 'German')); +// Set the selected index +field.selectedIndex = 2; +// Set the flag indicating whether the combo box allows multiple selections +field.multiSelect = true; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the radio button field + +This example demonstrates how to add a radio button field to a PDF document using the `PdfRadioButtonListField` class. Radio buttons allow users to select one option from a group of choices. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new radio button list field +let field: PdfRadioButtonListField = new PdfRadioButtonListField(page, 'Age'); +// Create and add first item +let first: PdfRadioButtonListItem = field.add('1-9', { x: 100, y: 140, width: 20, height: 20 }); +// Create and add second item +let second: PdfRadioButtonListItem = new PdfRadioButtonListItem('10-49', { x: 100, y: 170, width: 20, height: 20 }, page); +field.add(second); +// Set selected index of the radio button list field +field.selectedIndex = 0; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new radio button list field +let field: PdfRadioButtonListField = new PdfRadioButtonListField(page, 'Age'); +// Create and add first item +let first: PdfRadioButtonListItem = field.add('1-9', { x: 100, y: 140, width: 20, height: 20 }); +// Create and add second item +let second: PdfRadioButtonListItem = new PdfRadioButtonListItem('10-49', { x: 100, y: 170, width: 20, height: 20 }, page); +field.add(second); +// Set selected index of the radio button list field +field.selectedIndex = 0; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the list box field + +This example demonstrates how to add a list box field to a PDF document using the `PdfListBoxField` class. A list box field displays multiple options, allowing users to select one or more items. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new list box field +let field: PdfListBoxField = new PdfListBoxField(page, 'list1', { x: 100, y: 60, width: 100, height: 50 }); +// Add list items to the field +field.addItem(new PdfListFieldItem('English', 'English')); +field.addItem(new PdfListFieldItem('French', 'French')); +field.addItem(new PdfListFieldItem('German', 'German')); +// Set the selected index +field.selectedIndex = 2; +// Set the flag indicating whether the list box allows multiple selections +field.multiSelect = true; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new list box field +let field: PdfListBoxField = new PdfListBoxField(page, 'list1', { x: 100, y: 60, width: 100, height: 50 }); +// Add list items to the field +field.addItem(new PdfListFieldItem('English', 'English')); +field.addItem(new PdfListFieldItem('French', 'French')); +field.addItem(new PdfListFieldItem('German', 'German')); +// Set the selected index +field.selectedIndex = 2; +// Set the flag indicating whether the list box allows multiple selections +field.multiSelect = true; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the check Box field + +This example demonstrates how to add a check box field to a PDF document using the `PdfCheckBoxField` class. Check boxes allow users to select or deselect options in a form. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new check box field +let field: PdfCheckBoxField = new PdfCheckBoxField('CheckBox1', { x: 100, y: 40, width: 20, height: 20 }, page); +// Set the checked flag as true +field.checked = true; +// Set the tooltip value +field.toolTip = 'Checked'; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new check box field +let field: PdfCheckBoxField = new PdfCheckBoxField('CheckBox1', { x: 100, y: 40, width: 20, height: 20 }, page); +// Set the checked flag as true +field.checked = true; +// Set the tooltip value +field.toolTip = 'Checked'; +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the signature field + +This example demonstrates how to add a signature field to a PDF document using the `PdfSignatureField` class. A signature field enables users to digitally sign the PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Adding the button field + +This example demonstrates how to add a button field to a PDF document using the `PdfButtonField` class. Buttons can be configured to perform actions such as submitting a form or triggering JavaScript. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new section to the document +let section: PdfSection = document.addSection(); +// Add a page to the section +let page: PdfPage = section.addPage(); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new button field +let field: PdfButtonField = new PdfButtonField(page , 'Button1', {x: 100, y: 40, width: 100, height: 20}); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +The following code snippet explains how to add a popup annotation in an existing PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { +// Load an existing PDF document +let document: PdfDocument = new PdfDocument('Input.pdf'); +// Access the first page +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new button field +let field: PdfButtonField = new PdfButtonField(page , 'Button1', {x: 100, y: 40, width: 100, height: 20}); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Filling form fields in an existing PDF Document + +Essential® EJ2 PDF allows you to fill the form fields using PdfField class. + +### Filling the text box field + +This example demonstrates how to fill a text box field in a PDF document using the `text` property of the `PdfTextBoxField` class. The following code snippet illustrates how to set the text value for the field. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access text box field + let field: PdfTextBoxField = document.form.fieldAt(0) as PdfTextBoxField; + // Sets the text value to text box field + field.text = ‘Syncfusion’; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Filling the combo box field + +This example demonstrates how to fill a combo box field in a PDF document using the `selectedIndex` property of the `PdfComboBoxField` class. The following code snippet shows how to change the selected index in a combo box. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access combobox field + let field: PdfComboBoxField = document.form.fieldAt(0) as PdfComboBoxField; + // Sets the selected index + field.selectedIndex = 2; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Filling the radio button field + +This example demonstrates how to fill a radio button field in a PDF document using the `selectedIndex` property of the `PdfRadioButtonListField` class. The following code snippet illustrates how to change the selected index in a radio button. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access radio button list field + let field: PdfRadioButtonListField = document.form.fieldAt(0) as PdfRadioButtonListField; + // Sets the selected index + field.selectedIndex = 2; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Filling the list box field + +This example demonstrates how to fill a list box field in a PDF document using the `selectedIndex` property of the `PdfLoadedListBoxField` class. The following code snippet shows how to change the selected index in a list box. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access listbox field + let field: PdfListBoxField = document.form.fieldAt(2) as PdfListBoxField; + // Sets the selected index + field.selectedIndex = 2; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + + +### Filling the check Box field + +This example demonstrates how to fill a check box field in a PDF document using the `Checked` property of the `PdfCheckBoxField` class. The following code snippet illustrates how to mark a checkbox as selected. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access checkbox field + let field: PdfCheckBoxField = document.form.fieldAt(2) as PdfCheckBoxField; + // Sets the tooltip value + field.toolTip = 'Checked'; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + + +### Filling the signature field + +This example demonstrates how to fill a signature field in a PDF document using the `PdfSignatureField` class. The following code snippet illustrates how to create a signature using PFX data and assign it to the signature field. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access the PDF form + let form: PdfForm = document.form; + // Create a new signature field + let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); + // Create a new signature using PFX data and private key + const sign: PdfSignature = PdfSignature.create(certData, password, { cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 }); + // Sets the signature to the field + field.setSignature(sign); + // Add the field into PDF form + form.add(field); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Retrieving/Modifying the form fields + +### Modifying the existing form field in PDF document + +This example demonstrates how to modify an existing form field in a PDF document using the `PdfTextBoxField` class. The following code snippet illustrates how to update the text value, alignment, and default value of a text box field. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the first page + let page: PdfPage = document.getPage(0); + // Access text box field + let field: PdfTextBoxField = document.form.fieldAt(0) as PdfTextBoxField; + // Sets the text value to text box field + field.text = ‘Syncfusion’; + // Sets the text alignment of form field as center + field.textAlignment = PdfTextAlignment.center; + // Sets the default value of the text box field + field.defaultValue = 'Syncfusion'; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Removing the form fields from existing PDF document + +This example demonstrates how to remove items from an existing form field in a PDF document using the `removeItemAt()` method of the `PdfField` class. The following code snippet illustrates how to access a form field and remove its first item. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the form field at index 0 + let field: PdfField = document.form.fieldAt(0); + // Remove the first item of the form field + field.removeItemAt(0); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Flattening form fields in a PDF + +This example demonstrates how to flatten form fields in a PDF document to make their values permanent and non-editable. Flattening removes the interactive elements while preserving the visual appearance of the filled data. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Get the first field + let field: PdfField = document.form.fieldAt(0); + // Sets the boolean flag indicating whether the form field have been flattened or not. + field.flatten = true; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Marking form fields as Read-Only + +This example demonstrates how to mark form fields as read-only by accessing them from the PdfFormFieldCollection and setting their ReadOnly property to true. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Access the form field at index 0 + let field: PdfField = document.form.fieldAt(0); + // Sets a value indicating whether read only. + field.readOnly = true; + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Importing form fields + +### Importing FDF file to PDF + +This example demonstrates how to import form data from an FDF file into a PDF document using the `importFormData` method. Importing FDF data allows you to populate form fields in a PDF with values from an external data source. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Imports form data from to the PDF document. + document.importFormData('formData.fdf', DataFormat.fdf); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Importing XFDF file to PDF + +This example demonstrates how to import form data from an XFDF file into a PDF document using the `importFormData` method. Importing XFDF data allows you to populate form fields in a PDF with values from an external data source. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Imports form data from to the PDF document. + document.importFormData('formData.xfdf', DataFormat.xfdf); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +## Exporting form fields + +### Export PDF file to FDF + +This example demonstrates how to export form data from a PDF document to an FDF file using the `exportFormData` method. Exporting FDF data allows you to save the values of form fields in a lightweight format for reuse or integration with other systems. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Sets the form field data export settings with output data format. + let settings: PdfFormFieldExportSettings = new PdfFormFieldExportSettings(); + settings.dataFormat = DataFormat.fdf; + // Export form field to fdf format + let fdf: Uint8Array = document.exportFormData(settings); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} + +### Export PDF file to XFDF + +This example demonstrates how to export form data from a PDF document to an XFDF file using the `exportFormData` method. Exporting XFDF data allows you to save the values of form fields in a lightweight format for reuse or integration with other systems. + +{% tabs %} +{% highlight ts tabtitle="index.ts" %} + +// Create and render button +let button: Button = new Button(); +button.appendTo('#normalbtn'); + +// Handle click event +button.element.onclick = async () => { + console.log('Start PDF Creation'); + createPdf(); +}; + +// Function to create PDF +function createPdf() { + // Load an existing PDF document + let document: PdfDocument = new PdfDocument('Input.pdf'); + // Sets the form field data export settings with output data format. + let settings: PdfFormFieldExportSettings = new PdfFormFieldExportSettings(); + settings.dataFormat = DataFormat.xfdf; + // Export form field to XFDF format + let xfdf: Uint8Array = document.exportFormData(settings); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); +} + +{% endhighlight %} +{% highlight html tabtitle="index.html" %} + +
    + +
    + +{% endhighlight %} +{% endtabs %} \ No newline at end of file From 87dda759fbeb0c7c20cbb55f9b286c5885f68a7d Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 3 Dec 2025 12:33:22 +0530 Subject: [PATCH 02/13] 994201-dev: Added TOC files. --- Document-Processing-toc.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 3a2460b66..8f5f1088e 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -2545,7 +2545,26 @@ JavaScript +
  • Flutter From 77f9b7a6d0a841018826e78ab020e8c2ffa13774 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Wed, 3 Dec 2025 12:48:51 +0530 Subject: [PATCH 03/13] 994201-dev: Resolved CI failures. --- Document-Processing/PDF/PDF-Library/javascript/Overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Overview.md b/Document-Processing/PDF/PDF-Library/javascript/Overview.md index 146eb01ae..66f0b4596 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Overview.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Overview.md @@ -36,8 +36,8 @@ The following are the key features of this library. ## Supported web platforms -* ASP.Net core -* ASP.Net MVC +* ASP.NET core +* ASP.NET MVC * Angular * React * Vue From 4d46afed7151106ca0496b95ac1d539c7fcd2a34 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Thu, 4 Dec 2025 23:05:39 +0530 Subject: [PATCH 04/13] 994201-dev: Added Overall UG documentation. --- Document-Processing-toc.html | 12 +- .../javascript/Create-PDF-document-angular.md | 106 ++++++++++++++++++ .../Create-PDF-document-asp-net-core.md | 84 ++++++++++++++ .../Create-PDF-document-asp-net-mvc.md | 84 ++++++++++++++ .../Create-PDF-document-javascript.md | 85 ++++++++++++++ .../javascript/Create-PDF-document-react.md | 77 +++++++++++++ .../Create-PDF-document-typescript.md | 93 +++++++++++++++ .../javascript/Create-PDF-document-vue.md | 106 ++++++++++++++++++ .../PDF-Library/javascript/Getting-Started.md | 90 --------------- .../Asp-net-core-creation1.png | Bin 0 -> 60011 bytes .../Asp-net-core-creation2.png | Bin 0 -> 31112 bytes .../Asp-net-core-creation3.png | Bin 0 -> 40667 bytes .../Asp-net-mvc-creation1.png | Bin 0 -> 54291 bytes .../Asp-net-mvc-creation2.png | Bin 0 -> 29118 bytes .../Asp-net-mvc-creation3.png | Bin 0 -> 62519 bytes .../Getting_started_images/Output.png | Bin 0 -> 30575 bytes .../Getting_started_images/vue2-terminal.png | Bin 0 -> 9489 bytes 17 files changed, 646 insertions(+), 91 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-mvc.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-javascript.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-typescript.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md delete mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-core-creation1.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-core-creation2.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-core-creation3.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation1.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation2.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation3.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Output.png create mode 100644 Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/vue2-terminal.png diff --git a/Document-Processing-toc.html b/Document-Processing-toc.html index 8f5f1088e..a8a47c606 100644 --- a/Document-Processing-toc.html +++ b/Document-Processing-toc.html @@ -2545,7 +2545,17 @@ JavaScript
    • Overview
    • -
    • Getting Started
    • +
    • Getting Started + +
    • Loading and Saving
    • Working with document
    • Working with pages
    • diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md new file mode 100644 index 000000000..fce562c10 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md @@ -0,0 +1,106 @@ +--- +layout: post +title: Create or Generate PDF file in Angular | Syncfusion +description: Learn how to create a PDF file in Angular with easy steps using Syncfusion TypeScript PDF library without depending on Adobe +platform: document-processing +control: PDF +documentation: ug +keywords: angular create pdf, angular generate pdf, angular pdf library, ej2 pdf angular, TypeScript +--- + +# Create or Generate PDF file in Angular application + +The Syncfusion® TypeScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. + +This guide explains how to integrate the TypeScript PDF library into an Angular application. + +## Setup Angular Environment + +You can use the [`Angular CLI`](https://github.com/angular/angular-cli) to setup your Angular applications. +To install the latest Angular CLI globally use the following command. + +```bash +npm install -g @angular/cli +``` + +N> Use the command **npm install --save @angular/cli@12.0.2** to install the Angular CLI version 12.0.2 + +## Create an Angular Application + +Start a new Angular application using the Angular CLI command as follows. + +```bash +ng new my-app +cd my-app +``` +## Create a PDF document using TypeScript + +* Add a simple button to `main.ts` and attach a click handler that uses the TypeScript PDF API to create a new PDF document. + +{% tabs %} +{% highlight ts tabtitle="main.ts" %} + + + + PDF creation example + + + + + + +{% endhighlight %} +{% endtabs %} + +* Include the following namespaces in `app.component.ts` file. + +{% tabs %} +{% highlight c# tabtitle="~/app.component.ts" %} + +import { NgModule } from '@angular/core'; +import { PdfDocument, PdfPage, PdfStandardFont, PdfPen, PdfBrush } from '@syncfusion/ej2-pdf'; + +{% endhighlight %} +{% endtabs %} + +* Include the following code example in the click event of the button in `app.component.ts` to generate a PDF document. + +{% tabs %} +{% highlight html tabtitle="app.component.ts" %} + +document.getElementById('normalButton').onclick = (): void => { + // Create a new PDF document + var pdf = new PdfDocument(); + // Add a new page + var page = pdf.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + var font = pdf.embedFont(ej.pdf.PdfFontFamily.helvetica, 36, pdf.PdfFontStyle.regular); + // Create a new black brush + var brush = new pdf.PdfBrush({r: 0, g: 0, b: 0}); + // Draw text + graphics.drawString('Hello World!!!', font, {x: 20, y: 20, width: graphics.clientSize.width - 20, height: 60}, brush); + // Save and download PDF + pdf.save('Output.pdf'); + // Destroy the PDF document instance + pdf.destroy(); + }); +}; + +{% endhighlight %} +{% endtabs %} + +## Run the application + +Use the following command to run the application in browser. + +```javascript +ng serve --open +``` + +By executing the program, you will get the PDF document as follows. + +![Output PDF document](Getting_started_images/Output.png) + + diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md new file mode 100644 index 000000000..e7cc37e23 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md @@ -0,0 +1,84 @@ +--- +layout: post +title: Create or Generate PDF file in ASP.NET Core | Syncfusion +description: Learn how to create or generate a PDF file in ASP.NET Core applications with easy steps using Syncfusion JavaScript PDF library without depending on Adobe. +platform: document-processing +control: PDF +documentation: ug +keywords: .net core create pdf, edit pdf, merge, pdf form, fill form, digital sign, table, javascript, dotnet core pdf, asp generate pdf, aspx generate pdf +--- + +# Create or Generate PDF file in ASP.NET Core + +The Syncfusion® JavaScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, forms, and secure PDF files. + +This guide explains how to integrate the JavaScript PDF library into an ASP.NET Core application. + +## Integrate PDF library into an ASP.NET Core application + +1. Start Visual Studio and select **Create a new project**. +2. In the **Create a new project** dialog, select **ASP.NET Core Web App**. +![ASP.NET Core PDF creation1](Getting_started_images/Asp-net-core-creation1.png) +3. In the **Configure your new project** dialog, enter the project name and select **Next**. +![ASP.NET Core PDF creation2](Getting_started_images/Asp-net-core-creation2.png) +4. In the **Additional information** dialog, select a .NET LTS version (for example, **.NET 8.0 (Long-term Support)**) and then select **Create**. +![ASP.NET Core PDF creation3](Getting_started_images/Asp-net-core-creation3.png) + +5. **Add script reference** : Add the required scripts using the CDN inside the `` of `~/Views/Shared/_Layout.cshtml` as follows: + +{% tabs %} +{% highlight c# tabtitle="~/_Layout.cshtml" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +6. **Create a PDF document** : Add the script in `~/Views/Home/Index.cshtml` by creating a button and attaching a click event that uses the JavaScript PDF API to generate a PDF document. + +{% tabs %} +{% highlight c# tabtitle="~/Index.cshtml" %} + +
      +

      Create PDF document

      +

      Click the button to generate and download a PDF.

      + +
      + +@section Scripts { + +} + +{% endhighlight %} +{% endtabs %} + +7. **Build the project** : Click on Build > Build Solution or press Ctrl + Shift + B to build the project. + +8. **Run the project** : Click the Start button (green arrow) or press F5 to run the app. + +By executing the program, you will generate the following PDF document. + +![ASP.NET Core PDF output](Getting_started_images/Output.png) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-mvc.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-mvc.md new file mode 100644 index 000000000..1cd73147c --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-mvc.md @@ -0,0 +1,84 @@ +--- +layout: post +title: Create or Generate PDF file in ASP.NET Core MVC | Syncfusion +description: Learn how to create a PDF file in ASP.NET Core MVC with easy steps using Syncfusion JavaScript PDF library without depending on Adobe +platform: document-processing +control: PDF +documentation: ug +keywords: MVC, javascript, pdf +--- + +# Create or Generate PDF file in ASP.NET Core MVC + +The Syncfusion® JavaScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. + +This guide explains how to integrate the JavaScript PDF library into an ASP.NET Core MVC application. + +## Integrate PDF library into an ASP.NET MVC application + +1. Start Visual Studio and select **Create a new project**. +2. Create a new ASP.NET MVC Web Application project. +![ASP.NET Core MVC PDF creation1](Getting_started_images/Asp-net-mvc-creation1.png) +3. Choose the target framework. +![ASP.NET Core MVC PDF creation2](Getting_started_images/Asp-net-mvc-creation2.png) +4. Select Web Application pattern (MVC) for the project and then select **Create** button. +![ASP.NET Core MVC PDF creation3](Getting_started_images/Asp-net-mvc-creation3.png) + +5. **Add script reference** : Add the required scripts using the CDN inside the `` of `~/Views/Shared/_Layout.cshtml` as follows: + +{% tabs %} +{% highlight c# tabtitle="~/_Layout.cshtml" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +6. **Create a PDF document** : Add the script in `~/Views/Home/Index.cshtml` by creating a button and attaching a click event that uses the JavaScript PDF API to generate a PDF document. + +{% tabs %} +{% highlight c# tabtitle="~/Index.cshtml" %} + +
      +

      Create PDF document

      +

      Click the button to generate and download a PDF.

      + +
      + +@section Scripts { + +} + +{% endhighlight %} +{% endtabs %} + +7. **Build the project** : Click on Build > Build Solution or press Ctrl + Shift + B to build the project. + +8. **Run the project** : Click the Start button (green arrow) or press F5 to run the app. + +By executing the program, you will generate the following PDF document. + +![ASP.NET Core MVC PDF output](Getting_started_images/Output.png) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-javascript.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-javascript.md new file mode 100644 index 000000000..d567d2d91 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-javascript.md @@ -0,0 +1,85 @@ +--- +layout: post +title: Create or Generate PDF file in JavaScript | Syncfusion +description: Learn how to create a PDF file in JavaScript with easy steps using Syncfusion JavaScript PDF library without depending on Adobe +platform: document-processing +control: PDF +documentation: ug +keywords: javascript, pdf, script +--- + +# Create or Generate PDF file in JavaScript + +The Essential JS 2 for JavaScript (global script) is an ES5 formatted pure JavaScript framework which can be directly used in latest web browsers. + +## Component Initialization with CDN link for script and style reference + +**Step 1:** Create an app folder `my-app` for the Essential JS 2 JavaScript components. + +**Step 2:** The Essential JS 2 component's global scripts and styles are already hosted in the below CDN link formats. + +**Syntax:** +> Script: `https://cdn.syncfusion.com/ej2/{Version}/dist/{PACKAGE_NAME}.min.js` +> +> Styles: `https://cdn.syncfusion.com/ej2/{Version}/{PACKAGE_NAME}/styles/material.css` + +**Example:** +> Script: [`https://cdn.syncfusion.com/ej2/31.2.15/dist/ej2.min.js`](https://cdn.syncfusion.com/ej2/31.2.15/dist/ej2.min.js) +> +> Styles: [`https://cdn.syncfusion.com/ej2/31.2.15/ej2-base/styles/material.css`](https://cdn.syncfusion.com/ej2/31.2.15/ej2-base/styles/material.css) + +**Step 3:** Create a HTML page (index.html) in `my-app` location and add the CDN link references. + +{% tabs %} +{% highlight ts tabtitle="index.html" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +**Step 4:** **Create a PDF document** : Add the script in `index.html` by creating a button and attaching a click event that uses the JavaScript PDF API to generate a PDF document. + +{% tabs %} +{% highlight c# tabtitle="~/Index.html" %} + +
      +

      Create PDF document

      +

      Click the button to generate and download a PDF.

      + +
      + +@section Scripts { + +} + +{% endhighlight %} +{% endtabs %} + +By executing the program, you will get the PDF document as follows. + +![Output PDF document](Getting_started_images/Output.png) + diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md new file mode 100644 index 000000000..4a4f8b3a2 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md @@ -0,0 +1,77 @@ +--- +layout: post +title: Create or Generate PDF file in React | Syncfusion +description: Learn how to create a PDF file in React with easy steps using Syncfusion JavaScript PDF library without depending on Adobe +control: PDF +platform: document-processing +documentation: ug +keywords: javascript, pdf, script, react +--- + +# Create or Generate PDF file in React + +The Syncfusion® Javascript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. + +This guide explains how to integrate the Javascript PDF library into an React application. + +## Add script reference + +* Add the required scripts using the CDN inside the `` of `public/index.html` using the following code. + +``` + + ... + + + +``` + +**Create a PDF document** : Add the script in `App.jsx` by creating a button and attaching a click event that uses the Javascript PDF API to generate a PDF document. + +{% tabs %} +{% highlight c# tabtitle="~/App.jsx" %} + +import React from 'react'; + +export default function App() { + const createPdf = () => { + // Create a new PDF document + var pdf = new window.ej.pdf.PdfDocument(); + // Add a new page + var page = pdf.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + var font = pdf.embedFont(window.ej.pdf.PdfFontFamily.helvetica, 36,window.ej.pdf.PdfFontStyle.regular); + // Create a new black brush + var brush = new window.ej.pdf.PdfBrush({r: 0, g: 0, b: 0}); + // Draw text + graphics.drawString('Hello World!!!', font, {x: 20, y: 20, width: graphics.clientSize.width - 20, height: 60}, brush); + // Save and download PDF + pdf.save('Output.pdf'); + // Destroy the PDF document instance + pdf.destroy(); + }; + + return ( +
      + +
      + ); +} + +{% endhighlight %} +{% endtabs %} + +## Run the application + +Now run the `npm run dev` command in the console to start the development server. This command compiles your code and serves the application locally, opening it in the browser. + +``` +npm run dev +``` +By executing the program, you will get the PDF document as follows. + +![Output PDF document](Getting_started_images/Output.png) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-typescript.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-typescript.md new file mode 100644 index 000000000..c92d976ad --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-typescript.md @@ -0,0 +1,93 @@ +--- +layout: post +title: Create or Generate PDF file in TypeScript | Syncfusion +description: Learn how to create a PDF file in TypeScript with easy steps using Syncfusion TypeScript PDF library without depending on Adobe +platform: document-processing +control: PDF +documentation: ug +keywords: pdf, script, typescript +--- + +# Create or Generate PDF file in TypeScript + +The Syncfusion® TypeScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. + +This guide explains how to integrate the TypeScript PDF library into an TypeScript application. + +## Dependencies + +The following list of dependencies are required to use the `TypeScript PDF library` component in your application. + +```typescript +|-- @syncfusion/ej2-compression +|-- @syncfusion/ej2-base +``` + +## Create a PDF document using TypeScript. + +* Add a simple button to `index.html` and attach a click handler that uses the TypeScript PDF API to create a new PDF document. + +{% tabs %} +{% highlight ts tabtitle="index.html" %} + + + + Button onclick Example + + + + + + +{% endhighlight %} +{% endtabs %} + +* Include the following namespaces in `index.ts` file. + +{% tabs %} +{% highlight html tabtitle="index.ts" %} + +import { PdfDocument, PdfPage, PdfStandardFont, PdfPen, PdfBrush } from '@syncfusion/ej2-pdf'; + +{% endhighlight %} +{% endtabs %} + +* Include the following code example in the click event of the button in `index.ts` to generate a PDF document + +{% tabs %} +{% highlight html tabtitle="index.ts" %} + +document.getElementById('normalButton').onclick = (): void => { + // Create a new PDF document + var pdf = new pdf.PdfDocument(); + // Add a new page + var page = pdf.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + var font = pdf.embedFont(PdfFontFamily.helvetica, 36, PdfFontStyle.regular); + // Create a new black brush + var brush = new pdf.PdfBrush({r: 0, g: 0, b: 0}); + // Draw text + graphics.drawString('Hello World!!!', font, {x: 20, y: 20, width: graphics.clientSize.width - 20, height: 60}, brush); + // Save and download PDF + pdf.save('Output.pdf'); + // Destroy the PDF document instance + pdf.destroy(); +}; + +{% endhighlight %} +{% endtabs %} + +* **Run the application** + +The quickstart project is configured to compile and run in the browser. Use the following command to start the application: + +```javascript +npm start +``` + +By executing the program, you will get the PDF document as follows. + +![Output PDF document](Getting_started_images/Output.png) + diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md new file mode 100644 index 000000000..e97aee2c7 --- /dev/null +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md @@ -0,0 +1,106 @@ +--- +layout: post +title: Create or Generate PDF file in Vue | Syncfusion +description: Learn how to create a PDF file in Vue with easy steps using Syncfusion JavaScript PDF library without depending on Adobe +control: PDF +platform: document-processing +documentation: ug +keywords: pdf, script, vue, javascript +--- + +# Create or Generate PDF file in Vue application + +The Syncfusion® JavaScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. + +This guide explains how to integrate the JavaScript PDF library into an Vue application. + +## Setting up the Vue 2 project + +To generate a Vue 2 project using Vue-CLI, use the [Vue create](https://cli.vuejs.org/#getting-started) command. Follow these steps to install Vue CLI and create a new project: + +```bash +npm install -g @vue/cli +vue create quickstart +cd quickstart +``` + +or + +```bash +yarn global add @vue/cli +vue create quickstart +cd quickstart +``` + +When creating a new project, choose the option `Default ([Vue 2] babel, es-lint)` from the menu. + +![Vue 2 project](Getting_started_images/vue2-terminal.png) + +Once the `quick start` project is set up with default settings, proceed to add Syncfusion® components to the project. + +* **Add script reference** : Add the required scripts using the CDN inside the `` of `index.html` as follows: + +{% tabs %} +{% highlight c# tabtitle="~/index.html" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +* **Create a PDF document** : Add the script in `App.vue` by creating a button and attaching a click event that uses the JavaScript PDF API to generate a PDF document. + +{% tabs %} +{% highlight c# tabtitle="~/App.vue" %} + + + +{% endhighlight %} +{% endtabs %} + +## Run the project + +To run the project, use the following command: + +```bash +npm run serve +``` +or + +```bash +yarn run serve +``` + +By executing the program, you will generate the following PDF document. + +![Vue PDF output](Getting_started_images/Output.png) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md b/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md deleted file mode 100644 index 93d95b33e..000000000 --- a/Document-Processing/PDF/PDF-Library/javascript/Getting-Started.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -layout: post -title: Getting started with JavaScript PDF library | Syncfusion -description: Learn how to set up and use the Syncfusion JavaScript PDF library using the EJ2 quickstart, including local resource configuration and module injection. -platform: document-processing -control: PDF -documentation: ug -domainurl: ##DomainURL## ---- - -# Getting started with JavaScript PDF library - -This guide explains how to create the PDF library component and configure its features in TypeScript using the Essential JS 2 [quickstart](https://github.com/SyncfusionExamples/ej2-quickstart-webpack-) seed repository. - -> This application is integrated with a webpack configuration (`webpack.config.js`) and uses the latest version of the [webpack-cli](https://webpack.js.org/api/cli/#commands). It requires Node.js `v14.15.0` or higher. For more information, refer to the [webpack getting started guide](https://webpack.js.org/guides/getting-started/). - -## Dependencies - -The following list of dependencies are required to use the `EJ2 PDF library` component in your application. - -```javascript -|-- @syncfusion/ej2-compression -|-- @syncfusion/ej2-base -|-- @syncfusion/ej2-file-utils - -``` - -## Add Syncfusion JavaScript packages - -Syncfusion JavaScript (Essential JS 2) packages are available on the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. Install all EJ2 controls with the [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) meta package or install individual control packages. - -The quickstart application is preconfigured with [@syncfusion/ej2](https://www.npmjs.com/package/@syncfusion/ej2) in `~/package.json`. Use the following command to install dependencies: - -{% tabs %} -{% highlight bash tabtitle="NPM" %} - -npm install - -{% endhighlight %} -{% endtabs %} - -## Create EJ2 PDF with local resources - -This example demonstrates how to create a PDF document directly using Syncfusion EJ2 PDF library. A button is provided to trigger the PDF creation process. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a page - const page = document.addPage(); - // Get graphics from the page - let graphics = page.graphics; - // Set font - font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); - // Draw text - graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - -{% endhighlight %} -{% endtabs %} - -By executing the program, you will get the PDF document as follows. - -![Output EJ2 PDF document](EJ2-images/Helloworld.png) - diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-core-creation1.png b/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-core-creation1.png new file mode 100644 index 0000000000000000000000000000000000000000..86a0ddc0ceb326accafdf2d36775acecd0ac5e4e GIT binary patch literal 60011 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%0AaDXWo8)K7Sbra$6OPe~ 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

      K$>L%ETCH?(XAd}^BSsS*bF5jznUVGhc-Ol-! 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

      U0@79f~W8AiXpjvRJP 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 JUb*Y@e*iOE&UgR- literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation1.png b/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3e72ceec33f9743af81b195d86bd8c81d1d9bb GIT binary patch literal 54291 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation2.png b/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Asp-net-mvc-creation2.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d721dd565ac1c2aa6cb63014bfb5f8670eb7fd GIT binary patch literal 29118 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%0A*qK5 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

      jYoQ5$5x&^l4G<-P%ELHeQg;Y5XwYMyM#3bn_@ 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 I@5tG|0s6V6ZU6uP literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Output.png b/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/Output.png new file mode 100644 index 0000000000000000000000000000000000000000..0c42217b1fe14d896d147125788bc8ef7f2d63e4 GIT binary patch literal 30575 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/vue2-terminal.png b/Document-Processing/PDF/PDF-Library/javascript/Getting_started_images/vue2-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..39beefaa25348abb1ec9d6bcb4b2f0e1a0e60b0e GIT binary patch literal 9489 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 Date: Fri, 5 Dec 2025 17:32:57 +0530 Subject: [PATCH 05/13] PDF contents updated --- .../javascript/Open-and-save-PDF-files.md | 78 +- .../javascript/Working-with-Annotations.md | 700 +++++++----------- 2 files changed, 297 insertions(+), 481 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md b/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md index f92c5ff71..a476c7b7d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Open-and-save-PDF-files.md @@ -1,7 +1,7 @@ --- layout: post -title: Open and save PDF files in JavaScript PDF library | Syncfusion -description: Learn to load and save PDFs in Syncfusion JavaScript PDF library using URLs, base64 strings, or byte arrays with server-backed services. +title: Open and save PDF files using JavaScript PDF library | Syncfusion +description: Learn to load and save PDFs in Syncfusion JavaScript PDF library using data as base64 strings or byte arrays. platform: document-processing control: PDF documentation: ug @@ -12,70 +12,65 @@ domainurl: ##DomainURL## ## Opening an existing PDF document -Open an existing PDF document using the `PdfDocument` class with the specified string data. +Open an existing PDF document using the `PdfDocument` class with the specified PDF data. -```javascript +```typescript // Load an existing PDF document from string data -let document: PdfDocument = new PdfDocument("Input.pdf"); - +let document: PdfDocument = new PdfDocument(data); ``` - ## Opening an existing PDF document from a byte array +The PdfDocument constructor can accept PDF data in either Base64 string or Uint8Array format. Here’s a quick example for both approaches: -Open an existing PDF document using the `PdfDocument` class with the specified byte array. +### Using Base64 String + +Open an existing PDF document using the `PdfDocument` class with the specified PDF data as Base64 string. ```javascript -// Load the PDF data from a file -const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); -// Create a new PdfDocument instance using the byte array -const loadedDocument = new PdfDocument(inputPDFByteArray); +let data: string = 'JVBERi0xLjcNJeLjz9MNCjEyNSAw...........TU3MTQNCiUlRU9GDQo='; +// Load an existing PDF document from data as Base64 string +let document: PdfDocument = new PdfDocument(data); ``` -## Opening an Encrypted PDF document +### Using Uint8Array -Open an encrypted PDF document using the `PdfDocument` class by providing the correct password. +Open an existing PDF document using the `PdfDocument` class with the specified PDF data as Uint8Array. ```javascript -// Load an existing PDF document from string data -let document: PdfDocument = new PdfDocument("Input.pdf", "password"); +let binaryData: Uint8Array = Uint8Array.from(data); +// Load an existing PDF document from data as Uint8Array +let document: PdfDocument = new PdfDocument(binaryData); ``` -## Opening an Encrypted PDF document from a byte array +## Opening an Encrypted PDF document with password -Open an encrypted PDF document from a byte array using the `PdfDocument` class by providing the correct password. +Open an encrypted PDF document using the `PdfDocument` class by providing the correct password. ```javascript -// Load the PDF data from a file -const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); -// Load an existing PDF document from string data -let document: PdfDocument = new PdfDocument(inputPDFByteArray, "password"); +// Load an existing PDF document with password +let document: PdfDocument = new PdfDocument(data, "password"); ``` -## Saving a PDF document +## Save and download a PDF document in browser environment -Save the manipulated PDF document using the `Save` method of `PdfDocument` class with the specified string data. +Save and download the PDF document using the `save` method of `PdfDocument` class with the specified file name. ```javascript -// Load an existing PDF document from string data -let document: PdfDocument = new PdfDocument("Input.pdf"); -//To-Do some manipulation -//To-Do some manipulation -// Save the PDF document -document.save('Output.pdf'); +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data); +// To-Do some manipulation +// Save and download the PDF document to the specified filename. +document.save('output.pdf'); ``` -## Saving a PDF Document from a byte array +## Saving a PDF document to byte array -Open an existing PDF document using the `PdfDocument` class with the specified byte array. +Save the modified PDF document to the specified byte array using the `save` method available in `PdfDocument` class. ```javascript -// Load the PDF data from a file -const inputPDFByteArray: Uint8Array = new Uint8Array(fs.readFileSync('Input.pdf')); -// Create a new PdfDocument instance using the byte array -const loadedDocument = new PdfDocument(inputPDFByteArray); +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data); //To-Do some manipulation -//To-Do some manipulation -// Save the document +// Save and get PDF data as byte array. let data: Uint8Array = document.save(); ``` @@ -84,12 +79,11 @@ let data: Uint8Array = document.save(); After the document manipulation and save operation are completed, you should close the instance of `PdfDocument`, in order to release all the memory consumed by PDF DOM. The following code example illustrates how to destroy a `PdfDocument` instance. ```javascript -// Load an existing PDF document from string data -let document: PdfDocument = new PdfDocument("Input.pdf"); -//To-Do some manipulation +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data); //To-Do some manipulation // Save the PDF document -document.save('Output.pdf'); +document.save('output.pdf'); // Destroy the document document.destroy(); ``` \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md index b64efff32..d0e4e5d1b 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-Annotations.md @@ -1,54 +1,45 @@ --- -title: Working with EJ2 Annotations | Syncfusion -description: This section explains how to create or modify or remove different type of interactive Annotation by using EJ2 PDF +title: Working with Annotations | Syncfusion +description: This section explains how to create, modify or remove different type of interactive Annotation by using TypeScript PDF library. platform: document-processing control: PDF documentation: UG --- -# Working with EJ2 Annotations +# Working with Annotations -EJ2 Annotations in the PDF Library enable users to add, edit, and manage interactive elements within PDF documents. These annotations help highlight content, provide comments, and enhance document review workflows without altering the original file. +Syncfusion JavaScript PDF library provides support for interactive annotations. You can add, delete and modify the annotation from the PDF documents. ## Adding annotations to a PDF document This example demonstrates how to add annotations to a PDF document using the `PdfAnnotation` class. Adding annotations allows users to include comments, highlights, shapes, and other interactive elements within a PDF, enhancing collaboration and document review. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a new section to the document - let section: PdfSection = document.addSection(); - // Add a page to the section - let page: PdfPage = section.addPage(); - // Create a new popup annotation - const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -

      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfPopupAnnotation, PdfPopupIcon, PdfAnnotationBorder} from '@syncfusion/ej2-pdf'; + +// Creates a new PDF document +let document: PdfDocument = new PdfDocument(); +// Adds a new page to the PDF +let page: PdfPage = document.addPage(); +// Creates a new popup annotation +let popup = new PdfPopupAnnotation( + 'Test popup annotation', + { x: 10, y: 40, width: 30, height: 30 }, + { + author: 'Syncfusion', + subject: 'General', + color: { r: 255, g: 255, b: 0 }, + icon: PdfPopupIcon.newParagraph, + open: true + }); +popup.border = new PdfAnnotationBorder({width: 4, hRadius: 20, vRadius: 30}); +// Adds annotation to the page +page.annotations.add(popup); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -56,130 +47,68 @@ function createPdf() { The following code snippet explains how to add a popup annotation in an existing PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new popup annotation - const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', 10, 40, 30, 30); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfPopupAnnotation, PdfPopupIcon, PdfAnnotationBorder} from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Creates a new popup annotation +let popup = new PdfPopupAnnotation( + 'Test popup annotation', + { x: 10, y: 40, width: 30, height: 30 }, + { + author: 'Syncfusion', + subject: 'General', + color: { r: 255, g: 255, b: 0 }, + icon: PdfPopupIcon.newParagraph, + open: true + }); +popup.border = new PdfAnnotationBorder({width: 4, hRadius: 20, vRadius: 30}); +// Adds annotation to the page +page.annotations.add(popup); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} ## Supported annotation types -### 3D Annotation - -3D Annotations are used to represent 3D artworks in a PDF document. EJ2 PDF provides support to embed 3D files (u3d) in PDF. - -This example demonstrates how to access a 3D annotation from a PDF page using the `Pdf3DAnnotation` class. A 3D annotation allows embedding and interacting with 3D content within a PDF document. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Access the annotation at index 0 - let annotation: Pdf3DAnnotation = page.annotations.at(0) as Pdf3DAnnotation; - // Added bounds - annotation.bounds = {x: 10, y: 10, width: 150, height: 5}; - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - -{% endhighlight %} -{% endtabs %} - ### File Link Annotation This example demonstrates how to add a file link annotation to a PDF page using the `PdfFileLinkAnnotation` class. A file link annotation allows linking to an external file from within a PDF document, enabling users to access related resources directly. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a new section to the document - let section: PdfSection = document.addSection(); - // Add a page to the section - let page: PdfPage = section.addPage(); - // Create a new file link annotation - let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfFileLinkAnnotation} from '@syncfusion/ej2-pdf'; + +// Creates a new PDF document +let document: PdfDocument = new PdfDocument(); +// Adds a new page to the PDF +let page: PdfPage = document.addPage(); +// Creates a file link annotation +const fileLink = new PdfFileLinkAnnotation( + { x: 100, y: 150, width: 120, height: 18 }, + 'logo.png', + { + text: 'Open attachment', + author: 'Syncfusion', + subject: 'File Link Annotation', + color: { r: 0, g: 0, b: 255 }, + action: "app.alert('Launching file');" + }); +// Adds annotation to the page +page.annotations.add(fileLink); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -187,88 +116,31 @@ function createPdf() { The following code snippet explains how to add a file link annotation in an existing PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new file link annotation - let annotation: PdfFileLinkAnnotation = new PdfFileLinkAnnotation(10, 40, 30, 30, "image.png"); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - -{% endhighlight %} -{% endtabs %} - -### Rich Media Annotation - -A rich media annotation is used to play the media clip in a PDF Document. - -The following rich media types are supported: - -1. Video -2. Sound - -This example demonstrates how to access a rich media annotation to a PDF page using the `PdfRichMediaAnnotation` class. - -{% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Access the annotation at index 0 - let annotation: PdfRichMediaAnnotation = page.annotations.at(0) as PdfRichMediaAnnotation; - // Added bounds - annotation.bounds = {x: 10, y: 10, width: 150, height: 5}; - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfFileLinkAnnotation} from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Creates a file link annotation +const fileLink = new PdfFileLinkAnnotation( + { x: 100, y: 150, width: 120, height: 18 }, + 'logo.png', + { + text: 'Open attachment', + author: 'Syncfusion', + subject: 'File Link Annotation', + color: { r: 0, g: 0, b: 255 }, + action: "app.alert('Launching file');" + }); +// Adds annotation to the page +page.annotations.add(fileLink); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -278,41 +150,35 @@ function createPdf() { This example demonstrates how to add a free text annotation to a PDF page using the `PdfFreeTextAnnotation` class. A free text annotation allows placing text directly on a PDF page, enabling users to add comments or notes that remain visible without requiring interaction. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a new section to the document - let section: PdfSection = document.addSection(); - // Add a page to the section - let page: PdfPage = section.addPage(); - // Create a new free text annotation - const annotation: PdfFreeTextAnnotation = new PdfFreeTextAnnotation(50, 100, 100, 50); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfFreeTextAnnotation, PdfTextAlignment, PdfAnnotationBorder, PdfBorderStyle, PdfFreeTextAnnotation, PdfLineEndingStyle, PdfStandardFont, PdfFontFamily, PdfFontStyle} from '@syncfusion/ej2-pdf'; + +// Creates a new PDF document +let document: PdfDocument = new PdfDocument(); +// Adds a new page to the PDF +let page: PdfPage = document.addPage(); +// Create new free text annotation +const freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, + { + text: 'Free Text with Callout', + annotationIntent: PdfAnnotationIntent.freeTextCallout, + calloutLines: [{ x: 200, y: 320 }, { x: 260, y: 300 }, { x: 260, y: 300 }], + lineEndingStyle: PdfLineEndingStyle.openArrow, + font: new PdfStandardFont(PdfFontFamily.helvetica, 9, PdfFontStyle.italic), + textMarkUpColor: { r: 40, g: 40, b: 40 }, + innerColor: { r: 240, g: 248, b: 255 }, + borderColor: { r: 0, g: 0, b: 0 }, + textAlignment: PdfTextAlignment.left, + opacity: 1, + border: new PdfAnnotationBorder({ width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid }) + }); +// Adds annotation to the page +page.annotations.add(freeText); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -320,39 +186,35 @@ function createPdf() { The following code snippet explains how to add a free text annotation in an existing PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new free text annotation - const annotation: PdfFreeTextAnnotation = new PdfFreeTextAnnotation(50, 100, 100, 50); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfFreeTextAnnotation, PdfTextAlignment, PdfAnnotationBorder, PdfBorderStyle, PdfFreeTextAnnotation, PdfLineEndingStyle, PdfStandardFont, PdfFontFamily, PdfFontStyle} from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Create new free text annotation +const freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, + { + text: 'Free Text with Callout', + annotationIntent: PdfAnnotationIntent.freeTextCallout, + calloutLines: [{ x: 200, y: 320 }, { x: 260, y: 300 }, { x: 260, y: 300 }], + lineEndingStyle: PdfLineEndingStyle.openArrow, + font: new PdfStandardFont(PdfFontFamily.helvetica, 9, PdfFontStyle.italic), + textMarkUpColor: { r: 40, g: 40, b: 40 }, + innerColor: { r: 240, g: 248, b: 255 }, + borderColor: { r: 0, g: 0, b: 0 }, + textAlignment: PdfTextAlignment.left, + opacity: 1, + border: new PdfAnnotationBorder({ width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid }) + }); +// Adds annotation to the page +page.annotations.add(freeText); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -362,41 +224,34 @@ function createPdf() { This example demonstrates how to add a line annotation to a PDF page using the `PdfLineAnnotation` class. A line annotation allows drawing straight lines between two points on a PDF page, often used to highlight connections or indicate measurements. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a new section to the document - let section: PdfSection = document.addSection(); - // Add a page to the section - let page: PdfPage = section.addPage(); - // Create a new line annotation with line points - const annotation: PdfLineAnnotation = new PdfLineAnnotation([10, 50, 250, 50]); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfLineAnnotation, PdfAnnotationLineEndingStyle, PdfLineEndingStyle, PdfAnnotationCaption, PdfLineCaptionType} from '@syncfusion/ej2-pdf'; + +// Creates a new PDF document +let document: PdfDocument = new PdfDocument(); +// Adds a new page to the PDF +let page: PdfPage = document.addPage(); +// Creates a new line annotation. +let lineAnnotation: PdfLineAnnotation = new PdfLineAnnotation({ x: 80, y: 420 }, { x: 150, y: 420 }, { + text: 'Line Annotation', + author: 'Syncfusion', + color: { r: 255, g: 0, b: 0 }, + innerColor: { r: 255, g: 255, b: 0 }, + lineEndingStyle: new PdfAnnotationLineEndingStyle({ begin: PdfLineEndingStyle.circle, end: PdfLineEndingStyle.diamond }), + opacity: 0.5 +}); +// Assigns the leader line +lineAnnotation.leaderExt = 0; +lineAnnotation.leaderLine = 0; +// Assigns the line caption type +lineAnnotation.caption = new PdfAnnotationCaption({ cap: true, type: PdfLineCaptionType.inline }); +// Adds annotation to the page +page.annotations.add(lineAnnotation); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -404,39 +259,34 @@ function createPdf() { The following code snippet explains how to add a line annotation in an existing PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new line annotation with line points - const annotation: PdfLineAnnotation = new PdfLineAnnotation([10, 50, 250, 50]); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfLineAnnotation, PdfAnnotationLineEndingStyle, PdfLineEndingStyle, PdfAnnotationCaption, PdfLineCaptionType} from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Creates a new line annotation. +let lineAnnotation: PdfLineAnnotation = new PdfLineAnnotation({ x: 80, y: 420 }, { x: 150, y: 420 }, { + text: 'Line Annotation', + author: 'Syncfusion', + color: { r: 255, g: 0, b: 0 }, + innerColor: { r: 255, g: 255, b: 0 }, + lineEndingStyle: new PdfAnnotationLineEndingStyle({ begin: PdfLineEndingStyle.circle, end: PdfLineEndingStyle.diamond }), + opacity: 0.5 +}); +// Assigns the leader line +lineAnnotation.leaderExt = 0; +lineAnnotation.leaderLine = 0; +// Assigns the line caption type +lineAnnotation.caption = new PdfAnnotationCaption({ cap: true, type: PdfLineCaptionType.inline }); +// Adds annotation to the page +page.annotations.add(lineAnnotation); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -446,81 +296,53 @@ function createPdf() { This example demonstrates how to add a rubber stamp annotation to a PDF page using the `PdfRubberStampAnnotation` class. A rubber stamp annotation allows applying predefined or custom stamp to visually indicate the status or purpose of a document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a new section to the document - let section: PdfSection = document.addSection(); - // Add a page to the section - let page: PdfPage = section.addPage(); - // Create a new rubber stamp annotation - const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation (50, 100, 100, 50); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfRubberStampAnnotation, PdfRubberStampAnnotationIcon} from '@syncfusion/ej2-pdf'; + +// Creates a new PDF document +let document: PdfDocument = new PdfDocument(); +// Adds a new page to the PDF +let page: PdfPage = document.addPage(); +// Creates a new rubber stamp annotation +let stamp: PdfRubberStampAnnotation = new PdfRubberStampAnnotation({ x: 40, y: 60, width: 80, height: 20 }, + { + icon: PdfRubberStampAnnotationIcon.draft, + text: 'Text Properties Rubber Stamp Annotation' + }); +// Adds annotation to the page +page.annotations.add(stamp); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} -The following code snippet explains how to add a rubber stamp annotation in an existing PDF document. +The following code snippet explains how to add a free text annotation in an existing PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new rubber stamp annotation - const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation (50, 100, 100, 50); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      +{% highlight c# tabtitle="TypeScript" %} + +import {PdfDocument, PdfPage, PdfRubberStampAnnotation, PdfRubberStampAnnotationIcon} from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Creates a new rubber stamp annotation +let stamp: PdfRubberStampAnnotation = new PdfRubberStampAnnotation({ x: 40, y: 60, width: 80, height: 20 }, + { + icon: PdfRubberStampAnnotationIcon.draft, + text: 'Text Properties Rubber Stamp Annotation' + }); +// Adds annotation to the page +page.annotations.add(stamp); +// Saves and download the PDF document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} From dc577a9e74cdf54f90497d6c9dcf0238abcc842a Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Fri, 5 Dec 2025 14:25:39 +0530 Subject: [PATCH 06/13] 994201-dev: Updated new API and code structure. --- .../Create-PDF-document-asp-net-core.md | 4 +- .../javascript/Create-PDF-document-react.md | 12 +- .../javascript/Create-PDF-document-vue.md | 6 +- .../javascript/Working-with-PDF-Pages.md | 394 +++++------------- .../javascript/Working-with-PDF-document.md | 223 ++++------ 5 files changed, 194 insertions(+), 445 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md index e7cc37e23..917c21393 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md @@ -1,6 +1,6 @@ --- layout: post -title: Create or Generate PDF file in ASP.NET Core | Syncfusion +title: Create or Generate PDF in ASP.NET Core | Syncfusion description: Learn how to create or generate a PDF file in ASP.NET Core applications with easy steps using Syncfusion JavaScript PDF library without depending on Adobe. platform: document-processing control: PDF @@ -8,7 +8,7 @@ documentation: ug keywords: .net core create pdf, edit pdf, merge, pdf form, fill form, digital sign, table, javascript, dotnet core pdf, asp generate pdf, aspx generate pdf --- -# Create or Generate PDF file in ASP.NET Core +# Create or Generate PDF in ASP.NET Core The Syncfusion® JavaScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, forms, and secure PDF files. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md index 4a4f8b3a2..ecd918b02 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-react.md @@ -10,9 +10,9 @@ keywords: javascript, pdf, script, react # Create or Generate PDF file in React -The Syncfusion® Javascript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. +The Syncfusion® JavaScript PDF library is used to create, read, and edit PDF documents. This library also offers functionality to merge, split, stamp, fill forms, and secure PDF files. -This guide explains how to integrate the Javascript PDF library into an React application. +This guide explains how to integrate the JavaScript PDF library into an React application. ## Add script reference @@ -21,12 +21,12 @@ This guide explains how to integrate the Javascript PDF library into an React ap ``` ... - + ``` -**Create a PDF document** : Add the script in `App.jsx` by creating a button and attaching a click event that uses the Javascript PDF API to generate a PDF document. +**Create a PDF document** : Add the script in `App.jsx` by creating a button and attaching a click event that uses the JavaScript PDF API to generate a PDF document. {% tabs %} {% highlight c# tabtitle="~/App.jsx" %} @@ -36,13 +36,13 @@ import React from 'react'; export default function App() { const createPdf = () => { // Create a new PDF document - var pdf = new window.ej.pdf.PdfDocument(); + var pdf = new ej.pdf.PdfDocument(); // Add a new page var page = pdf.addPage(); // Get graphics from the page let graphics = page.graphics; // Set font - var font = pdf.embedFont(window.ej.pdf.PdfFontFamily.helvetica, 36,window.ej.pdf.PdfFontStyle.regular); + var font = pdf.embedFont(ej.pdf.PdfFontFamily.helvetica, 36, ej.pdf.PdfFontStyle.regular); // Create a new black brush var brush = new window.ej.pdf.PdfBrush({r: 0, g: 0, b: 0}); // Draw text diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md index e97aee2c7..abd4f5b62 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-vue.md @@ -64,15 +64,15 @@ export default { createPdf() { // Create a new PDF document - const pdf = new window.ej.pdf.PdfDocument(); + const pdf = new ej.pdf.PdfDocument(); // Add a new page const page = pdf.addPage() as PdfPage; // Get graphics from the page const graphics = page.graphics; // Set font (Syncfusion EJ2 API) - const font = new PdfStandardFont(window.ej.pdf.PdfFontFamily.helvetica, 36, window.ej.pdf.PdfFontStyle.regular); + const font = new PdfStandardFont(ej.pdf.PdfFontFamily.helvetica, 36, ej.pdf.PdfFontStyle.regular); // Create a new black brush (RGB array) - const brush = new window.ej.pdf.PdfBrush({r: 0, g: 0, b: 0}); + const brush = new ej.pdf.PdfBrush({r: 0, g: 0, b: 0}); // Draw text inside a rectangle [x, y, width, height] graphics.drawString('Hello World!!!', font, {x: 20, y: 20, width: graphics.clientSize.width - 20, height: 60}, brush); // Save and download PDF diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md index fedd1db27..4f7719250 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md @@ -1,47 +1,35 @@ --- -title: Working with EJ2 PDF pages | Syncfusion -description: This section explains how to add, rearrange, remove pages and detect empty pages from the EJ2 PDF document +title: Working with PDF pages | Syncfusion +description: This section explains how to add, rearrange, remove pages and detect empty pages from the PDF document platform: document-processing control: PDF documentation: UG --- -# Working with EJ2 PDF Pages +# Working with PDF Pages ## Adding a new page to the document -The following code sample explains you on how to add a `PdfPage` in a PDF document. When multiple pages are added, the new page is always added to the end of the document. +The following code sample demonstrates how to add a `PdfPage` to a PDF document. When multiple pages are added, each new page is appended to the end of the document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} +{% highlight c# tabtitle="TypeScript" %} -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { // Create a PDF document - let document: PdfDocument = new PdfDocument('input.pdf', 'password'); - // Add a new PDF page + let document: PdfDocument = new PdfDocument(); + // Add a page let page: PdfPage = document.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Draw text + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); // Save the document - document.save('output.pdf'); - // Destroy the document + document.save('Output.pdf'); + // Close the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -51,48 +39,30 @@ function createPdf() { The `PdfPageSettings` class is used to define properties such as margins, orientation, rotation, and page size. In this example, margins are set using the `PdfMargins` class to ensure consistent spacing around the page content. These settings can be applied when creating sections or pages in the PDF for precise layout control. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); +{% highlight c# tabtitle="TypeScript" %} -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; -// Function to create PDF -function createPdf() { // Create a new PDF document let document: PdfDocument = new PdfDocument(); - // Create a new PDF page settings instance - let pageSettings: PdfPageSettings = new PdfPageSettings(); - - // Sets the margins - pageSettings.margins = new PdfMargins(40); - + // Define page settings + let settings: PdfPageSettings = new PdfPageSettings(); + // Add margin + settings.margins = new PdfMargins(40); + // Add a section to the document with the specified settings + let section: PdfSection = document.addSection(settings); // Add a page - const page = document.addPage(pageSettings); + let page: PdfPage = section.addPage(); // Get graphics from the page let graphics = page.graphics; // Set font - font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); // Draw text - graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); // Save the document document.save('Output.pdf'); // Close the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -102,67 +72,46 @@ function createPdf() { This example demonstrates how to add sections with different page settings in a PDF document. It shows how to configure rotation, orientation, margins, and page size using `PdfPageSettings`. The `PdfSection` class is used to apply unique page customizations within a single PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - - // Define first page settings - let settings1: PdfPageSettings = new PdfPageSettings(); - settings1.rotation = PdfRotationAngle.angle90; - settings1.orientation = PdfPageOrientation.landscape; - settings1.margins = new PdfMargins(40); - settings1.size = [595, 842]; - // Add a section to the document with the specified settings - let section1: PdfSection = document.addSection(settings1); - // Add a page to the section - let page1: PdfPage = section1.addPage(); - // Get graphics object to draw on the page - let graphics1 = page1.graphics; - // Set font for text - let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); - // Draw text on the page with specified font, position, and styles - graphics1.drawString('Rotated by 90 degree', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); - - // Define Second page settings - let settings2: PdfPageSettings = new PdfPageSettings(); - settings2.rotation = PdfRotationAngle.angle180; - settings2.orientation = PdfPageOrientation.landscape; - settings2.margins = new PdfMargins(40); - settings2.size = [595, 842]; - // Add a section to the document with the specified settings - let section2: PdfSection = document.addSection(settings2); - // Add a page to the section - let page2: PdfPage = section2.addPage(); - // Get graphics object to draw on the page - let graphics2 = page2.graphics; - // Draw text on the page with specified font, position, and styles - graphics2.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); - - // Save the PDF document - let data = document.save('Output.pdf'); - // Close and dispose the document - document.destroy(); -} +{% highlight c# tabtitle="TypeScript" %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; -
      - -
      + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Create a new PDF page settings instance + let pageSetting: PdfPageSettings = new PdfPageSettings(); + // Sets the margins + pageSetting.margins = new PdfMargins(40); + // Sets the page size + pageSetting.size ={width: 595, height: 842};; + // Sets the page orientation + pageSetting.orientation = PdfPageOrientation.landscape; + // Add a page + let page: PdfPage = document.addPage(pageSetting); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Draw text + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); + // Create a new PDF page settings instance + let pageSetting1: PdfPageSettings = new PdfPageSettings(); + // Sets the margins + pageSetting1.margins = new PdfMargins(40); + // Sets the page size + pageSetting1.size ={width: 595, height: 842};; + // Sets the page orientation + pageSetting1.orientation = PdfPageOrientation.landscape; + // Add a page + let page1: PdfPage = document.addPage(pageSetting1); + // Get graphics from the page + let graphics1 = page1.graphics; + // Draw text + graphics1.drawString('Hello World', font, {x: 40, y: 60, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); + // Save the PDF document + document.save('Output.pdf'); + // Close and dispose the document + document.destroy(); {% endhighlight %} {% endtabs %} @@ -172,34 +121,16 @@ function createPdf() { This example demonstrates how to retrieve the total number of pages in a PDF document using the `pageCount` property of the `PdfDocument` class. The page count returns an integer value representing the number of pages currently in the document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} +{% highlight c# tabtitle="TypeScript" %} -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); + import { PdfDocument } from '@syncfusion/ej2-pdf'; -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); + let document: PdfDocument = new PdfDocument(data, password); // Gets the page count let count: number = document.pageCount; // Destroy the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -209,41 +140,21 @@ function createPdf() { This example demonstrates how to import pages from an existing PDF document into a new PDF document using the `importPageRange` method of the `PdfDocument` class. This method allows you to specify a start and end index to copy a range of pages from the source document into the target document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); +{% highlight c# tabtitle="TypeScript" %} -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; + import { PdfDocument } from '@syncfusion/ej2-pdf'; -// Function to create PDF -function createPdf() { // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); + let document: PdfDocument = new PdfDocument(data, password); // Define start and end page indices const startIndex = 0; const endIndex = document.pageCount - 1; - // Import all pages from the loaded document into the new document document.importPageRange(document, startIndex, endIndex); - // Save the new document document.save('Output.pdf'); // Close the loaded document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -253,36 +164,18 @@ function createPdf() { This example demonstrates how to rearrange the pages in an existing PDF document using the `reorderPages` method of the `PdfDocument` class. The method accepts an array of page indices that defines the new order of pages within the document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} +{% highlight c# tabtitle="TypeScript" %} -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); + import { PdfDocument } from '@syncfusion/ej2-pdf'; -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); + let document: PdfDocument = new PdfDocument(data, password); // Reorders the pages in the PDF document document.reorderPages([3, 2, 1]); // Save the document document.save('output.pdf'); // Destroy the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -292,36 +185,18 @@ function createPdf() { This example demonstrates how to remove a page from a PDF document using the `removePage` method of the `PdfDocument` class. The method takes the zero-based index of the page to be removed, effectively deleting that page from the document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); +{% highlight c# tabtitle="TypeScript" %} -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; + import { PdfDocument } from '@syncfusion/ej2-pdf'; -// Function to create PDF -function createPdf() { // Load an existing PDF document - let document: PdfDocument = new PdfDocument("Input.pdf"); + let document: PdfDocument = new PdfDocument(data, password); // Removes the first page document.removePage(0); // Save the document document.save('output.pdf'); // Destroy the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -331,49 +206,28 @@ function createPdf() { This example demonstrates how to rotate a PDF page using the `rotation` property of the `PdfPageSettings` class. The property accepts a value from the `PdfRotationAngle` enumeration, such as angle180, to specify the rotation angle applied to the page. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - //Rotate a section/page - let settings: PdfPageSettings = new PdfPageSettings(); - settings.rotation = PdfRotationAngle.angle180; - - // Add a section to the document with the specified settings - let section: PdfSection = document.addSection(settings); - - // Add a page to the section - let page: PdfPage = section.addPage(); - // Get graphics object to draw on the page - let graphics = page.graphics; - // Set font for text - let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); - // Draw text on the page with specified font, position, and styles - graphics.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); - // Save the PDF document - let data = document.save('Output.pdf'); - // Close and dispose the document - document.destroy(); -} +{% highlight c# tabtitle="TypeScript" %} -{% endhighlight %} -{% highlight html tabtitle="index.html" %} + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; -
      - -
      + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Create a new PDF page settings instance + let pageSetting : PdfPageSettings = new PdfPageSettings(); + // Sets the page rotation + pageSetting.rotation = PdfRotationAngle.angle180; + // Add a page + let page: PdfPage = document.addPage(pageSetting); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Draw text + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); + // Save the PDF document + let data = document.save('Output.pdf'); + // Close and dispose the document + document.destroy(); {% endhighlight %} {% endtabs %} @@ -383,22 +237,12 @@ function createPdf() { This example demonstrates how to rotate an existing PDF page using the `rotation` property of the `PdfPage` class. The property accepts a value from the `PdfRotationAngle` enumeration, such as angle180, to specify the rotation angle applied to the selected page. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); +{% highlight c# tabtitle="TypeScript" %} -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; -// Function to create PDF -function createPdf() { // Load an existing PDF document - let document: PdfDocument = new PdfDocument('Input.pdf'); + let document: PdfDocument = new PdfDocument(data, password); // Access first page let page: PdfPage = document.getPage(0); //Set the rotation for loaded page @@ -407,14 +251,6 @@ function createPdf() { document.save('output.pdf'); // Destroy the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      {% endhighlight %} {% endtabs %} @@ -424,36 +260,18 @@ function createPdf() { This example demonstrates how to split a PDF file into individual pages by importing a specific page from the source document using the `importPage` method of the `PdfDocument` class. The method takes the zero-based index of the page to be copied and adds it as a new page in the target document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} +{% highlight c# tabtitle="TypeScript" %} -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { // Load an existing PDF document - let sourceDocument: PdfDocument = new PdfDocument('Input.pdf'); + let document: PdfDocument = new PdfDocument(data, password); // Copy the second page and add it as third page - sourceDocument.importPage(1); + document.importPage(1); // Save the output PDF - sourceDocument.save('Output.pdf'); + document.save('Output.pdf'); // Destroy the documents - sourceDocument.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      + document.destroy(); {% endhighlight %} {% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md index f84ebe37b..daaf8e2f4 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md @@ -1,62 +1,44 @@ --- -title: Working with EJ2 PDF Document | Syncfusion -description: This section explains how to set document Settings and properties to the EJ2 PDF document using Essential PDF +title: Working with PDF Document | Syncfusion +description: This section explains how to set document Settings and properties to the PDF document using Essential PDF platform: document-processing control: PDF documentation: UG --- -# Working with EJ2 PDF Document +# Working with PDF Document ## Adding the document settings This example shows how to configure custom page settings before adding a page to a PDF document. It creates a `PdfPageSettings` instance, applies margins, page size and sets the orientation. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { +{% highlight c# tabtitle="TypeScript" %} + + import { PdfDocument, PdfPage, PdfPageSettings, PdfMargins, PdfPage, PdfPageOrientation, PdfStandardFont, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; + // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Create a new PDF page settings instance - let pageSettings: PdfPageSettings = new PdfPageSettings(); - // Sets the margins - pageSettings.margins = new PdfMargins(40); - // Sets the page size - pageSettings.size = [595, 842]; - // Sets the page orientation - pageSettings.orientation = PdfPageOrientation.landscape; + let pageSettings: PdfPageSettings = new PdfPageSettings(); + // Sets the margins + pageSettings.margins = new PdfMargins(40); + // Sets the page size + pageSettings.size ={width: 595, height: 842};; + // Sets the page orientation + pageSettings.orientation = PdfPageOrientation.landscape; // Add a page - const page = document.addPage(pageSettings); + let page: PdfPage = document.addPage(pageSettings); // Get graphics from the page let graphics = page.graphics; // Set font - font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); // Draw text - graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); // Save the document document.save('Output.pdf'); // Close the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - + {% endhighlight %} {% endtabs %} @@ -65,53 +47,33 @@ function createPdf() { This example demonstrates how to create a section in a PDF document with custom page settings. It shows how to configure rotation, orientation, margins, and page size using `PdfPageSettings`. The `PdfSection` class is used to apply different page customizations within a single PDF document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Define page settings - let settings: PdfPageSettings = new PdfPageSettings(); - settings.rotation = PdfRotationAngle.angle180; - settings.orientation = PdfPageOrientation.landscape; - settings.margins = new PdfMargins(40); - settings.size = [595, 842]; - - // Add a section to the document with the specified settings - let section: PdfSection = document.addSection(settings); - - // Add a page to the section - let page: PdfPage = section.addPage(); - // Get graphics object to draw on the page - let graphics = page.graphics; - // Set font for text - let font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 20); - // Draw text on the page with specified font, position, and styles - graphics.drawString('Hello World!!!', font, [10, 10, 200, 50], new PdfPen([255, 0, 255], 1), new PdfBrush([0, 0, 0])); - // Save the PDF document - let data = document.save('Output.pdf'); - // Close and dispose the document - document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - +{% highlight c# tabtitle="TypeScript" %} + + import { PdfDocument, PdfPage, PdfPageSettings, PdfMargins, PdfPageOrientation, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; + + // Create a new PDF document + let document: PdfDocument = new PdfDocument(); + // Define page settings + let settings: PdfPageSettings = new PdfPageSettings(); + settings.rotation = PdfRotationAngle.angle180; + settings.orientation = PdfPageOrientation.landscape; + settings.margins = new PdfMargins(40); + settings.size = {width: 595, height: 842};; + // Add a section to the document with the specified settings + let section: PdfSection = document.addSection(settings); + // Add a page + let page: PdfPage = section.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Draw text + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); + {% endhighlight %} {% endtabs %} @@ -120,25 +82,14 @@ function createPdf() { This example demonstrates how to create a PDF document, set its metadata properties such as title, author, subject, keywords, creator, producer, language, and dates, and then retrieve these properties using the `PdfDocumentInformation` class. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a PDF document - let document: PdfDocument = new PdfDocument(); +{% highlight c# tabtitle="TypeScript" %} + + import { PdfDocument, PdfPage, PdfDocumentInformation, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; + + // Create a PDF document + let document: PdfDocument = new PdfDocument(); // Access the document information (metadata) let documentProperties: PdfDocumentInformation = document.getDocumentInformation(); - // Set document properties documentProperties.title = "Sample PDF Document"; // Title of the PDF documentProperties.author = "John Doe"; // Author name @@ -149,27 +100,19 @@ function createPdf() { documentProperties.language = "en-US"; // Language of the document documentProperties.creationDate = new Date(); // Creation date documentProperties.modificationDate = new Date(); // Last modified date - // Add a page - const page = document.addPage(); + // Add a page + let page: PdfPage = document.addPage(); // Get graphics from the page let graphics = page.graphics; // Set font - font: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); // Draw text - graphics.drawString('Hello World!!!', font, [70, 10, 200, 50], new PdfPen([255, 0, 0], 1), new PdfBrush([0, 0, 255])); + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); // Save the document document.save('Output.pdf'); // Close the document document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - + {% endhighlight %} {% endtabs %} @@ -178,38 +121,26 @@ function createPdf() { The `isIncrementalUpdate` property allows you to check if the PDF document supports incremental updates, which can improve performance during modifications by appending changes rather than rewriting the entire document. {% tabs %} -{% highlight ts tabtitle="index.ts" %} - -// Create and render button -let button: Button = new Button(); -button.appendTo('#normalbtn'); - -// Handle click event -button.element.onclick = async () => { - console.log('Start PDF Creation'); - createPdf(); -}; - -// Function to create PDF -function createPdf() { - // Create a PDF document - let document: PdfDocument = new PdfDocument(); - - // Disable incremental update to rewrite the entire file - document.fileStructure.isIncrementalUpdate = false; - - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); -} - -{% endhighlight %} -{% highlight html tabtitle="index.html" %} - -
      - -
      - +{% highlight c# tabtitle="TypeScript" %} + + import { PdfDocument, PdfPage, PdfStandardFont, PdfFontFamily, PdfFontStyle, PdfBrush } from '@syncfusion/ej2-pdf'; + + // Create a PDF document + let document: PdfDocument = new PdfDocument(); + // Disable incremental update to rewrite the entire file + document.fileStructure.isIncrementalUpdate = false; + // Add a page + let page: PdfPage = document.addPage(); + // Get graphics from the page + let graphics = page.graphics; + // Set font + let font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular); + // Draw text + graphics.drawString('Hello World', font, {x: 10, y: 20, width: 100, height: 200}, new PdfBrush({r: 0, g: 0, b: 255})); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); + {% endhighlight %} {% endtabs %} From 969f8a96e222a0d838dcf7477324b00d5fe2cf63 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Fri, 5 Dec 2025 16:44:57 +0530 Subject: [PATCH 07/13] 994201-dev: Added proper code example. --- .../javascript/Create-PDF-document-angular.md | 18 +- .../Create-PDF-document-asp-net-core.md | 10 +- .../Create-PDF-document-asp-net-mvc.md | 10 +- .../Create-PDF-document-javascript.md | 13 +- .../javascript/Create-PDF-document-react.md | 10 +- .../Create-PDF-document-typescript.md | 15 +- .../javascript/Create-PDF-document-vue.md | 32 +- .../javascript/Working-with-PDF-Pages.md | 10 +- .../javascript/Working-with-PDF-document.md | 10 +- .../javascript/Working-with-Shapes.md | 566 ++++-------------- .../javascript/Working-with-Text.md | 295 ++------- 11 files changed, 234 insertions(+), 755 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md index fce562c10..f61270685 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-angular.md @@ -70,21 +70,21 @@ import { PdfDocument, PdfPage, PdfStandardFont, PdfPen, PdfBrush } from '@syncfu document.getElementById('normalButton').onclick = (): void => { // Create a new PDF document - var pdf = new PdfDocument(); + const document = new PdfDocument(); // Add a new page - var page = pdf.addPage(); + const page: PdfPage = document.addPage(); // Get graphics from the page - let graphics = page.graphics; + const graphics: PdfGraphics = page.graphics; // Set font - var font = pdf.embedFont(ej.pdf.PdfFontFamily.helvetica, 36, pdf.PdfFontStyle.regular); + const font: PdfStandardFont = document.embedFont(PdfFontFamily.helvetica, 36, PdfFontStyle.regular); // Create a new black brush - var brush = new pdf.PdfBrush({r: 0, g: 0, b: 0}); + const brush = new PdfBrush({r: 0, g: 0, b: 0}); // Draw text graphics.drawString('Hello World!!!', font, {x: 20, y: 20, width: graphics.clientSize.width - 20, height: 60}, brush); // Save and download PDF - pdf.save('Output.pdf'); + document.save('Output.pdf'); // Destroy the PDF document instance - pdf.destroy(); + document.destroy(); }); }; @@ -101,6 +101,4 @@ ng serve --open By executing the program, you will get the PDF document as follows. -![Output PDF document](Getting_started_images/Output.png) - - +![Output PDF document](Getting_started_images/Output.png) \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md index 917c21393..34da2975e 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Create-PDF-document-asp-net-core.md @@ -53,15 +53,15 @@ This guide explains how to integrate the JavaScript PDF library into an ASP.NET + + +{% endhighlight %} +{% endtabs %} + +* Add a simple button to `app.component.html` and attach a click handler that uses the TypeScript PDF API to create a new PDF document. + +{% tabs %} +{% highlight ts tabtitle="app.component.html" %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md similarity index 97% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md rename to Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md index 6433a40a2..b0eca9b80 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-DigitalSignature.md +++ b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md @@ -1,11 +1,13 @@ --- -title: Working with Digital Signature | Syncfusion +title: Digital Signature | Syncfusion description: This section explains how to create a digital signature in the PDF document by using TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Digital Signature +# Digital Signature + +Essential® PDF provides support to create, validate, and manage digital signatures in PDF documents, ensuring authenticity, integrity, and security. ## Adding a digital signature @@ -14,7 +16,7 @@ This example demonstrates how to add a digital signature to a PDF document using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; // Load the document let document: PdfDocument = new PdfDocument(data, password); diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md similarity index 99% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md rename to Document-Processing/PDF/PDF-Library/javascript/FormFields.md index c20b9fad8..7e8fb4ce1 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-forms.md +++ b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md @@ -1,11 +1,11 @@ --- -title: Working with Forms | Syncfusion -description: This section explains how to create, fill, modify, read only and flatten form fields in the PDF document +title: Form Fields | Syncfusion +description: This section explains how to create a digital signature in the PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with PDF Forms +# Form Fields An interactive form, sometimes referred to as an AcroForm is a collection of fields for gathering information. A PDF document can contain any number of fields appearing on any combination of pages, all of that make a single, globally interactive form spanning the entire document. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md similarity index 96% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md rename to Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md index 62dfd4d70..8f2ffd90d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-HyperLinks.md +++ b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md @@ -1,13 +1,13 @@ --- -title: Working with Hyperlinks | Syncfusion -description: This section explains how to add hyperlink in a new and existing PDF document using Syncfusion PDF library +title: Hyperlinks | Syncfusion +description: This section explains how to add a hyperlink in a new or existing PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Hyperlinks in PDF +# Hyperlinks -In PDF, hyperlinks can be added to allow the users to navigate to another part of PDF file, web page or any other external content. Essential® PDF provides support for all these types of hyperlink. +In PDF, hyperlinks can be added to allow the users to navigate to another part of PDF file, web page or any other external content. ## Working with Web navigation diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md b/Document-Processing/PDF/PDF-Library/javascript/Images.md similarity index 96% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md rename to Document-Processing/PDF/PDF-Library/javascript/Images.md index 676509829..bbb8ca126 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Images.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Images.md @@ -1,13 +1,12 @@ --- -title: Working with Images | Syncfusion -description: This section explains how to add and replace images in the PDF document using Essential PDF. It supports both raster and vector images. +title: Images | Syncfusion +description: This section explains how to add and replace images in a PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG -domainurl: ##DomainURL## --- -# Working with images using various options +# Images Essential® PDF supports both raster and vector images. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md b/Document-Processing/PDF/PDF-Library/javascript/Layers.md similarity index 96% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md rename to Document-Processing/PDF/PDF-Library/javascript/Layers.md index 1a0082ac6..183a8e420 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Layers.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Layers.md @@ -1,12 +1,12 @@ --- -title: Working with Layers | Syncfusion -description: This section explains adding the layer in the PDF document and the layers refers to section of Content of PDF document +title: Layers | Syncfusion +description: This section explains how to add a layer in a PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Layers +# Layers Layers, also known as Option Content refers to sections of content in a PDF document that can be selectively viewed or hidden by document authors or consumers. This capability is useful in items such as CAD drawings, layered artwork, maps, and multi-language documents. @@ -146,7 +146,7 @@ This example demonstrates how to lock or unlock layers in a PDF document using t // Create a new PDF document let document: PdfDocument = new PdfDocument(); - // Add a new section to the document + // Add a new section to the document let section: PdfSection = document.addSection(); // Add a page to the section let page: PdfPage = section.addPage(); diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md b/Document-Processing/PDF/PDF-Library/javascript/Lists.md similarity index 94% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md rename to Document-Processing/PDF/PDF-Library/javascript/Lists.md index 43f44424a..4fb7d946c 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Lists.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Lists.md @@ -1,12 +1,12 @@ --- -title: Working with Lists | Syncfusion -description: This section explains working with lists, which are used to display and manage a collection of items in a structured list format. +title: Lists | Syncfusion +description: This section explains how to work with lists in a PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Bullets and Lists in PDF +# Lists The Syncfusion® PDF allows you list the content in ordered and unordered list. The ordered list can be number or alphabets and the unordered list can be bullets, circles, and images. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md b/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md similarity index 94% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md rename to Document-Processing/PDF/PDF-Library/javascript/PDF-document.md index 3283b691d..94bdc2c9d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-document.md +++ b/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md @@ -1,11 +1,13 @@ --- -title: Working with PDF Document | Syncfusion -description: This section explains how to set document Settings and properties to the PDF file using Essential PDF +title: PDF Document | Syncfusion +description: This section explains how to set document settings and properties in a PDF file by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with PDF Document +# PDF Document + +Essential® PDF provides support to create, read, and manipulate PDF documents, allowing you to generate high-quality, secure, and feature-rich PDF files programmatically. ## Adding the document settings diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md similarity index 97% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md rename to Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md index 906a70ba7..f6930e515 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Pages.md +++ b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md @@ -1,11 +1,13 @@ --- -title: Working with PDF pages | Syncfusion -description: This section explains how to add, rearrange, remove pages and detect empty pages from the PDF file +title: PDF pages | Syncfusion +description: This section explains how to add, rearrange, remove pages, and detect empty pages in a PDF file by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with PDF Pages +# PDF Pages + +Essential® PDF provides support to add, remove, rearrange, and detect empty pages in PDF documents, enabling complete control over page management for creating dynamic and customized PDFs. ## Adding a new page to the document diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md similarity index 96% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md rename to Document-Processing/PDF/PDF-Library/javascript/Redaction.md index 24a7f111f..171703452 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Redaction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md @@ -1,11 +1,11 @@ --- -title: Working with Redaction |Syncfusion -description: This section explains how to Redact the content from an existing PDF document by using Essential PDF +title: Redaction |Syncfusion +description: This section explains how to redact content from an existing PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with PDF Redaction +# Redaction Redacting a PDF is the process of permanently removing sensitive or confidential information from PDF documents. Syncfusion® PDF library provides an easy way to redact PDF documents. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md b/Document-Processing/PDF/PDF-Library/javascript/Shapes.md similarity index 98% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md rename to Document-Processing/PDF/PDF-Library/javascript/Shapes.md index 0baf73049..fa5ec527b 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Shapes.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Shapes.md @@ -1,11 +1,11 @@ --- -title: PDF Working with Shapes | Syncfusion -description: This section explains how to add shapes such as Line, curve, path, text, rectangle, pie, arc, Bezier, ellipse in the PDF file +title: Shapes | Syncfusion +description: This section explains how to add shapes such as lines, curves, paths, text, rectangles, pies, arcs, Beziers, and ellipses by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Shapes in PDF file +# Shapes Essential® PDF has support for adding the below shapes. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md b/Document-Processing/PDF/PDF-Library/javascript/Templates.md similarity index 93% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md rename to Document-Processing/PDF/PDF-Library/javascript/Templates.md index 856173c18..16f4059a1 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-PDF-Templates.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Templates.md @@ -1,11 +1,11 @@ --- -title: Working with PDF file templates | Syncfusion -description: This section explains how to create a PDF template is a drawing surface, where contents can be added using PDF library. +title: PDF Templates | Syncfusion +description: This section explains how to create a PDF template, which is a drawing surface where contents can be added, by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with PDF Templates +# PDF Templates A PDF template is a drawing surface, where contents can be added. All the elements that can be added to a PdfPage is supported in PdfTemplate as well. The template in turn can be drawn over the page or can be positioned at any part of the page. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md similarity index 98% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md rename to Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md index 9ba29742f..51b21044d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text-Extraction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md @@ -1,11 +1,11 @@ --- -title: Working with Text Extraction | Syncfusion -description: This section explains how to extract text and its bounds from a particular page or the entire PDF document. +title: Text Extraction | Syncfusion +description: This section explains how to extract text and its bounds from a specific page or the entire PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with Text Extraction +# Text Extraction Essential® PDF allows you to extract the text from a particular page or the entire PDF document. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md b/Document-Processing/PDF/PDF-Library/javascript/Text.md similarity index 96% rename from Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md rename to Document-Processing/PDF/PDF-Library/javascript/Text.md index d734e61c9..2941afcba 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Working-with-Text.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Text.md @@ -1,11 +1,13 @@ --- -title: Working with Text | Syncfusion -description: This section explains how to add text to the PDF file using different type of fonts, TrueType fonts and standard fonts +title: Text | Syncfusion +description: This section explains how to add text to a PDF by using different types of fonts, including TrueType fonts and standard fonts, with the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Working with text in the PDF file +# Text + +Essential® PDF provides support to add and format text in PDF documents using various font types, including TrueType and standard fonts, enabling precise control over text appearance and layout. ## Drawing text in a new document From ed536a51a874e7a5532c72001c3f7ba6763967c0 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Mon, 8 Dec 2025 15:44:59 +0530 Subject: [PATCH 12/13] 994201-dev: Resolved CI failures and updated proper title. --- .../PDF/PDF-Library/javascript/Annotations.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md | 4 ++-- .../PDF/PDF-Library/javascript/DigitalSignature.md | 4 ++-- .../PDF/PDF-Library/javascript/FormFields.md | 4 ++-- .../PDF/PDF-Library/javascript/HyperLinks.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Images.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Layers.md | 6 +++--- Document-Processing/PDF/PDF-Library/javascript/Lists.md | 6 +++--- .../PDF/PDF-Library/javascript/PDF-document.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Redaction.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Shapes.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Templates.md | 4 ++-- .../PDF/PDF-Library/javascript/Text-Extraction.md | 4 ++-- Document-Processing/PDF/PDF-Library/javascript/Text.md | 4 ++-- 15 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Annotations.md b/Document-Processing/PDF/PDF-Library/javascript/Annotations.md index 8145dc63a..2d204dcf4 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Annotations.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Annotations.md @@ -1,11 +1,11 @@ --- -title: Annotations | Syncfusion +title: Annotation in TypeScript PDF library | Syncfusion description: This section explains how to create, modify or remove different type of interactive Annotation by using TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Annotations +# Annotation in TypeScript PDF library Syncfusion® JavaScript PDF library provides support for interactive annotations. You can add, delete and modify the annotation from the PDF documents. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md b/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md index e7680086b..363b8764e 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md @@ -1,11 +1,11 @@ --- -title: Bookmarks | Syncfusion +title: Bookmarks in TypeScript PDF library | Syncfusion description: This section explains how to add, modify and remove bookmarks in the PDF document by using TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Bookmarks +# Bookmarks in TypeScript PDF library Essential® PDF provides support to insert, remove and modify the bookmarks in the PDF Document. diff --git a/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md index b0eca9b80..ae77ac62c 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md +++ b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md @@ -1,11 +1,11 @@ --- -title: Digital Signature | Syncfusion +title: Digital Signature in TypeScript PDF library | Syncfusion description: This section explains how to create a digital signature in the PDF document by using TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Digital Signature +# Digital Signature in TypeScript PDF library Essential® PDF provides support to create, validate, and manage digital signatures in PDF documents, ensuring authenticity, integrity, and security. diff --git a/Document-Processing/PDF/PDF-Library/javascript/FormFields.md b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md index 7e8fb4ce1..ec3da72b2 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/FormFields.md +++ b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md @@ -1,11 +1,11 @@ --- -title: Form Fields | Syncfusion +title: Form Fields in TypeScript PDF library | Syncfusion description: This section explains how to create a digital signature in the PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Form Fields +# Form Fields in TypeScript PDF library An interactive form, sometimes referred to as an AcroForm is a collection of fields for gathering information. A PDF document can contain any number of fields appearing on any combination of pages, all of that make a single, globally interactive form spanning the entire document. diff --git a/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md index 8f2ffd90d..823af6b3b 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md +++ b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md @@ -1,11 +1,11 @@ --- -title: Hyperlinks | Syncfusion +title: Hyperlinks in TypeScript PDF library | Syncfusion description: This section explains how to add a hyperlink in a new or existing PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Hyperlinks +# Hyperlinks in TypeScript PDF library In PDF, hyperlinks can be added to allow the users to navigate to another part of PDF file, web page or any other external content. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Images.md b/Document-Processing/PDF/PDF-Library/javascript/Images.md index bbb8ca126..95b92c0c0 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Images.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Images.md @@ -1,12 +1,12 @@ --- -title: Images | Syncfusion +title: Images in TypeScript PDF library | Syncfusion description: This section explains how to add and replace images in a PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Images +# Images in TypeScript PDF library Essential® PDF supports both raster and vector images. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Layers.md b/Document-Processing/PDF/PDF-Library/javascript/Layers.md index 183a8e420..21bdeae0d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Layers.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Layers.md @@ -1,12 +1,12 @@ --- -title: Layers | Syncfusion -description: This section explains how to add a layer in a PDF document by using the TypeScript PDF library +title: Layers in TypeScript PDF library | Syncfusion +description: This section explains how to add a layer in a PDF document using the TypeScript PDF library to organize content and enhance document structure platform: document-processing control: PDF documentation: UG --- -# Layers +# Layers in TypeScript PDF library Layers, also known as Option Content refers to sections of content in a PDF document that can be selectively viewed or hidden by document authors or consumers. This capability is useful in items such as CAD drawings, layered artwork, maps, and multi-language documents. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Lists.md b/Document-Processing/PDF/PDF-Library/javascript/Lists.md index 4fb7d946c..cdb3c6900 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Lists.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Lists.md @@ -1,12 +1,12 @@ --- -title: Lists | Syncfusion -description: This section explains how to work with lists in a PDF document by using the TypeScript PDF library +title: Lists in TypeScript PDF library | Syncfusion +description: This section explains how to work with lists in a PDF document using the TypeScript PDF library to display and manage items in a structured format platform: document-processing control: PDF documentation: UG --- -# Lists +# Lists in TypeScript PDF library The Syncfusion® PDF allows you list the content in ordered and unordered list. The ordered list can be number or alphabets and the unordered list can be bullets, circles, and images. diff --git a/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md b/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md index 94bdc2c9d..e244d4fbe 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md +++ b/Document-Processing/PDF/PDF-Library/javascript/PDF-document.md @@ -1,11 +1,11 @@ --- -title: PDF Document | Syncfusion +title: Document in TypeScript PDF library | Syncfusion description: This section explains how to set document settings and properties in a PDF file by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# PDF Document +# Document in TypeScript PDF library Essential® PDF provides support to create, read, and manipulate PDF documents, allowing you to generate high-quality, secure, and feature-rich PDF files programmatically. diff --git a/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md index f6930e515..337357b9f 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md +++ b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md @@ -1,11 +1,11 @@ --- -title: PDF pages | Syncfusion +title: Pages in TypeScript PDF library | Syncfusion description: This section explains how to add, rearrange, remove pages, and detect empty pages in a PDF file by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# PDF Pages +# Pages in TypeScript PDF library Essential® PDF provides support to add, remove, rearrange, and detect empty pages in PDF documents, enabling complete control over page management for creating dynamic and customized PDFs. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Redaction.md b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md index 171703452..7cca2bcb8 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Redaction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md @@ -1,11 +1,11 @@ --- -title: Redaction |Syncfusion +title: Redaction in TypeScript PDF library |Syncfusion description: This section explains how to redact content from an existing PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Redaction +# Redaction in TypeScript PDF library Redacting a PDF is the process of permanently removing sensitive or confidential information from PDF documents. Syncfusion® PDF library provides an easy way to redact PDF documents. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Shapes.md b/Document-Processing/PDF/PDF-Library/javascript/Shapes.md index fa5ec527b..12d303c92 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Shapes.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Shapes.md @@ -1,11 +1,11 @@ --- -title: Shapes | Syncfusion +title: Shapes in TypeScript PDF library | Syncfusion description: This section explains how to add shapes such as lines, curves, paths, text, rectangles, pies, arcs, Beziers, and ellipses by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Shapes +# Shapes in TypeScript PDF library Essential® PDF has support for adding the below shapes. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Templates.md b/Document-Processing/PDF/PDF-Library/javascript/Templates.md index 16f4059a1..7587ad92a 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Templates.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Templates.md @@ -1,11 +1,11 @@ --- -title: PDF Templates | Syncfusion +title: Templates in TypeScript PDF library | Syncfusion description: This section explains how to create a PDF template, which is a drawing surface where contents can be added, by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# PDF Templates +# Templates in TypeScript PDF library A PDF template is a drawing surface, where contents can be added. All the elements that can be added to a PdfPage is supported in PdfTemplate as well. The template in turn can be drawn over the page or can be positioned at any part of the page. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md index 51b21044d..91bd0e31f 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md @@ -1,11 +1,11 @@ --- -title: Text Extraction | Syncfusion +title: Text Extraction in TypeScript PDF library | Syncfusion description: This section explains how to extract text and its bounds from a specific page or the entire PDF document by using the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Text Extraction +# Text Extraction in TypeScript PDF library Essential® PDF allows you to extract the text from a particular page or the entire PDF document. diff --git a/Document-Processing/PDF/PDF-Library/javascript/Text.md b/Document-Processing/PDF/PDF-Library/javascript/Text.md index 2941afcba..3df81b037 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Text.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Text.md @@ -1,11 +1,11 @@ --- -title: Text | Syncfusion +title: Text in TypeScript PDF library | Syncfusion description: This section explains how to add text to a PDF by using different types of fonts, including TrueType fonts and standard fonts, with the TypeScript PDF library platform: document-processing control: PDF documentation: UG --- -# Text +# Text in TypeScript PDF library Essential® PDF provides support to add and format text in PDF documents using various font types, including TrueType and standard fonts, enabling precise control over text appearance and layout. From 30b02efa4ac662debc3b2e91baab675fe8d86310 Mon Sep 17 00:00:00 2001 From: sameerkhan001 Date: Mon, 8 Dec 2025 19:41:43 +0530 Subject: [PATCH 13/13] 994201-dev: Added proper code example and verified. --- .../PDF/PDF-Library/javascript/Annotations.md | 341 ++++++++++++++---- .../PDF/PDF-Library/javascript/Bookmarks.md | 67 +++- .../javascript/DigitalSignature.md | 195 +++++----- .../PDF/PDF-Library/javascript/FormFields.md | 151 +++++--- .../PDF/PDF-Library/javascript/HyperLinks.md | 10 +- .../PDF/PDF-Library/javascript/Images.md | 4 +- .../PDF/PDF-Library/javascript/Layers.md | 8 +- .../PDF/PDF-Library/javascript/Lists.md | 139 +++---- .../PDF/PDF-Library/javascript/PDF-pages.md | 4 +- .../PDF/PDF-Library/javascript/Redaction.md | 35 +- .../PDF/PDF-Library/javascript/Templates.md | 4 +- .../PDF-Library/javascript/Text-Extraction.md | 33 +- 12 files changed, 660 insertions(+), 331 deletions(-) diff --git a/Document-Processing/PDF/PDF-Library/javascript/Annotations.md b/Document-Processing/PDF/PDF-Library/javascript/Annotations.md index 2d204dcf4..a050e9f7d 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Annotations.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Annotations.md @@ -93,7 +93,7 @@ let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Creates a file link annotation -const fileLink = new PdfFileLinkAnnotation( +let fileLink = new PdfFileLinkAnnotation( { x: 100, y: 150, width: 120, height: 18 }, 'logo.png', { @@ -125,7 +125,7 @@ let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Creates a file link annotation -const fileLink = new PdfFileLinkAnnotation( +let fileLink = new PdfFileLinkAnnotation( { x: 100, y: 150, width: 120, height: 18 }, 'logo.png', { @@ -159,7 +159,7 @@ let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create new free text annotation -const freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, +let freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, { text: 'Free Text with Callout', annotationIntent: PdfAnnotationIntent.freeTextCallout, @@ -195,7 +195,7 @@ let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create new free text annotation -const freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, +let freeText = new PdfFreeTextAnnotation({ x: 250, y: 260, width: 180, height: 80 }, { text: 'Free Text with Callout', annotationIntent: PdfAnnotationIntent.freeTextCallout, @@ -354,20 +354,46 @@ This example demonstrates how to add an ink annotation to a PDF page using the ` {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfInkAnnotation} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfInkAnnotation} from '@syncfusion/ej2-pdf'; - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Adds a new page to the PDF - let page: PdfPage = document.addPage(); - // Create a new ink annotation with the bounds and ink points - const annotation: PdfInkAnnotation = new PdfInkAnnotation({x: 0, y: 0, width: 300, height: 400}, [{x: 40, y: 300}, {x: 60, y: 100}, {x: 40, y: 50}, {x: 40, y: 300}]); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); +// Create a new PDF document +let document: PdfDocument = new PdfDocument(); +// Add a new page to the PDF +let page: PdfPage = document.addPage(); +// Create an ink annotation +let annotation = new PdfInkAnnotation( + { x: 50, y: 100, width: 200, height: 150 }, + [ + { x: 60, y: 120 }, + { x: 120, y: 180 }, + { x: 200, y: 160 } + ], + { + text: 'Ink', + author: 'Syncfusion', + subject: 'Ink Annotation', + color: { r: 0, g: 0, b: 255 }, + thickness: 2, + opacity: 0.8, + pointsCollection: [ + [ + { x: 60, y: 120 }, + { x: 90, y: 130 }, + { x: 110, y: 140 } + ], + [ + { x: 120, y: 180 }, + { x: 150, y: 175 } + ] + ] + } +); +// Add annotation to the page +page.annotations.add(annotation); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -377,20 +403,46 @@ The following code snippet explains how to add a ink annotation in an existing P {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfInkAnnotation} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfInkAnnotation} from '@syncfusion/ej2-pdf'; - // Load an existing PDF document - let document: PdfDocument = new PdfDocument(data, password); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new ink annotation with the bounds and ink points - const annotation: PdfInkAnnotation = new PdfInkAnnotation({x: 0, y: 0, width: 300, height: 400}, [{x: 40, y: 300}, {x: 60, y: 100}, {x: 40, y: 50}, {x: 40, y: 300}]); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Create an ink annotation +let annotation = new PdfInkAnnotation( + { x: 50, y: 100, width: 200, height: 150 }, + [ + { x: 60, y: 120 }, + { x: 120, y: 180 }, + { x: 200, y: 160 } + ], + { + text: 'Ink', + author: 'Syncfusion', + subject: 'Ink Annotation', + color: { r: 0, g: 0, b: 255 }, + thickness: 2, + opacity: 0.8, + pointsCollection: [ + [ + { x: 60, y: 120 }, + { x: 90, y: 130 }, + { x: 110, y: 140 } + ], + [ + { x: 120, y: 180 }, + { x: 150, y: 175 } + ] + ] + } +); +// Add annotation to the page +page.annotations.add(annotation); +// Save the document +document.save('Output.pdf'); +// Close the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -402,14 +454,25 @@ This example demonstrates how to add a popup annotation to a PDF document using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfPopupAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfPopupAnnotation, PdfPopupIcon, PdfAnnotationState, PdfAnnotationStateModel} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new popup annotation - const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', {x: 10, y: 40, width: 30, height: 30}); + let annotation = new PdfPopupAnnotation('Review this paragraph', + {x: 10, y: 40, width: 30, height: 30}, + { + author: 'Reviewer', + subject: 'General', + color: { r: 255, g: 255, b: 0 }, + icon: PdfPopupIcon.comment, + open: true, + state: PdfAnnotationState.accepted, + stateModel: PdfAnnotationStateModel.review + } + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -425,14 +488,24 @@ The following code snippet explains how to add a popup annotation in an existing {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfPopupAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfPopupAnnotation, PdfPopupIcon, PdfAnnotationState, PdfAnnotationStateModel} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); - // Create a new popup annotation - const annotation: PdfPopupAnnotation = new PdfPopupAnnotation('Test popup annotation', {x: 10, y: 40, width: 30, height: 30}); + let annotation = new PdfPopupAnnotation('Review this paragraph', + {x: 10, y: 40, width: 30, height: 30}, + { + author: 'Reviewer', + subject: 'General', + color: { r: 255, g: 255, b: 0 }, + icon: PdfPopupIcon.comment, + open: true, + state: PdfAnnotationState.accepted, + stateModel: PdfAnnotationStateModel.review + } + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -450,14 +523,20 @@ This example demonstrates how to add a file attachment annotation to a PDF page {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfAttachmentAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfAttachmentAnnotation, PdfAttachmentIcon, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new attachment annotation - const annotation: PdfAttachmentAnnotation = new PdfAttachmentAnnotation({x: 300, y: 200, width: 30, height: 30}, 'Nature.jpg', imageData); + let annotation = new PdfAttachmentAnnotation( + { x: 300, y: 200, width: 30, height: 30 }, + 'Nature.jpg', + imageData, + { text: 'Attachment', icon: PdfAttachmentIcon.pushPin, color: { r: 255, g: 0, b: 0 }, opacity: 1, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid})} + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -473,14 +552,20 @@ The following code snippet explains how to add a attachment annotation in an exi {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfAttachmentAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfAttachmentAnnotation, PdfAttachmentIcon, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new attachment annotation - const annotation: PdfAttachmentAnnotation = new PdfAttachmentAnnotation({x: 300, y: 200, width: 30, height: 30}, 'Nature.jpg', imageData); + let annotation = new PdfAttachmentAnnotation( + { x: 300, y: 200, width: 30, height: 30 }, + 'Nature.jpg', + imageData, + { text: 'Attachment', icon: PdfAttachmentIcon.pushPin, color: { r: 255, g: 0, b: 0 }, opacity: 1, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid})} + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -569,14 +654,19 @@ This example demonstrates how to add a document link annotation to a PDF page us {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfDocumentLinkAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfDocumentLinkAnnotation, PdfDestinationMode, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); - // Create a new document link annotation - let annotation: PdfDocumentLinkAnnotation = new PdfDocumentLinkAnnotation({x: 100, y: 150, width: 40, height: 60}); + // Create new document link annotation + let annotation = new PdfDocumentLinkAnnotation( + { x: 80, y: 100, width: 120, height: 18 }, + new PdfDestination({page , location: { x: 0, y: 0 }, mode: PdfDestinationMode.fitToPage}), + { color: { r: 0, g: 128, b: 0 }, opacity: 1, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid})} + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -592,14 +682,19 @@ The following code snippet explains how to add a document link annotation in an {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfDocumentLinkAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfDocumentLinkAnnotation, PdfDestinationMode, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); - // Create a new document link annotation - let annotation: PdfDocumentLinkAnnotation = new PdfDocumentLinkAnnotation({x: 100, y: 150, width: 40, height: 60}); + // Create new document link annotation + let annotation = new PdfDocumentLinkAnnotation( + { x: 80, y: 100, width: 120, height: 18 }, + new PdfDestination({page , location: { x: 0, y: 0 }, mode: PdfDestinationMode.fitToPage}), + { color: { r: 0, g: 128, b: 0 }, opacity: 1, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid})} + ); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -617,14 +712,21 @@ This example demonstrates how to add a redaction annotation to a PDF page using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfRedactionAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfRedactionAnnotation, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new redaction annotation - const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation({x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation({x: 100, y: 100, width: 100, height: 100}, + { borderColor: {r: 255, g: 0, b: 0}, + repeatText: true, + overlayText: 'Sample Overlay', + font: document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular), + textColor: {r: 0, g: 0, b: 0}, + appearanceFillColor: {r: 255, g: 255, b: 255} + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -640,14 +742,21 @@ The following code snippet explains how to add a document link annotation in an {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfRedactionAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfRedactionAnnotation, PdfFontFamily, PdfFontStyle } from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new redaction annotation - const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation({x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation({x: 100, y: 100, width: 100, height: 100}, + { borderColor: {r: 255, g: 0, b: 0}, + repeatText: true, + overlayText: 'Sample Overlay', + font: document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular), + textColor: {r: 0, g: 0, b: 0}, + appearanceFillColor: {r: 255, g: 255, b: 255} + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -672,7 +781,7 @@ This example demonstrates how to add a watermark annotation to a PDF page using // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new water mark annotation - const annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', {x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', {x: 50, y: 100, width: 100, height: 50}); // Set the color of the annotation annotation.color = {r: 0, g: 0, b: 0}; // Add annotation to the page @@ -697,7 +806,7 @@ The following code snippet explains how to add a watermark annotation in an exis // Access the first page let page: PdfPage = document.getPage(0); // Create a new water mark annotation - const annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', {x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfWatermarkAnnotation = new PdfWatermarkAnnotation('Water Mark', {x: 50, y: 100, width: 100, height: 50}); // Set the color of the annotation annotation.color = {r: 0, g: 0, b: 0}; // Add annotation to the page @@ -717,14 +826,20 @@ This example demonstrates how to add a text markup annotation to a PDF page usin {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfTextMarkupAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfTextMarkupAnnotation, PdfTextMarkupAnnotationType, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new text markup annotation - let annotation: PdfTextMarkupAnnotation = new PdfTextMarkupAnnotation('Text markup', {x: 50, y: 100, width: 100, height: 50}); + // Create a new text markup annotation + let annotation = new PdfTextMarkupAnnotation('Water Mark', {x: 0, y: 0, width: 0, height: 0}, { + boundsCollection: [{x: 50, y: 200, width: 120, height: 14}, {x: 50, y: 215, width: 90, height: 14}], + textMarkupType: PdfTextMarkupAnnotationType.underline, author: 'Syncfusion', subject: 'Annotation', + textMarkUpColor: {r: 0, g: 128, b: 255}, innerColor: {r: 0, g: 0, b: 255}, opacity: 0.5, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -740,14 +855,20 @@ The following code snippet explains how to add a text markup annotation in an ex {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfTextMarkupAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfTextMarkupAnnotation, PdfTextMarkupAnnotationType, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new text markup annotation - let annotation: PdfTextMarkupAnnotation = new PdfTextMarkupAnnotation('Text markup', {x: 50, y: 100, width: 100, height: 50}); + // Create a new text markup annotation + let annotation = new PdfTextMarkupAnnotation('Water Mark', {x: 0, y: 0, width: 0, height: 0}, { + boundsCollection: [{x: 50, y: 200, width: 120, height: 14}, {x: 50, y: 215, width: 90, height: 14}], + textMarkupType: PdfTextMarkupAnnotationType.underline, author: 'Syncfusion', subject: 'Annotation', + textMarkUpColor: {r: 0, g: 128, b: 255}, innerColor: {r: 0, g: 0, b: 255}, opacity: 0.5, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -767,14 +888,20 @@ This example demonstrates how to add a rectangle annotation to a PDF page using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfRectangleAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfRectangleAnnotation, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new square annotation with bounds - const annotation: PdfRectangleAnnotation = new PdfRectangleAnnotation({x: 10, y: 10, width: 200, height: 100}); + let annotation = new PdfRectangleAnnotation({ x: 50, y: 80, width: 200, height: 100 }, { + text: 'Rect', author: 'Syncfusion', subject: 'Rectangle Annotation', + color: { r: 255, g: 0, b: 0 }, + innerColor: { r: 255, g: 240, b: 240 }, + opacity: 0.6, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -790,14 +917,20 @@ The following code snippet explains how to add a rectangle annotation in an exis {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfRectangleAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfRectangleAnnotation, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new square annotation with bounds - const annotation: PdfRectangleAnnotation = new PdfRectangleAnnotation({x: 10, y: 10, width: 200, height: 100}); + let annotation = new PdfRectangleAnnotation({ x: 50, y: 80, width: 200, height: 100 }, { + text: 'Rect', author: 'Syncfusion', subject: 'Rectangle Annotation', + color: { r: 255, g: 0, b: 0 }, + innerColor: { r: 255, g: 240, b: 240 }, + opacity: 0.6, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -815,14 +948,22 @@ This example demonstrates how to add a polygon annotation to a PDF page using th {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfPolygonAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfPolygonAnnotation, PdfAnnotationBorder, PdfBorderStyle } from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new polygon annotation with bounds - const annotation: PdfPolygonAnnotation = new PdfPolygonAnnotation([{x: 100, y: 300}, {x: 150, y: 200}, {x: 300, y: 200}, {x: 350, y: 300}, {x: 300, y: 400}, {x: 150, y: 400}]); + let annotation = new PdfPolygonAnnotation( + [{ x: 100, y: 300 }, { x: 150, y: 200 }, { x: 300, y: 200 }, { x: 350, y: 300 }, { x: 300, y: 400 }, { x: 150, y: 400 }], + { + text: 'Polygon', author: 'Syncfusion', subject: 'Polygon Annotation', + color: { r: 0, g: 128, b: 255 }, + innerColor: { r: 220, g: 240, b: 255 }, + opacity: 0.7, + border: new PdfAnnotationBorder({width: 2, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -838,14 +979,22 @@ The following code snippet explains how to add a polygon annotation in an existi {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfPolygonAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfPolygonAnnotation, PdfAnnotationBorder, PdfBorderStyle } from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new polygon annotation with bounds - const annotation: PdfPolygonAnnotation = new PdfPolygonAnnotation([{x: 100, y: 300}, {x: 150, y: 200}, {x: 300, y: 200}, {x: 350, y: 300}, {x: 300, y: 400}, {x: 150, y: 400}]); + let annotation = new PdfPolygonAnnotation( + [{ x: 100, y: 300 }, { x: 150, y: 200 }, { x: 300, y: 200 }, { x: 350, y: 300 }, { x: 300, y: 400 }, { x: 150, y: 400 }], + { + text: 'Polygon', author: 'Syncfusion', subject: 'Polygon Annotation', + color: { r: 0, g: 128, b: 255 }, + innerColor: { r: 220, g: 240, b: 255 }, + opacity: 0.7, + border: new PdfAnnotationBorder({width: 2, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -863,14 +1012,22 @@ This example demonstrates how to add a circle annotation to a PDF page using the {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfCircleAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfCircleAnnotation, PdfAnnotationBorder, PdfBorderStyle, PdfMeasurementUnit, PdfCircleMeasurementType} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new circle annotation with circle bounds - const annotation: PdfCircleAnnotation = new PdfCircleAnnotation({x: 10, y: 10, width: 100, height: 100}); + let annotation = new PdfCircleAnnotation({ x: 50, y: 100, width: 120, height: 120 }, { + text: 'Diameter', + author: 'Syncfusion', + color: {r: 255, g: 0, b: 0}, + innerColor: {r: 255, g: 255, b: 200}, + opacity: 0.9, + border: new PdfAnnotationBorder({width: 2, hRadius: 0, vRadius: 0, style: PdfBorderStyle.dashed, dash: [3, 2]}), + measure: { unit: PdfMeasurementUnit.centimeter, type: PdfCircleMeasurementType.diameter } + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -886,14 +1043,22 @@ The following code snippet explains how to add a circle annotation in an existin {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfCircleAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfCircleAnnotation, PdfAnnotationBorder, PdfBorderStyle, PdfMeasurementUnit, PdfCircleMeasurementType} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new circle annotation with circle bounds - const annotation: PdfCircleAnnotation = new PdfCircleAnnotation({x: 10, y: 10, width: 100, height: 100}); + let annotation = new PdfCircleAnnotation({ x: 50, y: 100, width: 120, height: 120 }, { + text: 'Diameter', + author: 'Syncfusion', + color: {r: 255, g: 0, b: 0}, + innerColor: {r: 255, g: 255, b: 200}, + opacity: 0.9, + border: new PdfAnnotationBorder({width: 2, hRadius: 0, vRadius: 0, style: PdfBorderStyle.dashed, dash: [3, 2]}), + measure: { unit: PdfMeasurementUnit.centimeter, type: PdfCircleMeasurementType.diameter } + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -911,14 +1076,20 @@ This example demonstrates how to add an ellipse annotation to a PDF page using t {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfEllipseAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfEllipseAnnotation, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Adds a new page to the PDF let page: PdfPage = document.addPage(); // Create a new ellipse annotation with bounds - const annotation: PdfEllipseAnnotation = new PdfEllipseAnnotation({x: 10, y: 10, width: 100, height: 100}); + let annotation = new PdfEllipseAnnotation({ x: 80, y: 120, width: 160, height: 100 }, { + text: 'Ellipse', author: 'Syncfusion', subject: 'Ellipse Annotation', + color: {r: 0, g: 128, b: 255}, + innerColor: {r: 220, g: 240, b: 255}, + opacity: 0.7, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -934,14 +1105,20 @@ The following code snippet explains how to add a ellipse annotation in an existi {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfEllipseAnnotation} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfEllipseAnnotation, PdfAnnotationBorder, PdfBorderStyle} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); // Create a new ellipse annotation with bounds - const annotation: PdfEllipseAnnotation = new PdfEllipseAnnotation({x: 10, y: 10, width: 100, height: 100}); + let annotation = new PdfEllipseAnnotation({ x: 80, y: 120, width: 160, height: 100 }, { + text: 'Ellipse', author: 'Syncfusion', subject: 'Ellipse Annotation', + color: {r: 0, g: 128, b: 255}, + innerColor: {r: 220, g: 240, b: 255}, + opacity: 0.7, + border: new PdfAnnotationBorder({width: 1, hRadius: 0, vRadius: 0, style: PdfBorderStyle.solid}) + }); // Add annotation to the page page.annotations.add(annotation); // Save the document @@ -954,7 +1131,7 @@ The following code snippet explains how to add a ellipse annotation in an existi ## Measurement Annotations -This example demonstrates how to access a measurement annotation from a PDF page using the PdfLineAnnotation class. A measurement annotation allows defining and displaying dimensions such as distances or lengths within a PDF document. +This example demonstrates how to access a measurement annotation from a PDF page using the `PdfLineAnnotation` class. A measurement annotation allows defining and displaying dimensions such as distances or lengths within a PDF document. {% tabs %} {% highlight c# tabtitle="TypeScript" %} @@ -992,8 +1169,10 @@ This example demonstrates how to modify an existing annotation in a PDF page usi let page: PdfPage = document.getPage(0); // Get the first annotation of the page let annotation: PdfPopupAnnotation = page.annotations.at(0) as PdfPopupAnnotation; - // Gets the boolean flag indicating whether annotation has open or not. - let open: boolean = annotation.open; + // Modified its properties + annotation.text ='Popup annotation'; + annotation.color = {r: 0, g: 128, b: 255}; + annotation.opacity = 0.5; // Save the document document.save('Output.pdf'); // Close the document @@ -1034,15 +1213,17 @@ This example demonstrates how to flatten annotations in a PDF document using the {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfLineAnnotation} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); - // Flatten PDF annotations and form fields - document.flatten = true; - // Save the document - document.save('Output.pdf'); - // Close the document + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Get the first annotation of the page + let annotation: PdfLineAnnotation = page.annotations.at(0) as PdfLineAnnotation; + // Sets the boolean flag indicating whether the annotation have been flattened or not. + annotation.flatten = true; + // Destroy the document document.destroy(); {% endhighlight %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md b/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md index 363b8764e..6f1fdea13 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Bookmarks.md @@ -16,10 +16,12 @@ This example demonstrates how to add bookmarks to a PDF document using the `PdfB {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfBookmarkBase, PdfDestination} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfBookmarkBase, PdfDestination} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); + // Add page + let page: PdfPage = document.addPage(); // Get the bookmarks let bookmarks: PdfBookmarkBase = document.bookmarks; // Add a new outline to the PDF document @@ -41,10 +43,12 @@ This example demonstrates how to add bookmarks to an existing PDF document using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfBookmarkBase, PdfDestination} from '@syncfusion/ej2-pdf'; + import {PdfDocument, PdfPage, PdfBookmarkBase, PdfDestination} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); + // Get page + let page: PdfPage = document.getPage(0); // Get the bookmarks let bookmarks: PdfBookmarkBase = document.bookmarks; // Gets the bookmark at the specified index @@ -75,7 +79,7 @@ This example demonstrates how to insert bookmarks at a specific position in an e // Get the bookmarks let bookmarks: PdfBookmarkBase = document.bookmarks; // Add a new outline to the PDF document - let bookmark: PdfBookmark = bookmarks.add('Introduction'); + let bookmark: PdfBookmark = bookmarks.add('Introduction', 1); // Sets destination to the bookmark bookmark.destination = new PdfDestination(page, {x: 100, y: 200}); // Save the document @@ -88,8 +92,7 @@ This example demonstrates how to insert bookmarks at a specific position in an e ## Removing Bookmarks from an existing PDF -This example demonstrates how to remove bookmarks from an existing PDF document using the `PdfBookmark` class. Removing bookmarks helps clean up unnecessary navigation links. - +This example demonstrates how to remove bookmarks from an existing PDF document using the `PdfBookmark` class. {% tabs %} {% highlight c# tabtitle="TypeScript" %} @@ -111,6 +114,58 @@ This example demonstrates how to remove bookmarks from an existing PDF document {% endhighlight %} {% endtabs %} +## Removing Bookmark from the document at the specified index + +This example demonstrates how to remove bookmarks from the document at the specific index using the `PdfBookmark` class. + +{% tabs %} +{% highlight c# tabtitle="TypeScript" %} + + import {PdfDocument, PdfPage, PdfBookmarkBase, PdfDestination} from '@syncfusion/ej2-pdf'; + + // Load an existing PDF document + let document: PdfDocument = new PdfDocument(data, password); + // Get the first page + let page: PdfPage = document.getPage(0) as PdfPage; + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Remove the bookmark from the document at the index 1. + bookmarks.remove(1); + // Sets destination to the bookmark + bookmark.destination = new PdfDestination(page, {x: 10, 10}); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); + +{% endhighlight %} +{% endtabs %} + +## Removing all the Bookmark from the collection + +This example demonstrates how to removes all the bookmarks from the collection using the `PdfBookmark` class. + +{% tabs %} +{% highlight c# tabtitle="TypeScript" %} + + import {PdfDocument, PdfPage, PdfBookmarkBase} from '@syncfusion/ej2-pdf'; + + // Load an existing PDF document + let document: PdfDocument = new PdfDocument(data, password); + // Get the bookmarks + let bookmarks: PdfBookmarkBase = document.bookmarks; + // Remove all the bookmark from the collection. + bookmarks.clear(); + // Get count after removal of all outlines. + let count: number = bookmarks.count; + // Save the document + document.save('Output.pdf'); + // Destroy the document + document.destroy(); + +{% endhighlight %} +{% endtabs %} + ## Bookmark page index in an existing PDF document This example demonstrates how to retrieve the page index associated with a bookmark in an existing PDF document using the `PdfBookmark` class. This helps identify the exact location of the bookmark. @@ -125,7 +180,7 @@ This example demonstrates how to retrieve the page index associated with a bookm // Get bookmarks let bookmarks: PdfBookmarkBase = document.bookmarks; // Get bookmark at the specified index - let bookmark: PdfBookmark = bookmarks.at(0) as PdfBookmark; + let pageIndex: number = bookmarks.destination.pageIndex; // Save the document document.save('Output.pdf'); // Close the document diff --git a/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md index ae77ac62c..ce0811814 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md +++ b/Document-Processing/PDF/PDF-Library/javascript/DigitalSignature.md @@ -9,7 +9,7 @@ documentation: UG Essential® PDF provides support to create, validate, and manage digital signatures in PDF documents, ensuring authenticity, integrity, and security. -## Adding a digital signature +## Adding a digital signature This example demonstrates how to add a digital signature to a PDF document using the `PdfSignature` class. Digital signatures ensure document authenticity and integrity by applying cryptographic standards. @@ -19,31 +19,29 @@ This example demonstrates how to add a digital signature to a PDF document using import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; // Load the document -let document: PdfDocument = new PdfDocument(data, password); +let document: PdfDocument = new PdfDocument() // Get the first page of the document -let page: PdfPage = document.getPage(0); +let page: PdfPage = document.addPage(); // Access the PDF form let form: PdfForm = document.form; // Create a new signature field -let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); -// Define a callback function used for external signing -const externalSignatureCallback = ( - data: Uint8Array, - options: { - algorithm: DigestAlgorithm, - cryptographicStandard: CryptographicStandard, - } -): { signedData: Uint8Array; timestampData?: Uint8Array } => { - // Implement external signing logic here - return new Uint8Array(); // Placeholder return -}; -// Create a new signature using external signing -const signature: PdfSignature = PdfSignature.create(externalSignatureCallback, { - cryptographicStandard: CryptographicStandard.cms, - algorithm: DigestAlgorithm.sha256, +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { + x: 10, + y: 10, + width: 100, + height: 50 }); +// Create a new signature using PFX data and private key +let sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); // Set the signature to the field -field.setSignature(signature); +field.setSignature(sign); // Add the field into PDF form form.add(field); // Save the document @@ -54,52 +52,50 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Create a Signature Without Certificate Data for External Signing - -This example demonstrates how to create a signature field and configure a PDF signature for external signing without embedding certificate data. External signing enables you to implement custom signing logic outside the PDF library while maintaining compliance with cryptographic standards. +The following code snippet explains how to add a digital signature in an existing PDF document. {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; - - // Load the document - let document: PdfDocument = new PdfDocument(data, password); - // Gets the first page of the document - let page: PdfPage = document.getPage(0); - // Access the PDF form - let form: PdfForm = document.form; - // Create a new signature field - let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); - // Define a callback function used for external signing - const externalSignatureCallback = (data: Uint8Array, - options: { - algorithm: DigestAlgorithm, - cryptographicStandard: CryptographicStandard, - }): {signedData: Uint8Array, timestampData?: Uint8Array} => { - // Implement external signing logic here - return new Uint8Array(); // Placeholder return - }; - // Create a new signature using external signing - const signature: PdfSignature = PdfSignature.create({ - cryptographicStandard: CryptographicStandard.cms, - algorithm: DigestAlgorithm.sha256 - }, externalSignatureCallback); - // Set the signature to the field - field.setSignature(signature); - // Add the field into PDF form - form.add(field); - // Save the document - document.save('output.pdf'); - // Destroy the document - document.destroy(); +import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; + +// Load the document +let document: PdfDocument = new PdfDocument(data, password) +// Get the first page of the document +let page: PdfPage = document.getPage(0); +// Access the PDF form +let form: PdfForm = document.form; +// Create a new signature field +let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { + x: 10, + y: 10, + width: 100, + height: 50 +}); +// Create a new signature using PFX data and private key +let sign: PdfSignature = PdfSignature.create( + { + cryptographicStandard: CryptographicStandard.cms, + digestAlgorithm: DigestAlgorithm.sha256 + }, + certData, + password +); +// Set the signature to the field +field.setSignature(sign); +// Add the field into PDF form +form.add(field); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} -## Create Signature with Public Certificates for External Signing +## Create PDF Signature with External Signing -This example demonstrates how to create a new PDF signature using the `PdfSignature` class with public certificates for external signing. External signing allows you to implement custom signing logic outside the PDF library while maintaining compliance with cryptographic standards. +Essential® PDF provides support to create a new PDF signature using a callback function for external signing, enabling secure and flexible digital signature workflows. {% tabs %} {% highlight c# tabtitle="TypeScript" %} @@ -107,33 +103,29 @@ This example demonstrates how to create a new PDF signature using the `PdfSignat import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; // Load the document -let document: PdfDocument = new PdfDocument(data, password); -// Get the first page of the document +let document: PdfDocument = new PdfDocument(data, passw); +// Gets the first page of the document let page: PdfPage = document.getPage(0); // Access the PDF form let form: PdfForm = document.form; // Create a new signature field let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); // Define a callback function used for external signing -const externalSignatureCallback = ( +let externalSignatureCallback = ( data: Uint8Array, options: { algorithm: DigestAlgorithm, - cryptographicStandard: CryptographicStandard + cryptographicStandard: CryptographicStandard, } ): { signedData: Uint8Array; timestampData?: Uint8Array } => { // Implement external signing logic here return new Uint8Array(); // Placeholder return }; -// Create a new signature using external signing with public certificate collection -const signature: PdfSignature = PdfSignature.create( - { - cryptographicStandard: CryptographicStandard.cms, - algorithm: DigestAlgorithm.sha256 - }, - externalSignatureCallback, - publicCertificates -); +// Create a new signature using external signing +let signature: PdfSignature = PdfSignature.create(externalSignatureCallback, { + cryptographicStandard: CryptographicStandard.cms, + algorithm: DigestAlgorithm.sha256, +}); // Set the signature to the field field.setSignature(signature); // Add the field into PDF form @@ -146,9 +138,9 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Create Signature Using PFX Data and Private Key +## Create Signature with Public Certificates for External Signing -This example demonstrates how to create a new PDF signature using the `PdfSignature` class with PFX certificate data and a private key. This approach is commonly used for digital signing when you have access to a personal certificate file and its password. +This example demonstrates how to create a new PDF signature using the `PdfSignature` class with public certificates for external signing. External signing allows you to implement custom signing logic outside the PDF library while maintaining compliance with cryptographic standards. {% tabs %} {% highlight c# tabtitle="TypeScript" %} @@ -156,24 +148,35 @@ This example demonstrates how to create a new PDF signature using the `PdfSignat import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; // Load the document -let document: PdfDocument = new PdfDocument(data, password); -// Get the first page of the document +let document: PdfDocument = new PdfDocument(data); +// Gets the first page of the document let page: PdfPage = document.getPage(0); // Access the PDF form let form: PdfForm = document.form; // Create a new signature field let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); -// Create a new signature using PFX data and private key -const sign: PdfSignature = PdfSignature.create( +// Define a callback function used for external signing +let externalSignatureCallback = ( + data: Uint8Array, + options: { + algorithm: DigestAlgorithm, + cryptographicStandard: CryptographicStandard + } +): { signedData: Uint8Array; timestampData?: Uint8Array } => { + // Implement external signing logic here + return new Uint8Array(); // Placeholder return +}; +// Create a new signature using external signing with public certificate collection +let signature: PdfSignature = PdfSignature.create( + externalSignatureCallback, + publicCertificates, { cryptographicStandard: CryptographicStandard.cms, - digestAlgorithm: DigestAlgorithm.sha256 - }, - certData, - password + algorithm: DigestAlgorithm.sha256 + } ); // Set the signature to the field -field.setSignature(sign); +field.setSignature(signature); // Add the field into PDF form form.add(field); // Save the document @@ -184,9 +187,9 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Check Signature Visibility +## Create Signature Using PFX Data and Private Key -This example demonstrates how to check whether a PDF signature is visible using the `isVisible()` method of the `PdfSignature` class. This property helps determine if the signature appearance is displayed on the document. +This example demonstrates how to create a new PDF signature using the `PdfSignature` class with PFX certificate data and a private key. This approach is commonly used for digital signing when you have access to a personal certificate file and its password. {% tabs %} {% highlight c# tabtitle="TypeScript" %} @@ -202,7 +205,7 @@ let form: PdfForm = document.form; // Create a new signature field let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); // Create a new signature using PFX data and private key -const sign: PdfSignature = PdfSignature.create( +let sign: PdfSignature = PdfSignature.create( { cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 @@ -212,8 +215,6 @@ const sign: PdfSignature = PdfSignature.create( ); // Set the signature to the field field.setSignature(sign); -// Check the signature visibility -sign.isVisible(); // Add the field into PDF form form.add(field); // Save the document @@ -224,7 +225,7 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Get Signed Date +## Retrieve the Signed Date of a PDF Signature This example demonstrates how to retrieve the signed date of a PDF signature using the `getSignedDate()` method of the `PdfSignature` class. This property helps identify when the document was digitally signed. @@ -242,7 +243,7 @@ let form: PdfForm = document.form; // Create a new signature field let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); // Create a new signature using PFX data and private key -const sign: PdfSignature = PdfSignature.create( +let sign: PdfSignature = PdfSignature.create( { cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 @@ -264,14 +265,14 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Get Certificate Information of the Signature +## Get Certificate Information from a PDF Signature This example demonstrates how to retrieve the certificate information of a PDF signature using the `getCertificateInformation()` method of the `PdfSignature` class. This information includes details about the signer’s certificate used for digital signing. {% tabs %} {% highlight c# tabtitle="TypeScript" %} -import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm, CryptographicStandard} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, DigestAlgorithm,PdfCertificateInformation, CryptographicStandard} from '@syncfusion/ej2-pdf'; // Load the document let document: PdfDocument = new PdfDocument(data, password); @@ -282,7 +283,7 @@ let form: PdfForm = document.form; // Create a new signature field let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); // Create a new signature using PFX data and private key -const sign: PdfSignature = PdfSignature.create( +let sign: PdfSignature = PdfSignature.create( { cryptographicStandard: CryptographicStandard.cms, digestAlgorithm: DigestAlgorithm.sha256 @@ -293,7 +294,7 @@ const sign: PdfSignature = PdfSignature.create( // Set the signature to the field field.setSignature(sign); // Get the certificate information of the signature -const certificateInfo: PdfCertificateInformation = sign.getCertificateInformation(); +let certificateInfo: PdfCertificateInformation = sign.getCertificateInformation(); // Add the field into PDF form form.add(field); // Save the document @@ -304,7 +305,7 @@ document.destroy(); {% endhighlight %} {% endtabs %} -## Get Digital Signature Options +## Get Digital Signature Configuration Options This example demonstrates how to retrieve the configuration options of a digital signature in a PDF document using the `getSignatureOptions()` method of the `PdfSignature` class. These options include details such as the cryptographic standard and digest algorithm used for signing. @@ -353,7 +354,7 @@ let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, // Placeholder for signed data let signedData: Uint8Array; // Define a callback function used for external signing -const externalSignatureCallback = ( +let externalSignatureCallback = ( data: Uint8Array, options: { algorithm: DigestAlgorithm; @@ -364,7 +365,7 @@ const externalSignatureCallback = ( signedData = new Uint8Array(); // Placeholder return }; // Create a new signature using external signing with public certificate collection -const signature: PdfSignature = PdfSignature.create( +let signature: PdfSignature = PdfSignature.create( { cryptographicStandard: CryptographicStandard.cms, algorithm: DigestAlgorithm.sha256 @@ -377,11 +378,11 @@ field.setSignature(signature); // Add the field into PDF form form.add(field); // Save the document data -const data: Uint8Array = document.save(); +let data: Uint8Array = document.save(); // Destroy the document document.destroy(); // Replace the empty signature with externally signed hash and certificates -const signedDocumentData: Uint8Array = PdfSignature.replaceEmptySignature( +let signedDocumentData: Uint8Array = PdfSignature.replaceEmptySignature( data, 'Signature', signedData, diff --git a/Document-Processing/PDF/PDF-Library/javascript/FormFields.md b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md index ec3da72b2..2c8131876 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/FormFields.md +++ b/Document-Processing/PDF/PDF-Library/javascript/FormFields.md @@ -354,18 +354,30 @@ This example demonstrates how to add a signature field to a PDF document using t {% tabs %} {% highlight c# tabtitle="TypeScript" %} -import {PdfDocument, PdfPage, PdfForm, PdfSignatureField} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, PdfInteractiveBorder} from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); // Add a page let page: PdfPage = document.addPage(); -// Access the PDF form -let form: PdfForm = document.form; -// Create a new signature field -let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); -// Add the field into PDF form -form.add(field); +// Add the signature field into PDF form +document.form.add( + new PdfSignatureField( + page, + 'ApprovalSignature', + { x: 50, y: 260, width: 200, height: 40 }, + { + toolTip: 'Sign here', + color: { r: 0, g: 0, b: 0 }, + backColor: { r: 255, g: 255, b: 255 }, + borderColor: { r: 0, g: 0, b: 0 }, + border: new PdfInteractiveBorder({ + width: 1, + style: PdfBorderStyle.solid + }) + } + ) +); // Save the document document.save('Output.pdf'); // Close the document @@ -379,18 +391,30 @@ The following code snippet explains how to add a popup annotation in an existing {% tabs %} {% highlight c# tabtitle="TypeScript" %} -import {PdfDocument, PdfPage, PdfForm, PdfSignatureField} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfSignatureField, PdfInteractiveBorder} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); -// Access the PDF form -let form: PdfForm = document.form; -// Create a new signature field -let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', {x: 10, y: 10, width: 100, height: 50}); -// Add the field into PDF form -form.add(field); +// Add the signature field into PDF form +document.form.add( + new PdfSignatureField( + page, + 'ApprovalSignature', + { x: 50, y: 260, width: 200, height: 40 }, + { + toolTip: 'Sign here', + color: { r: 0, g: 0, b: 0 }, + backColor: { r: 255, g: 255, b: 255 }, + borderColor: { r: 0, g: 0, b: 0 }, + border: new PdfInteractiveBorder({ + width: 1, + style: PdfBorderStyle.solid + }) + } + ) +); // Save the document document.save('Output.pdf'); // Close the document @@ -406,23 +430,38 @@ This example demonstrates how to add a button field to a PDF document using the {% tabs %} {% highlight c# tabtitle="TypeScript" %} -import {PdfDocument, PdfPage, PdfForm, PdfButtonField} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfButtonField, PdfHighlightMode, PdfBorderStyle, PdfInteractiveBorder} from '@syncfusion/ej2-pdf'; -// Create a new PDF document +/ Create a new PDF document let document: PdfDocument = new PdfDocument(); // Add a page let page: PdfPage = document.addPage(); -// Access the PDF form -let form: PdfForm = document.form; -// Create a new button field -let field: PdfButtonField = new PdfButtonField(page , 'Button1', {x: 100, y: 40, width: 100, height: 20}); -// Add the field into PDF form -form.add(field); +// Add a button field into the PDF form +document.form.add( + new PdfButtonField( + page, + 'Submit', + { x: 50, y: 560, width: 120, height: 28 }, + { + toolTip: 'Submit form', + color: { r: 255, g: 255, b: 255 }, + backColor: { r: 0, g: 122, b: 204 }, + borderColor: { r: 0, g: 0, b: 0 }, + border: new PdfInteractiveBorder({ + width: 1, + style: PdfBorderStyle.solid + }), + text: 'Submit', + highlightMode: PdfHighlightMode.push + } + ) +); // Save the document document.save('Output.pdf'); // Close the document document.destroy(); + {% endhighlight %} {% endtabs %} @@ -431,18 +470,32 @@ The following code snippet explains how to add a popup annotation in an existing {% tabs %} {% highlight c# tabtitle="TypeScript" %} -import {PdfDocument, PdfPage, PdfForm, PdfButtonField} from '@syncfusion/ej2-pdf'; +import {PdfDocument, PdfPage, PdfForm, PdfButtonField, PdfHighlightMode, PdfBorderStyle, PdfInteractiveBorder} from '@syncfusion/ej2-pdf'; // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Access the first page let page: PdfPage = document.getPage(0); -// Access the PDF form -let form: PdfForm = document.form; -// Create a new button field -let field: PdfButtonField = new PdfButtonField(page , 'Button1', {x: 100, y: 40, width: 100, height: 20}); -// Add the field into PDF form -form.add(field); +// Add a button field into the PDF form +document.form.add( + new PdfButtonField( + page, + 'Submit', + { x: 50, y: 560, width: 120, height: 28 }, + { + toolTip: 'Submit form', + color: { r: 255, g: 255, b: 255 }, + backColor: { r: 0, g: 122, b: 204 }, + borderColor: { r: 0, g: 0, b: 0 }, + border: new PdfInteractiveBorder({ + width: 1, + style: PdfBorderStyle.solid + }), + text: 'Submit', + highlightMode: PdfHighlightMode.push + } + ) +); // Save the document document.save('Output.pdf'); // Close the document @@ -472,6 +525,8 @@ This example demonstrates how to fill a text box field in a PDF document using t let field: PdfTextBoxField = document.form.fieldAt(0) as PdfTextBoxField; // Sets the text value to text box field field.text = 'Syncfusion'; + // Sets the text alignment of form field as center + field.textAlignment = PdfTextAlignment.center; // Save the document document.save('Output.pdf'); // Close the document @@ -497,6 +552,8 @@ This example demonstrates how to fill a combo box field in a PDF document using let field: PdfComboBoxField = document.form.fieldAt(0) as PdfComboBoxField; // Sets the selected index field.selectedIndex = 2; + // Sets the flag indicates whether the list box allows multiple selections. + field.multiSelect = true; // Save the document document.save('Output.pdf'); // Close the document @@ -522,6 +579,8 @@ This example demonstrates how to fill a radio button field in a PDF document usi let field: PdfRadioButtonListField = document.form.fieldAt(0) as PdfRadioButtonListField; // Sets the selected index field.selectedIndex = 2; + // Added tool tip + field.toolTip = 'Radio button'; // Save the document document.save('Output.pdf'); // Close the document @@ -547,6 +606,8 @@ This example demonstrates how to fill a list box field in a PDF document using t let field: PdfListBoxField = document.form.fieldAt(2) as PdfListBoxField; // Sets the selected index field.selectedIndex = 2; + // Added tool tip + field.toolTip = 'ListBox Fields'; // Save the document document.save('Output.pdf'); // Close the document @@ -572,6 +633,8 @@ This example demonstrates how to fill a check box field in a PDF document using let field: PdfCheckBoxField = document.form.fieldAt(2) as PdfCheckBoxField; // Sets the tooltip value field.toolTip = 'Checked'; + // Added tool tip + field.toolTip = 'CheckBox Fields'; // Save the document document.save('Output.pdf'); // Close the document @@ -592,30 +655,14 @@ This example demonstrates how to fill a signature field in a PDF document using // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); - // Gets the first page of the document + // Access the first page let page: PdfPage = document.getPage(0); - // Access the PDF form - let form: PdfForm = document.form; - // Create a new signature field - let field: PdfSignatureField = new PdfSignatureField(page, 'Signature', { x: 10, y: 10, width: 100, height: 50 }); - // Define a callback function used for external signing - const externalSignatureCallback = (data: Uint8Array, - options: { - algorithm: DigestAlgorithm, - cryptographicStandard: CryptographicStandard, - }): {signedData: Uint8Array, timestampData?: Uint8Array} => { - // Implement external signing logic here - return new Uint8Array(); // Placeholder return - }; - // Create a new signature using external signing - const signature: PdfSignature = PdfSignature.create(externalSignatureCallback, { - cryptographicStandard: CryptographicStandard.cms, - algorithm: DigestAlgorithm.sha256 - }); - // Sets the signature to the field - field.setSignature(signature); - // Add the field into PDF form - form.add(field); + // Access checkbox field + let field: PdfSignatureField = document.form.fieldAt(2) as PdfSignatureField; + // // Set custom value + field.setValue('Author', 'John'); + // Added tool tip + field.toolTip = 'CheckBox Fields'; // Save the document document.save('Output.pdf'); // Close the document diff --git a/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md index 823af6b3b..6f7577f96 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md +++ b/Document-Processing/PDF/PDF-Library/javascript/HyperLinks.md @@ -19,9 +19,9 @@ This example demonstrates how to create a web link annotation in a PDF document import { PdfDocument, PdfPage, PdfStringFormat, PdfStandardFont, PdfFontFamily, Size, PdfTextWebLinkAnnotation, PdfFontStyle } from '@syncfusion/ej2-pdf'; // Load an existing PDF document - let document: PdfDocument = new PdfDocument(data, password); + let document: PdfDocument = new PdfDocument(); // Access the first page - let page: PdfPage = document.getPage(0); + let page: PdfPage = document.addPage(); // Create a new PDF string format const format: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.left, PdfVerticalAlignment.top); // Create a new standard font @@ -76,7 +76,7 @@ This example demonstrates how to create internal navigation within a PDF documen {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import { PdfDocument, PdfPage, PdfStringFormat, PdfStandardFont, Size, PdfTextWebLinkAnnotation, PdfDestination } from '@syncfusion/ej2-pdf'; + import { PdfDocument, PdfPage, PdfStringFormat, PdfStandardFont, Size, PdfDocumentLinkAnnotation, PdfDestination, PdfDestinationMode } from '@syncfusion/ej2-pdf'; // Create a new PDF document let document: PdfDocument = new PdfDocument(); @@ -89,7 +89,7 @@ This example demonstrates how to create internal navigation within a PDF documen // Get the text size let size: Size = font.measureString('Syncfusion'); // Create a new text web link annotation - let annotation: PdfTextWebLinkAnnotation = new PdfTextWebLinkAnnotation({x: 50, y: 40, width: size.width, height: size.height}, {r: 0, g: 0, b: 0}, {r: 165, g: 42, b: 42}, 1); + let annotation: PdfDocumentLinkAnnotation = new PdfDocumentLinkAnnotation({x: 50, y: 40, width: size.width, height: size.height}, {r: 0, g: 0, b: 0}, {r: 165, g: 42, b: 42}, 1); // Initializes a new instance of the `PdfDestination` class. let destination: PdfDestination = new PdfDestination(); // Sets the zoom factor. @@ -112,7 +112,7 @@ This example demonstrates how to create internal navigation within a PDF documen {% endhighlight %} {% endtabs %} -The following code snippet demonstrates how to add internal document navigation to a web link annotation in an existing PDF document. +The following code snippet demonstrates how to add internal document navigation to a link annotation in an existing PDF document. {% tabs %} {% highlight c# tabtitle="TypeScript" %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Images.md b/Document-Processing/PDF/PDF-Library/javascript/Images.md index 95b92c0c0..bb0406515 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Images.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Images.md @@ -42,7 +42,7 @@ This example demonstrates how to add an image to a PDF document using the `PdfBi // Load the image let image: PdfImage = new PdfBitmap('/9j/4AAQSkZJRgABAQEAkACQAAD/4....QB//Z'); // Draw the image. - image.draw(graphics, {x: 10, y: 10}); + image.draw(graphics, {x: 10, y: 10}); // Save the document document.save('Output.pdf'); // Close the document @@ -69,7 +69,7 @@ This example demonstrates how to insert an image into an existing PDF document u // Load the image let image: PdfImage = new PdfBitmap('/9j/4AAQSkZJRgABAQEAkACQAAD/4....QB//Z'); // Draw the image. - image.draw(graphics, {x: 10, y: 10}); + image.draw(graphics, {x: 10, y: 10}); // Save the document document.save('Output.pdf'); // Close the document diff --git a/Document-Processing/PDF/PDF-Library/javascript/Layers.md b/Document-Processing/PDF/PDF-Library/javascript/Layers.md index 21bdeae0d..63664f6c2 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Layers.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Layers.md @@ -93,11 +93,10 @@ let layers = document.layers; let layer = layers.add('Layer1'); // Create graphics for 'Layer1' let graphics = layer.createGraphics(page); -// Add two child layers -let childLayer1 = layer.layers.add('ChildLayer1'); -let childLayer2 = layer.layers.add('ChildLayer2'); +// Add one child layers +let childLayer1 = layer.layers.add('ChildLayer2'); // Create graphics for 'ChildLayer2' -graphics = childLayer2.createGraphics(page); +graphics = childLayer1.createGraphics(page); // Apply translation transform graphics.translateTransform({ x: 100, y: 60 }); // Create a black pen @@ -108,7 +107,6 @@ graphics.drawLine(pen, { x: 200, y: 10 }, { x: 300, y: 100 }); document.save('Output.pdf'); document.destroy(); - {% endhighlight %} {% endtabs %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Lists.md b/Document-Processing/PDF/PDF-Library/javascript/Lists.md index cdb3c6900..ec01a5871 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Lists.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Lists.md @@ -17,20 +17,45 @@ This example demonstrates how to create an ordered list in a PDF document using {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import { PdfDocument, PdfPage, PdfList, PdfOrderedList, PdfListItemCollection } from '@syncfusion/ej2-pdf'; - - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a page - let page: PdfPage = document.addPage(); - // Create an ordered list instance - let list: PdfList = new PdfOrderedList(new PdfListItemCollection(['PDF', 'XlsIO', 'DocIO', 'PPT'])); - // draw the list - list.draw(page, {x: 50, y: 50}); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); +import { PdfDocument, PdfPage, PdfList, PdfStandardFont, PdfBrush, PdfStringFormat, PdfPen, PdfNumberStyle, PdfOrderedList, PdfListItemCollection } from '@syncfusion/ej2-pdf'; + +// Load an existing document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Assign the array of string items +let products: string[] = ['Excel', 'Power', 'Point', 'Word', 'PDF']; +// Create a new font for list +let itemFont: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); +// Create a new brush for list +let itemBrush: PdfBrush = new PdfBrush({ r: 0, g: 255, b: 255 }); +// Create a new format for list +let itemFormat: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.center); +// Create a new pen for list +let itemPen: PdfPen = new PdfPen({ r: 0, g: 255, b: 0 }, 1); +// Initialize a PdfNumberStyle for items +let itemStyle: PdfNumberStyle = PdfNumberStyle.numeric; +// Initialize a delimiter for the items +let itemDelimiter: string = ')'; +// Add the items to list item collection by passing the array of products +let items: PdfListItemCollection = new PdfListItemCollection(products); +// Initialize the instance of ordered list and pass the item collection and optional settings +let list: PdfOrderedList = new PdfOrderedList(items, { + font: itemFont, + format: itemFormat, + pen: itemPen, + brush: itemBrush, + indent: 30, + textIndent: 50, + style: itemStyle, + delimiter: itemDelimiter +}); +// Draw the ordered list on the page +list.draw(page, { x: 0, y: 20, width: 500, height: 700 }); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} @@ -42,53 +67,45 @@ This example demonstrates how to create an unordered list in a PDF document usin {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import { PdfDocument, PdfPage, PdfList, PdfUnorderedList, PdfListItemCollection } from '@syncfusion/ej2-pdf'; - - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a page - let page: PdfPage = document.addPage(); - // Create an unordered list instance - let subList: PdfList = new PdfUnorderedList(new PdfListItemCollection(['PDF.Base', 'PDF.Portable', 'Flutter', 'JavaScript'])); - // draw the unorder list - subList.draw(page, {x: 50, y: 50}); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); - -{% endhighlight %} -{% endtabs %} - -## Adding a sub list - -This example demonstrates how to add a sublist within a parent list in a PDF document using the `PdfOrderedList` classes. Sub lists allow you to create hierarchical list structures, improving content organization and readability by nesting related items under a main list item. - -{% tabs %} -{% highlight c# tabtitle="TypeScript" %} - - import { PdfDocument, PdfPage, PdfList, PdfOrderedList, PdfListItemCollection } from '@syncfusion/ej2-pdf'; - - // Create a new PDF document - let document: PdfDocument = new PdfDocument(); - // Add a page - let page: PdfPage = document.addPage(); - // Create a parent ordered list - let mainList: PdfOrderedList = new PdfOrderedList(); - mainList.items.add('Chapter 1: Introduction'); - mainList.items.add('Chapter 2: Working with Lists'); - // Create a sublist (unordered) with related items - let subList: PdfUnorderedList = new PdfUnorderedList( - new PdfListItemCollection(['PDF.Base', 'PDF.Portable', 'Flutter', 'JavaScript']) - ); - // Add the sublist under the second item of the main list - mainList.items.getItem(1).subList = subList; - // Draw the main list (with sublist) on the page - mainList.draw(page, { x: 50, y: 50 }); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); +import { PdfDocument, PdfPage, PdfList, PdfStandardFont, PdfBrush, PdfStringFormat, PdfPen, PdfNumberStyle, PdfUnorderedListStyle, PdfListItemCollection } from '@syncfusion/ej2-pdf'; + +// Load the existing document +let document: PdfDocument = new PdfDocument(data, password); +// Access the first page +let page: PdfPage = document.getPage(0); +// Define the items in the unordered list +let products: string[] = ['Excel', 'Power', 'Point', 'Word', 'PDF']; +// Create a new font for list +let itemFont: PdfStandardFont = new PdfStandardFont(PdfFontFamily.helvetica, 10); +// Create a new brush for list +let itemBrush: PdfBrush = new PdfBrush({ r: 0, g: 255, b: 255 }); +// Create a new format for list +let itemFormat: PdfStringFormat = new PdfStringFormat(PdfTextAlignment.center); +// Create a new pen for list +let itemPen: PdfPen = new PdfPen({ r: 0, g: 255, b: 0 }, 1); +// Initialise a PdfUnorderedListStyle +let itemStyle: PdfUnorderedListStyle = PdfUnorderedListStyle.square; +// Initialize a delimiter for the items +let itemDelimiter: string = ')'; +// Add the items to list item collection by passing the array of products +let items: PdfListItemCollection = new PdfListItemCollection(products); +// Initialize the instance of the unordered list and pass the list item collection and settings +let list: PdfUnorderedList = new PdfUnorderedList(items, { + font: itemFont, + format: itemFormat, + pen: itemPen, + brush: itemBrush, + indent: 30, + textIndent: 50, + style: itemStyle, + delimiter: itemDelimiter +}); +// Draw the unordered list on the page +list.draw(page, { x: 0, y: 20, width: 500, height: 700 }); +// Save the document +document.save('output.pdf'); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} \ No newline at end of file diff --git a/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md index 337357b9f..56cd40327 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md +++ b/Document-Processing/PDF/PDF-Library/javascript/PDF-pages.md @@ -149,8 +149,8 @@ This example demonstrates how to import pages from an existing PDF document into // Load an existing PDF document let document: PdfDocument = new PdfDocument(data, password); // Define start and end page indices - const startIndex = 0; - const endIndex = document.pageCount - 1; + let startIndex = 0; + let endIndex = document.pageCount - 1; // Import all pages from the loaded document into the new document document.importPageRange(document, startIndex, endIndex); // Save the new document diff --git a/Document-Processing/PDF/PDF-Library/javascript/Redaction.md b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md index 7cca2bcb8..e8000932b 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Redaction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Redaction.md @@ -16,20 +16,27 @@ Redaction permanently removes confidential or sensitive information from a PDF. {% tabs %} {% highlight c# tabtitle="TypeScript" %} - import { PdfDocument, PdfPage, PdfRedactionAnnotation } from '@syncfusion/ej2-pdf'; - - // Load an existing PDF document - let document: PdfDocument = new PdfDocument(data, password); - // Access the first page - let page: PdfPage = document.getPage(0); - // Create a new redaction annotation - const annotation: PdfRedactionAnnotation = new PdfRedactionAnnotation ({x: 50, y: 100, width: 100, height: 50}); - // Add annotation to the page - page.annotations.add(annotation); - // Save the document - document.save('Output.pdf'); - // Close the document - document.destroy(); +import { PdfDocument, PdfPage, PdfRedactionAnnotation } from '@syncfusion/ej2-pdf'; + +// Load an existing PDF document +let document: PdfDocument = new PdfDocument(data, password); +// Get the first page +let page: PdfPage = document.getPage(0) as PdfPage; +// Create a new redaction annotation +const annot: PdfRedactionAnnotation = new PdfRedactionAnnotation( + { x: 100, y: 100, width: 100, height: 100 }, + { + borderColor: { r: 255, g: 0, b: 0 }, + repeatText: true, + font: document.embedFont(PdfFontFamily.helvetica, 10, PdfFontStyle.regular), + textColor: { r: 0, g: 0, b: 0 }, + appearanceFillColor: { r: 255, g: 255, b: 255 } + } +); +// Add annotation to the page +page.annotations.add(annot); +// Destroy the document +document.destroy(); {% endhighlight %} {% endtabs %} diff --git a/Document-Processing/PDF/PDF-Library/javascript/Templates.md b/Document-Processing/PDF/PDF-Library/javascript/Templates.md index 7587ad92a..e33d2fef8 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Templates.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Templates.md @@ -23,7 +23,7 @@ This example demonstrates how to create a new PDF template using the `PdfTemplat // Add a page let page: PdfPage = document.addPage(); // Create a new rubber stamp annotation - const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation ({x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation ({x: 50, y: 100, width: 100, height: 50}); // Get the normal appearance of the annotation let normalAppearance: PdfTemplate = annotation.appearance.normal; // Create new image object by using JPEG image data as Base64 string format @@ -54,7 +54,7 @@ This example demonstrates how to create templates from an existing PDF document // Get the first page let page: PdfPage = document.getPage(0) as PdfPage; // Create a new rubber stamp annotation - const annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation ({x: 50, y: 100, width: 100, height: 50}); + let annotation: PdfRubberStampAnnotation = new PdfRubberStampAnnotation ({x: 50, y: 100, width: 100, height: 50}); // Get the normal appearance of the annotation let normalAppearance: PdfTemplate = annotation.appearance.normal; // Create new image object by using JPEG image data as Base64 string format diff --git a/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md index 91bd0e31f..c4e459ed7 100644 --- a/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md +++ b/Document-Processing/PDF/PDF-Library/javascript/Text-Extraction.md @@ -32,6 +32,29 @@ This example demonstrates how to extract text from a PDF page using the `PdfData {% endhighlight %} {% endtabs %} +## Extract Text from Specific Page Range in a PDF Document + +This example demonstrates how to extract text from a PDF document by specifying a start and end page number. This approach allows you to retrieve text content from a defined range of pages for processing or analysis. + +{% tabs %} +{% highlight c# tabtitle="TypeScript" %} + + import { PdfDocument, string, PdfDataExtractor } from '@syncfusion/ej2-pdf'; + + // Load an existing PDF document + let document: PdfDocument = new PdfDocument(data, password); + // Initialize a new instance of the `PdfDataExtractor` class + let extractor: PdfDataExtractor = new PdfDataExtractor(document); + // Extract text content from the PDF document. + let text: string = extractor.extractText({ startPageIndex: 0, endPageIndex: document.pageCount - 1 }); + // Save the document + document.save('Output.pdf'); + // Close the document + document.destroy(); + +{% endhighlight %} +{% endtabs %} + ## Working with layout based text extraction This example demonstrates how to extract text from a PDF page using the `PdfDataExtractor` class with layout-based options. @@ -73,7 +96,7 @@ This example demonstrates how to extract text from a PDF page based on individua // Initialize a new instance of the `PdfDataExtractor` class let extractor: PdfDataExtractor = new PdfDataExtractor(document); // Extracts text from the PDF Page based on its line - let textCollection: TextLine[] = extractor.extractTextLines({ startPageIndex: 0, endPageIndex: 0 }); + let textCollection: TextLine[] = extractor.extractTextLines({ startPageIndex: 0, endPageIndex: document.pageCount - 1}); // Save the document document.save('Output.pdf'); // Close the document @@ -106,10 +129,10 @@ This example demonstrates how to extract words from a PDF document using the `ex // Get the page corresponding to the current text line page = document.getPage(textCollection[i].pageIndex); // Retrieve all words from the current text line - const wordCollection: TextWord[] = textCollection[i].words; + let wordCollection: TextWord[] = textCollection[i].words; // Iterate through each word in the line for (let j: number = 0; j < wordCollection.length; j++) { - const word: TextWord = wordCollection[j]; + let word: TextWord = wordCollection[j]; if (word) { // Iterate through each glyph (character shape) in the word for (let k: number = 0; k < word.glyphs.length; k++) { @@ -158,10 +181,10 @@ This example demonstrates how to access individual characters from a PDF documen // Get the page corresponding to the current text line page = document.getPage(textCollection[i].pageIndex); // Retrieve all words from the current text line - const wordCollection: TextWord[] = textCollection[i].words; + let wordCollection: TextWord[] = textCollection[i].words; // Iterate through each word in the line for (let j: number = 0; j < wordCollection.length; j++) { - const word: TextWord = wordCollection[j]; + let word: TextWord = wordCollection[j]; if (word) { // Iterate through each glyph (character shape) in the word for (let k: number = 0; k < word.glyphs.length; k++) {