From 79600995cbf19d7a8339e792a9deeacb05b5b770 Mon Sep 17 00:00:00 2001 From: Balaji Loganathan Date: Tue, 10 Feb 2026 13:35:11 +0530 Subject: [PATCH 1/3] 1008844: Updated Getting Started documentation for angular platform --- .../getting-started-with-server-backed.md | 99 +++++++++-------- .../PDF/PDF-Viewer/angular/getting-started.md | 105 +++++++++++------- .../angular/images/getting-started-ai.png | Bin 0 -> 27405 bytes .../angular/images/getting-started-ssr.png | Bin 0 -> 7244 bytes .../angular/images/getting-started-styles.png | Bin 0 -> 18371 bytes .../src/{app.component.ts => app.ts} | 14 +-- .../angular/getting-started-cs1/src/main.ts | 6 +- 7 files changed, 121 insertions(+), 103 deletions(-) create mode 100644 Document-Processing/PDF/PDF-Viewer/angular/images/getting-started-ai.png create mode 100644 Document-Processing/PDF/PDF-Viewer/angular/images/getting-started-ssr.png create mode 100644 Document-Processing/PDF/PDF-Viewer/angular/images/getting-started-styles.png rename Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/{app.component.ts => app.ts} (77%) diff --git a/Document-Processing/PDF/PDF-Viewer/angular/getting-started-with-server-backed.md b/Document-Processing/PDF/PDF-Viewer/angular/getting-started-with-server-backed.md index 7a5663b81..3caac550a 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/getting-started-with-server-backed.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/getting-started-with-server-backed.md @@ -10,7 +10,13 @@ domainurl: ##DomainURL## # Getting started with Angular PDF Viewer (server-backed) -This guide explains how to create the PDF Viewer component and configure its features in Angular using the Essential JS 2 in server-backed mode. +This guide explains how to create the PDF Viewer component and configure its features in Angular 21 using the Essential JS 2 in server-backed mode. + +> Note: This guide supports **Angular 21** and other recent Angular versions. For detailed compatibility with other Angular versions, please refer to the [Angular version support matrix](https://ej2.syncfusion.com/angular/documentation/system-requirement#angular-version-compatibility). Starting from Angular 19, standalone components are the default, and this guide reflects that architecture. + +## Prerequisites + +Ensure your development environment meets the [System Requirements for Syncfusion® Angular UI Components](https://ej2.syncfusion.com/angular/documentation/system-requirement). ## Set up the development environment @@ -21,16 +27,51 @@ To install the latest Angular CLI globally use the following command. npm install -g @angular/cli ``` +> **Angular 21 Standalone Architecture:** Standalone components are the default in Angular 21. This guide uses the modern standalone architecture. If you need more information about the standalone architecture, refer to the [Standalone Guide](https://ej2.syncfusion.com/angular/documentation/getting-started/angular-standalone). + +### Installing a specific version + +To install a particular version of Angular CLI, use: + +```bash +npm install -g @angular/cli@21.0.0 +``` + ## Create an Angular application Start a new Angular application using the Angular CLI command as follows. ```bash ng new my-app +``` + +* This command will prompt you to configure settings like enabling Angular routing and choosing a stylesheet format. + +![Initial_setup](images/getting-started-styles.png) + +* By default, a CSS-based application is created. Use SCSS if required: + +```bash +ng new my-app --style=scss +``` + +* During project setup, when prompted for the Server-side rendering (SSR) option, choose the appropriate configuration. + +![Initial_setup](images/getting-started-ssr.png) + +* Select the required AI tool or 'none' if you do not need any AI tool. + +![Initial_setup](images/getting-started-ai.png) + +* Navigate to your newly created application directory: + +```bash cd my-app ``` -## Add Syncfusion JavaScript packages +> Note: In Angular 19 and below, it uses `app.component.ts`, `app.component.html`, `app.component.css` etc. In Angular 20+, the CLI generates a simpler structure with `src/app/app.ts`, `app.html`, and `app.css` (no `.component.` suffixes). + +## Installing Syncfusion® PDF Viewer package All the available Essential JS 2 packages are published in the [npmjs.com](https://www.npmjs.com/~syncfusionorg) public registry. To install PDF Viewer component, use the following command. @@ -56,33 +97,7 @@ Add the component CSS in the `~/src/styles.css` file, as shown below: ## Add the PDF Viewer component -Import PDF Viewer module into Angular application(app.module.ts) from the package `@syncfusion/ej2-angular-pdfviewer` [src/app/app.module.ts]. - -```typescript -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -// import the PdfViewer Module for the PDF Viewer component -import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, - MagnificationService, ThumbnailViewService, ToolbarService, - NavigationService, TextSearchService, TextSelectionService, - PrintService, FormDesignerService, FormFieldsService, - AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; -import { AppComponent } from './app.component'; - -@NgModule({ - //declaration of ej2-angular-pdfviewer module into NgModule - imports: [BrowserModule, PdfViewerModule], - declarations: [AppComponent], - bootstrap: [AppComponent], - providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, - ThumbnailViewService, ToolbarService, NavigationService, - TextSearchService, TextSelectionService, PrintService, - AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] -}) -export class AppModule { } -``` - -Add the Angular PDF Viewer by using `` selector in `template` section of the `src/app/app.component.ts` file to render the PDF Viewer component. +Add the Angular PDF Viewer by using `` selector in `template` section of the `src/app/app.ts` file to render the PDF Viewer component. ```typescript import { Component, OnInit } from '@angular/core'; @@ -102,12 +117,13 @@ import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, style="height:640px;display:block"> `, + imports: [ PdfViewerModule ], providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] }) -export class AppComponent implements OnInit { +export class App implements OnInit { public service = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'; public document: string = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; ngOnInit(): void { @@ -127,8 +143,8 @@ ng serve --open The output will appear as follows. {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} -{% include code-snippet/pdfviewer/angular/getting-started-cs1/src/app.component.ts %} +{% highlight ts tabtitle="app.ts" %} +{% include code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts %} {% endhighlight %} {% highlight ts tabtitle="main.ts" %} @@ -136,19 +152,6 @@ The output will appear as follows. {% endhighlight %} {% endtabs %} -N> If you are using an Angular version below 17, you need import the **AppModule** in the **main.ts** file - -```typescript - -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); - -``` {% previewsample "/document-processing/samples/pdfviewer/angular/getting-started-cs1" %} @@ -199,11 +202,11 @@ Inject modules using the `providers` property in `@NgModule`. dotnet run ``` -6. The PDF Viewer server instance runs at `https://localhost:5001`. Navigate to `https://localhost:5001/pdfviewer` to see the default GET response. Bind this URL to the `serviceUrl` property of the PDF Viewer as shown below. +6. The PDF Viewer server instance runs at `https://localhost:7255`. Navigate to `https://localhost:7255/pdfviewer` to see the default GET response. Bind this URL to the `serviceUrl` property of the PDF Viewer as shown below. ```javascript - export class AppComponent implements OnInit { - public service = 'https://localhost:5001/pdfviewer'; + export class App implements OnInit { + public service = 'https://localhost:7255/pdfviewer'; public document = 'PDF_Succinctly.pdf'; ngOnInit(): void { } diff --git a/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md b/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md index fc56dc6e8..d78e7bc08 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md @@ -10,13 +10,19 @@ domainurl: ##DomainURL## # Getting started with Angular Standalone PDF Viewer component -This section explains the steps required to create a simple Standalone Angular PDF Viewer and demonstrates the basic usage of the PDF Viewer control in an Angular CLI application. +This section explains the steps required to create a simple Standalone Angular PDF Viewer and demonstrates the basic usage of the PDF Viewer control in an Angular 21. -N> For Angular 17+, see the following links: +> Note: This guide supports **Angular 21** and other recent Angular versions. For detailed compatibility with other Angular versions, please refer to the [Angular version support matrix](https://ej2.syncfusion.com/angular/documentation/system-requirement#angular-version-compatibility). Starting from Angular 19, standalone components are the default, and this guide reflects that architecture. + +N> For older versions of Angular, see the following links: * [Create a Standalone PDF Viewer in Angular 17 and above with-no-standalone-flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-with-no-standalone-flag). * [Create a Standalone PDF Viewer in Angular 17 and above without --no-standalone flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-without-no-standalone-flag). +## Prerequisites + +Ensure your development environment meets the [System Requirements for Syncfusion® Angular UI Components](https://ej2.syncfusion.com/angular/documentation/system-requirement). + ## Setup Angular Environment You can use the [`Angular CLI`](https://github.com/angular/angular-cli) to setup your Angular applications. @@ -26,7 +32,15 @@ To install the latest Angular CLI globally use the following command. 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 +> **Angular 21 Standalone Architecture:** Standalone components are the default in Angular 21. This guide uses the modern standalone architecture. If you need more information about the standalone architecture, refer to the [Standalone Guide](https://ej2.syncfusion.com/angular/documentation/getting-started/angular-standalone). + +### Installing a specific version + +To install a particular version of Angular CLI, use: + +```bash +npm install -g @angular/cli@21.0.0 +``` ## Create an Angular Application @@ -34,9 +48,34 @@ Start a new Angular application using the Angular CLI command as follows. ```bash ng new my-app +``` + +* This command will prompt you to configure settings like enabling Angular routing and choosing a stylesheet format. + +![Initial_setup](images/getting-started-styles.png) + +* By default, a CSS-based application is created. Use SCSS if required: + +```bash +ng new my-app --style=scss +``` + +* During project setup, when prompted for the Server-side rendering (SSR) option, choose the appropriate configuration. + +![Initial_setup](images/getting-started-ssr.png) + +* Select the required AI tool or 'none' if you do not need any AI tool. + +![Initial_setup](images/getting-started-ai.png) + +* Navigate to your newly created application directory: + +```bash cd my-app ``` +> Note: In Angular 19 and below, it uses `app.component.ts`, `app.component.html`, `app.component.css` etc. In Angular 20+, the CLI generates a simpler structure with `src/app/app.ts`, `app.html`, and `app.css` (no `.component.` suffixes). + ## Installing Syncfusion® PDF Viewer package All the available Essential® JS 2 packages are published in `npmjs.com` registry. @@ -53,38 +92,10 @@ npm install @syncfusion/ej2-angular-pdfviewer --save cp -R ./node_modules/@syncfusion/ej2-pdfviewer/dist/ej2-pdfviewer-lib src/assets/ej2-pdfviewer-lib ``` -* Confirm that there is an 'ej2-pdfviewer-lib' directory within your public directory, housing the assets of the PDF Viewer library. +* Confirm that there is an 'ej2-pdfviewer-lib' directory within your `src/assets` directory, housing the assets of the PDF Viewer library. * Validate that your server has been configured to utilize the Content-Type: application/wasm MIME type. Additional information can be found in the [Troubleshooting](./troubleshooting/troubleshooting) section. -## Registering PDF Viewer Module - -Import PDF Viewer module into Angular application(app.module.ts) from the package `@syncfusion/ej2-angular-pdfviewer` [src/app/app.module.ts]. - -```typescript -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -// import the PdfViewer Module for the PDF Viewer component -import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, - MagnificationService, ThumbnailViewService, ToolbarService, - NavigationService, TextSearchService, TextSelectionService, - PrintService, FormDesignerService, FormFieldsService, - AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; -import { AppComponent } from './app.component'; - -@NgModule({ - //declaration of ej2-angular-pdfviewer module into NgModule - imports: [BrowserModule, PdfViewerModule], - declarations: [AppComponent], - bootstrap: [AppComponent], - providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, - ThumbnailViewService, ToolbarService, NavigationService, - TextSearchService, TextSelectionService, PrintService, - AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] -}) -export class AppModule { } -``` - ## Adding CSS reference Add the Angular PDF Viewer component's styles as given below in `src/styles.css` file. @@ -103,7 +114,7 @@ Add the Angular PDF Viewer component's styles as given below in `src/styles.css` ## Add the PDF Viewer component -Add the Angular PDF Viewer by using `` selector in `template` section of the `src/app/app.component.ts` file to render the PDF Viewer component. +Add the Angular PDF Viewer by using `` selector in `template` section of the `src/app/app.ts` file to render the PDF Viewer component. ```typescript import { Component, OnInit } from '@angular/core'; @@ -123,12 +134,13 @@ import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, style="height:640px;display:block"> `, + imports: [ PdfViewerModule ], providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] }) -export class AppComponent implements OnInit { +export class App implements OnInit { public document: string = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; public resource: string = "https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; ngOnInit(): void { @@ -142,7 +154,14 @@ To configure the PDF Viewer to use local files for `documentPath` and `resourceU **Step 1:** Ensure that your application includes the `ej2-pdfviewer-lib` folder. This folder must contain the `pdfium.js`, `pdfium.wasm` files, and the PDF file that you intend to display. These should be located in the `assets` directory within your project's `src` folder. -**Step 2:** Assign local file paths to the `documentPath` and `resourceUrl` properties within the PDF Viewer setup. The `documentPath` should refer to your PDF file, while the `resourceUrl` should point to the directory containing the supporting resources. +**Step 2:** Register the assets folder inside `angular.json` +```json +"assets": [ + "src/assets" +] +``` + +**Step 3:** Assign local file paths to the `documentPath` and `resourceUrl` properties within the PDF Viewer setup. The `documentPath` should refer to your PDF file, while the `resourceUrl` should point to the directory containing the supporting resources. By following these steps, you will configure your PDF Viewer to load the required resources locally. See the code snippet below for reference. @@ -180,7 +199,7 @@ import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; @Component({ - selector: 'app-container', + selector: 'app-root', // specifies the template string for the PDF Viewer component template: `
`, + imports: [ PdfViewerModule ], providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] }) -export class AppComponent implements OnInit { +export class App implements OnInit { public document = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; public resource: string = "https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; ngOnInit(): void { @@ -204,13 +224,12 @@ export class AppComponent implements OnInit { {% endhighlight %} {% highlight ts tabtitle="main.ts" %} -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); {% endhighlight %} {% endtabs %} diff --git a/Document-Processing/PDF/PDF-Viewer/angular/images/getting-started-ai.png b/Document-Processing/PDF/PDF-Viewer/angular/images/getting-started-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..19655fb2b63fd91d3dbdd4fadd77c300e3a180ab GIT binary patch literal 27405 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

P{?}hoHoeR0Twc9>bJO*@it=51?TeYzV8mtbo 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 literal 0 HcmV?d00001 diff --git a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.component.ts b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts similarity index 77% rename from Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.component.ts rename to Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts index 265b7a3f5..db9c06246 100644 --- a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.component.ts +++ b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts @@ -1,15 +1,11 @@ -import { BrowserModule } from '@angular/platform-browser' -import { NgModule } from '@angular/core' import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService,AnnotationService, TextSearchService, TextSelectionService, PrintService,FormDesignerService, FormFieldsService, PageOrganizerService} from '@syncfusion/ej2-angular-pdfviewer' - - import { Component, OnInit } from '@angular/core'; @Component({ -imports: [ PdfViewerModule ], -standalone: true, - selector: 'app-container', + imports: [ PdfViewerModule ], + standalone: true, + selector: 'app-root', // specifies the template string for the PDF Viewer component template: `

console.error(err)); \ No newline at end of file +import { appConfig } from './app/app.config'; +import { App } from './app/app'; +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); \ No newline at end of file From a254d9222b0071f5710b40ee20ea8bc73a43977c Mon Sep 17 00:00:00 2001 From: Balaji Loganathan Date: Tue, 10 Feb 2026 17:57:37 +0530 Subject: [PATCH 2/3] 1008844: Removed .component suffixes in html, ts and css file references --- .../angular/annotation/annotation-event.md | 110 +++---- .../annotation/line-angle-constraints.md | 4 +- .../PDF/PDF-Viewer/angular/events.md | 294 +++++++++--------- .../PDF/PDF-Viewer/angular/getting-started.md | 4 +- .../angular/how-to/add-header-value.md | 4 +- .../angular/how-to/annotation-selectors.md | 4 +- ...e-author-name-using-annotation-settings.md | 48 +-- .../angular/how-to/change-selection-border.md | 2 +- ...17-and-above-without-no-standalone-flag.md | 4 +- .../angular/how-to/custom-context-menu.md | 6 +- .../load-document-after-resources-loaded.md | 8 +- .../interactive-pdf-navigation/bookmark.md | 8 +- .../angular/open-pdf-file/from-amazon-s3.md | 2 +- .../open-pdf-file/from-azure-blob-storage.md | 2 +- .../PDF/PDF-Viewer/angular/overview.md | 2 +- .../angular/save-pdf-file/to-amazon-s3.md | 2 +- .../save-pdf-file/to-azure-blob-storage.md | 2 +- .../to-dropbox-cloud-file-storage.md | 2 +- .../toolbar-customization/custom-toolbar.md | 6 +- .../PDF/PDF-Viewer/angular/toolbar.md | 2 +- .../src/{app.component.ts => app.ts} | 0 .../angular/custom-context-menu/src/main.ts | 2 +- .../angular/getting-started-cs1/src/app.ts | 2 +- .../angular/getting-started-cs1/src/main.ts | 4 +- 24 files changed, 250 insertions(+), 274 deletions(-) rename Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/{app.component.ts => app.ts} (100%) diff --git a/Document-Processing/PDF/PDF-Viewer/angular/annotation/annotation-event.md b/Document-Processing/PDF/PDF-Viewer/angular/annotation/annotation-event.md index 26f0352cb..af873f3e1 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/annotation/annotation-event.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/annotation/annotation-event.md @@ -56,7 +56,7 @@ The following example illustrates how to handle the `annotationAdd` event.
``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewEncapsulation, OnInit, ViewChild } from '@angular/core'; import { PdfViewerComponent, @@ -79,7 +79,7 @@ import { @Component({ selector: 'app-root', - templateUrl: 'app.component.html', + templateUrl: 'app.html', encapsulation: ViewEncapsulation.None, providers: [ LinkAnnotationService, @@ -96,7 +96,7 @@ import { FormDesignerService, PageOrganizerService, ], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [PdfViewerModule], }) @@ -145,7 +145,7 @@ The following example illustrates how to handle the `annotationDoubleClick` even ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewEncapsulation, OnInit, ViewChild } from '@angular/core'; import { PdfViewerComponent, @@ -168,7 +168,7 @@ import { @Component({ selector: 'app-root', - templateUrl: 'app.component.html', + templateUrl: 'app.html', encapsulation: ViewEncapsulation.None, providers: [ LinkAnnotationService, @@ -185,7 +185,7 @@ import { FormDesignerService, PageOrganizerService, ], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [PdfViewerModule], }) @@ -214,7 +214,7 @@ export class AppComponent { The [annotationDoubleClick](https://ej2.syncfusion.com/angular/documentation/api/pdfviewer/annotationDoubleClickArgs/) event is triggered when an annotation is double-clicked. {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} {% endhighlight %} {% endtabs %} @@ -243,7 +243,7 @@ The following example illustrates how to handle the `annotationMouseLeave` event ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewEncapsulation, OnInit, ViewChild } from '@angular/core'; import { PdfViewerComponent, @@ -265,7 +265,7 @@ import { @Component({ selector: 'app-root', - templateUrl: 'app.component.html', + templateUrl: 'app.html', encapsulation: ViewEncapsulation.None, providers: [ @@ -283,7 +283,7 @@ import { FormDesignerService, PageOrganizerService, ], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [PdfViewerModule], }) @@ -333,7 +333,7 @@ The following example illustrates how to handle the `annotationMouseover` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -354,9 +354,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -416,7 +416,7 @@ The following example illustrates how to handle the `annotationMove` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -437,9 +437,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -499,7 +499,7 @@ The following example illustrates how to handle the `annotationMoving` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -520,9 +520,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -582,7 +582,7 @@ The following example illustrates how to handle the `annotationPropertiesChange` ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -603,9 +603,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -667,7 +667,7 @@ The following example illustrates how to handle the `annotationRemove` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -688,9 +688,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -750,7 +750,7 @@ The following example illustrates how to handle the `annotationResize` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -771,9 +771,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -833,7 +833,7 @@ The following example illustrates how to handle the `annotationSelect` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { @@ -854,9 +854,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -916,7 +916,7 @@ The following example illustrates how to handle the `annotationUnselect` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -936,9 +936,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -997,7 +997,7 @@ The following example illustrates how to handle the `beforeAddFreeText` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1017,9 +1017,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1083,7 +1083,7 @@ The following example illustrates how to handle the `addSignature` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1103,9 +1103,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1163,7 +1163,7 @@ The following example illustrates how to handle the `removeSignature` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1183,9 +1183,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1244,7 +1244,7 @@ The following example illustrates how to handle the `resizeSignature` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1264,9 +1264,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1324,7 +1324,7 @@ The following example illustrates how to handle the `signaturePropertiesChange` ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1344,9 +1344,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1405,7 +1405,7 @@ The following example illustrates how to handle the `signatureSelect` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1425,9 +1425,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, @@ -1487,7 +1487,7 @@ The following example illustrates how to handle the `signatureUnselect` event. ``` {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} +{% highlight ts tabtitle="app.ts" %} import { Component, ViewChild, ViewEncapsulation, OnInit } from '@angular/core'; import { PdfViewerComponent, @@ -1507,9 +1507,9 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', encapsulation: ViewEncapsulation.None, - styleUrls: ['./app.component.css'], + styleUrls: ['./app.css'], providers: [ ToolbarService, MagnificationService, diff --git a/Document-Processing/PDF/PDF-Viewer/angular/annotation/line-angle-constraints.md b/Document-Processing/PDF/PDF-Viewer/angular/annotation/line-angle-constraints.md index f3fbc5986..7791e2868 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/annotation/line-angle-constraints.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/annotation/line-angle-constraints.md @@ -49,12 +49,12 @@ import { ClickEventArgs } from '@syncfusion/ej2-buttons'; */ @Component({ selector: 'app-root', - templateUrl: 'app.component.html', + templateUrl: 'app.html', encapsulation: ViewEncapsulation.None, // tslint:disable-next-line:max-line-length providers: [LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, AnnotationService, FormFieldsService, FormDesignerService,PageOrganizerService], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [ diff --git a/Document-Processing/PDF/PDF-Viewer/angular/events.md b/Document-Processing/PDF/PDF-Viewer/angular/events.md index 8dd049f3a..e863ccf15 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/events.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/events.md @@ -77,7 +77,7 @@ The [bookmarkClick](https://ej2.syncfusion.com/angular/documentation/api/pdfview Example: ```ts -// app.component.ts +// app.ts import { Component } from '@angular/core'; import { ToolbarService, @@ -95,7 +95,7 @@ import { @Component({ selector: 'app-root', - templateUrl: './app.component.html', + templateUrl: './app.html', providers: [ ToolbarService, MagnificationService, @@ -121,7 +121,7 @@ export class AppComponent { ``` ```html - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, - styleUrl: './app.component.css', + styleUrl: './app.css', providers: [LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, @@ -143,7 +143,7 @@ import { style="height:640px;display:block"> `, - styleUrl: './app.component.css', + styleUrl: './app.css', providers: [LinkAnnotationService, BookmarkViewService, MagnificationService, ThumbnailViewService, ToolbarService, NavigationService, TextSearchService, TextSelectionService, PrintService, diff --git a/Document-Processing/PDF/PDF-Viewer/angular/how-to/custom-context-menu.md b/Document-Processing/PDF/PDF-Viewer/angular/how-to/custom-context-menu.md index a9fb0ed93..26ea3e985 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/how-to/custom-context-menu.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/how-to/custom-context-menu.md @@ -213,8 +213,8 @@ export class CustomContextMenuComponent implements OnInit { The following is the output of the custom context menu with customization. {% tabs %} -{% highlight ts tabtitle="app.component.ts" %} -{% include code-snippet/pdfviewer/angular/custom-context-menu/src/app.component.ts %} +{% highlight ts tabtitle="app.ts" %} +{% include code-snippet/pdfviewer/angular/custom-context-menu/src/app.ts %} {% endhighlight %} {% highlight ts tabtitle="main.ts" %} @@ -223,7 +223,7 @@ The following is the output of the custom context menu with customization. {% endtabs %} N> To set up the **server-backed PDF Viewer**, -Add the below serviceUrl in the `app.component.ts` file +Add the below serviceUrl in the `app.ts` file `public service: string = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'`; Within the template, configure the PDF Viewer by adding the `[serviceUrl]='service'` attribute inside the div element. diff --git a/Document-Processing/PDF/PDF-Viewer/angular/how-to/load-document-after-resources-loaded.md b/Document-Processing/PDF/PDF-Viewer/angular/how-to/load-document-after-resources-loaded.md index 02eb84fa8..96b31372e 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/how-to/load-document-after-resources-loaded.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/how-to/load-document-after-resources-loaded.md @@ -22,7 +22,7 @@ The `resourcesLoaded` event fires once the viewer finishes loading all required - Listen to `(resourcesLoaded)` and call `load` inside the handler. ```html - +
@@ -73,7 +73,7 @@ import { FormDesignerService, PageOrganizerService, ], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [PdfViewerModule], @@ -118,7 +118,7 @@ import { */ @Component({ selector: 'app-root', - // templateUrl: 'app.component.html', + // templateUrl: 'app.html', template: `
@@ -152,7 +152,7 @@ import { FormDesignerService, PageOrganizerService, ], - styleUrls: ['app.component.css'], + styleUrls: ['app.css'], standalone: true, imports: [PdfViewerModule], diff --git a/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-amazon-s3.md index bb4d7edd7..1b0d9faf3 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-amazon-s3.md @@ -20,7 +20,7 @@ Follow these steps to load a PDF from AWS S3 in the standalone PDF Viewer. Follow the instructions in the getting started guide (Angular) to create a basic PDF Viewer sample: [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) -**Step 2:** Modify the `src/app/app.component.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` File in the Angular Project 1. Import the required namespaces at the top of the file: diff --git a/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-azure-blob-storage.md index 960ea9900..da4a70307 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/open-pdf-file/from-azure-blob-storage.md @@ -20,7 +20,7 @@ Follow these steps to load a PDF from Azure Blob Storage in the standalone PDF V Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) to create a simple PDF Viewer sample in Angular. This will give you a basic setup of the PDF Viewer component. -**Step 2:** Modify the `src/app/app.component.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` File in the Angular Project 1. Add the following private properties to the `AppComponent` class, and assign the values from the configuration to the corresponding properties diff --git a/Document-Processing/PDF/PDF-Viewer/angular/overview.md b/Document-Processing/PDF/PDF-Viewer/angular/overview.md index 330dc3698..58480e41f 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/overview.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/overview.md @@ -60,7 +60,7 @@ Add CSS references needed for a PDF Viewer in `src/styles.css` from the `../node ``` ### Add PDF Viewer component -In `src/app/app.component.ts``, use selector in the template attribute of the @Component directive to render the Syncfusion Angular PDF Viewer component. +In `src/app/app.ts``, use selector in the template attribute of the @Component directive to render the Syncfusion Angular PDF Viewer component. ``` import { Component, OnInit } from '@angular/core'; diff --git a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-amazon-s3.md b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-amazon-s3.md index 5f6c06f32..693b2bd15 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-amazon-s3.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-amazon-s3.md @@ -20,7 +20,7 @@ To save a PDF file to AWS S3, you can follow the steps below Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) to create a simple PDF Viewer sample in TypeScript. This will set up the basic structure of your PDF Viewer application. -**Step 2:** Modify the `src/app/app.component.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` File in the Angular Project 1. Import the required namespaces at the top of the file: diff --git a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-azure-blob-storage.md b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-azure-blob-storage.md index dc1d092f6..f2178fe9e 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-azure-blob-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-azure-blob-storage.md @@ -20,7 +20,7 @@ To save a PDF file to Azure Blob Storage, follow these steps: Start by following the steps provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) to create a simple PDF viewer sample in Angular. This will give you a basic setup of the PDF viewer component. -**Step 2:** Modify the `src/app/app.component.ts` File in the Angular Project +**Step 2:** Modify the `src/app/app.ts` File in the Angular Project 1. Import the required namespaces at the top of the file: diff --git a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-dropbox-cloud-file-storage.md b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-dropbox-cloud-file-storage.md index 9de013a2d..c5f6e6080 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-dropbox-cloud-file-storage.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/save-pdf-file/to-dropbox-cloud-file-storage.md @@ -24,7 +24,7 @@ To create a Dropbox API App, you should follow the official documentation provid Follow the instructions provided in this [link](https://help.syncfusion.com/document-processing/pdf/pdf-viewer/angular/getting-started) to create a simple PDF Viewer sample in Angular. This sets up the basic structure of the PDF Viewer application. -**Step 3:** Modify the `src/app/app.component.ts` file in the Angular project +**Step 3:** Modify the `src/app/app.ts` file in the Angular project 1. Import the required namespaces at the top of the file: diff --git a/Document-Processing/PDF/PDF-Viewer/angular/toolbar-customization/custom-toolbar.md b/Document-Processing/PDF/PDF-Viewer/angular/toolbar-customization/custom-toolbar.md index b537c459c..d24847df8 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/toolbar-customization/custom-toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/toolbar-customization/custom-toolbar.md @@ -79,7 +79,7 @@ Hide the default toolbar using `enableToolbar` and `enableThumbnail` properties: {% highlight ts tabtitle="Standalone" %} {% raw %} - + + The icons are embedded in the font file used in the previous code snippet. -**Step 7:** Add the following code snippet in `app.component.ts` file for performing a user interaction in PDF Viewer in code behind. +**Step 7:** Add the following code snippet in `app.ts` file for performing a user interaction in PDF Viewer in code behind. {% tabs %} {% highlight js tabtitle="Standalone" %} diff --git a/Document-Processing/PDF/PDF-Viewer/angular/toolbar.md b/Document-Processing/PDF/PDF-Viewer/angular/toolbar.md index c06d75c53..9b2cee1cd 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/toolbar.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/toolbar.md @@ -684,7 +684,7 @@ The PDF Viewer provides API for user interactions options provided in its built- >The icons are embedded in the font file used in the previous code snippet. -**Step 5:** Add the following code snippet in `app.component.ts` file for performing a user interaction in PDF Viewer in code behind. +**Step 5:** Add the following code snippet in `app.ts` file for performing a user interaction in PDF Viewer in code behind. {% tabs %} {% highlight js tabtitle="Standalone" %} diff --git a/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/app.component.ts b/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/app.ts similarity index 100% rename from Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/app.component.ts rename to Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/app.ts diff --git a/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/main.ts b/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/main.ts index 3607237bd..37a1e9c19 100644 --- a/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/main.ts +++ b/Document-Processing/code-snippet/pdfviewer/angular/custom-context-menu/src/main.ts @@ -1,4 +1,4 @@ import { bootstrapApplication } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; +import { AppComponent } from './app'; import 'zone.js'; bootstrapApplication(AppComponent).catch((err) => console.error(err)); \ No newline at end of file diff --git a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts index db9c06246..fe10fab47 100644 --- a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts +++ b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/app.ts @@ -18,7 +18,7 @@ import { Component, OnInit } from '@angular/core'; providers: [LinkAnnotationService, BookmarkViewService, MagnificationService,ThumbnailViewService, ToolbarService , NavigationService, AnnotationService, TextSearchService, TextSelectionService, PrintService, FormDesignerService, FormFieldsService, PageOrganizerService] }) -export class App implements OnInit { +export class AppComponent implements OnInit { public service = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer'; public document = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; ngOnInit(): void { diff --git a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/main.ts b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/main.ts index ddea8f9f4..6cda24997 100644 --- a/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/main.ts +++ b/Document-Processing/code-snippet/pdfviewer/angular/getting-started-cs1/src/main.ts @@ -1,4 +1,4 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; -import { App } from './app/app'; -bootstrapApplication(App, appConfig).catch((err) => console.error(err)); \ No newline at end of file +import { AppComponent } from './app/app'; +bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); \ No newline at end of file From 0bd5f7d29f80d6350b2c59ff6babd72d33cf80d6 Mon Sep 17 00:00:00 2001 From: Balaji Loganathan Date: Tue, 10 Feb 2026 18:10:52 +0530 Subject: [PATCH 3/3] 1008844: Added angular 12 getting started docs --- .../PDF/PDF-Viewer/angular/getting-started.md | 1 + .../PDF/PDF-Viewer/angular/how-to-overview.md | 1 + ...e-a-standalone-pdf-viewer-in-angular-12.md | 242 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 Document-Processing/PDF/PDF-Viewer/angular/how-to/create-a-standalone-pdf-viewer-in-angular-12.md diff --git a/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md b/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md index 3ed60ad2b..86631b2a3 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/getting-started.md @@ -18,6 +18,7 @@ N> For older versions of Angular, see the following links: * [Create a Standalone PDF Viewer in Angular 17 and above with-no-standalone-flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-with-no-standalone-flag). * [Create a Standalone PDF Viewer in Angular 17 and above without --no-standalone flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-without-no-standalone-flag). +* [Create a Standalone PDF Viewer in Angular 12](./how-to/create-a-standalone-pdf-viewer-in-angular-12) ## Prerequisites diff --git a/Document-Processing/PDF/PDF-Viewer/angular/how-to-overview.md b/Document-Processing/PDF/PDF-Viewer/angular/how-to-overview.md index ee0427ef1..e742f9390 100644 --- a/Document-Processing/PDF/PDF-Viewer/angular/how-to-overview.md +++ b/Document-Processing/PDF/PDF-Viewer/angular/how-to-overview.md @@ -45,6 +45,7 @@ The frequently asked questions in Essential® PDF Viewer are liste * [Add custom fonts to the PDF Viewer using the PDF document](./how-to/custom-fonts) * [Create a Standalone PDF Viewer in Angular 17 and above with --no-standalone flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-with-no-standalone-flag) * [Create a Standalone PDF Viewer in Angular 17 and above without --no-standalone flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-without-no-standalone-flag) +* [Create a Standalone PDF Viewer in Angular 12](./how-to/create-a-standalone-pdf-viewer-in-angular-12) * [Configure Annotation Selector Setting](./how-to/configure-annotation-selector-setting) * [Convert Pdf Library Bounds to Pdf viewer bounds](./how-to/convert-pdf-library-bounds-to-pdf-viewer-bounds) * [Display Custom Stamp items in Custom Stamp](./how-to/show-custom-stamp-item) diff --git a/Document-Processing/PDF/PDF-Viewer/angular/how-to/create-a-standalone-pdf-viewer-in-angular-12.md b/Document-Processing/PDF/PDF-Viewer/angular/how-to/create-a-standalone-pdf-viewer-in-angular-12.md new file mode 100644 index 000000000..f26a73d21 --- /dev/null +++ b/Document-Processing/PDF/PDF-Viewer/angular/how-to/create-a-standalone-pdf-viewer-in-angular-12.md @@ -0,0 +1,242 @@ +--- +layout: post +title: Getting started PDF Viewer in Angular 12 | Syncfusion +description: Checkout and learn about Getting started with Standalone PDF Viewer component of Syncfusion Essential JS 2 in Angular 12 and more details. +platform: document-processing +control: PDF Viewer +documentation: ug +domainurl: ##DomainURL## +--- + +# Getting started with Angular Standalone PDF Viewer component + +This section explains the steps required to create a simple Standalone Angular PDF Viewer and demonstrates the basic usage of the PDF Viewer control in an Angular CLI application. + +N> For Angular 17+, see the following links: + +* [Create a Standalone PDF Viewer in Angular 17 and above with-no-standalone-flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-with-no-standalone-flag). +* [Create a Standalone PDF Viewer in Angular 17 and above without --no-standalone flag](./how-to/create-a-standalone-pdf-viewer-in-angular-17-and-above-without-no-standalone-flag). + +## 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 +``` + +## Installing Syncfusion® PDF Viewer package + +All the available Essential® JS 2 packages are published in `npmjs.com` registry. + +* To install PDF Viewer component, use the following command. + +```bash +npm install @syncfusion/ej2-angular-pdfviewer --save +``` + +* Copy the contents of the ej2-pdfviewer-lib folder from ./node_modules/@syncfusion/ej2-pdfviewer/dist to the src/assets directory using the command: + +```bash +cp -R ./node_modules/@syncfusion/ej2-pdfviewer/dist/ej2-pdfviewer-lib src/assets/ej2-pdfviewer-lib +``` + +* Confirm that there is an 'ej2-pdfviewer-lib' directory within your public directory, housing the assets of the PDF Viewer library. + +* Validate that your server has been configured to utilize the Content-Type: application/wasm MIME type. Additional information can be found in the [Troubleshooting](./troubleshooting/troubleshooting) section. + +## Registering PDF Viewer Module + +Import PDF Viewer module into Angular application(app.module.ts) from the package `@syncfusion/ej2-angular-pdfviewer` [src/app/app.module.ts]. + +```typescript +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +// import the PdfViewer Module for the PDF Viewer component +import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, + MagnificationService, ThumbnailViewService, ToolbarService, + NavigationService, TextSearchService, TextSelectionService, + PrintService, FormDesignerService, FormFieldsService, + AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; +import { AppComponent } from './app.component'; + +@NgModule({ + //declaration of ej2-angular-pdfviewer module into NgModule + imports: [BrowserModule, PdfViewerModule], + declarations: [AppComponent], + bootstrap: [AppComponent], + providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, + ThumbnailViewService, ToolbarService, NavigationService, + TextSearchService, TextSelectionService, PrintService, + AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] +}) +export class AppModule { } +``` + +## Adding CSS reference + +Add the Angular PDF Viewer component's styles as given below in `src/styles.css` file. + +```css +@import '../node_modules/@syncfusion/ej2-base/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-buttons/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-dropdowns/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-inputs/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-navigations/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-popups/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-pdfviewer/styles/material.css'; +@import '../node_modules/@syncfusion/ej2-notifications/styles/material.css'; +``` + +## Add the PDF Viewer component + +Add the Angular PDF Viewer by using `` selector in `template` section of the `src/app/app.component.ts` file to render the PDF Viewer component. + +```typescript +import { Component, OnInit } from '@angular/core'; +import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, + MagnificationService, ThumbnailViewService, ToolbarService, + NavigationService, TextSearchService, TextSelectionService, + PrintService, FormDesignerService, FormFieldsService, + AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; + +@Component({ + selector: 'app-root', + // specifies the template string for the PDF Viewer component + template: `
+ + +
`, + providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, + ThumbnailViewService, ToolbarService, NavigationService, + TextSearchService, TextSelectionService, PrintService, + AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] +}) +export class AppComponent implements OnInit { + public document: string = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; + public resource: string = "https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; + ngOnInit(): void { + } +} +``` + +### Load PDF Viewer with local resources + +To configure the PDF Viewer to use local files for `documentPath` and `resourceUrl` instead of files hosted on a CDN, follow these steps: + +**Step 1:** Ensure that your application includes the `ej2-pdfviewer-lib` folder. This folder must contain the `pdfium.js`, `pdfium.wasm` files, and the PDF file that you intend to display. These should be located in the `assets` directory within your project's `src` folder. + +**Step 2:** Assign local file paths to the `documentPath` and `resourceUrl` properties within the PDF Viewer setup. The `documentPath` should refer to your PDF file, while the `resourceUrl` should point to the directory containing the supporting resources. + +By following these steps, you will configure your PDF Viewer to load the required resources locally. See the code snippet below for reference. + +```typescript + template: ` + `, +export class AppComponent implements OnInit { + public document: string = window.location.origin + "/assets/pdfsuccinctly.pdf"; + public resource: string = window.location.origin + "/assets/ej2-pdfviewer-lib"; + } +``` + +View the sample in GitHub to [load PDF Viewer with local resources](https://github.com/SyncfusionExamples/angular-pdf-viewer-examples/tree/master/How%20to/Refer%20resource%20url%20locally) + +## Run the application + +Use the following command to run the application in browser. + +```javascript +ng serve --open +``` + +The output will appear as follows. + +{% tabs %} +{% highlight ts tabtitle="app.component.ts" %} +import { Component, OnInit } from '@angular/core'; +import { PdfViewerModule, LinkAnnotationService, BookmarkViewService, + MagnificationService, ThumbnailViewService, ToolbarService, + NavigationService, TextSearchService, TextSelectionService, + PrintService, FormDesignerService, FormFieldsService, + AnnotationService, PageOrganizerService } from '@syncfusion/ej2-angular-pdfviewer'; + +@Component({ + selector: 'app-container', + // specifies the template string for the PDF Viewer component + template: `
+ + +
`, + providers: [ LinkAnnotationService, BookmarkViewService, MagnificationService, + ThumbnailViewService, ToolbarService, NavigationService, + TextSearchService, TextSelectionService, PrintService, + AnnotationService, FormDesignerService, FormFieldsService, PageOrganizerService] +}) +export class AppComponent implements OnInit { + public document = 'https://cdn.syncfusion.com/content/pdf/pdf-succinctly.pdf'; + public resource: string = "https://cdn.syncfusion.com/ej2/26.2.11/dist/ej2-pdfviewer-lib"; + ngOnInit(): void { + } +} +{% endhighlight %} + +{% highlight ts tabtitle="main.ts" %} +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; + + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); + +{% endhighlight %} +{% endtabs %} + +{% previewsample "/document-processing/samples/pdfviewer/angular/getting-started-cs1-standalone" %} + +## Module injection + +To enable additional features, inject the required modules. The following modules extend the PDF Viewer's functionality: + +* `LinkAnnotationService`: Enables hyperlink navigation. +* `BookmarkViewService`: Displays and navigates document bookmarks. +* `MagnificationService`: Provides zoom in/out operations. +* `NavigationService`: Enables page navigation. +* `TextSelectionService`: Enables text selection. +* `ThumbnailViewService`: Displays page thumbnails for navigation. +* `ToolbarService`: Enables the built-in toolbar UI. +* `PrintService`: Enables printing. +* `AnnotationService`: Enables annotation features. +* `TextSearchService`: Enables text search. +* `FormFieldsService`: Enables form field support. +* `FormDesignerService`: Enables designing and editing of form fields. +* `PageOrganizerService`: Enables page organization features. + +Inject modules using the `providers` array in the component or module. + +> Refer to the [Angular PDF Viewer feature tour](https://www.syncfusion.com/pdf-viewer-sdk/angular-pdf-viewer) for an overview of capabilities. Explore the [Angular PDF Viewer example](https://document.syncfusion.com/demos/pdf-viewer/angular/#/tailwind3/pdfviewer/default) to see core features in action. + +[View sample in GitHub](https://github.com/SyncfusionExamples/angular-pdf-viewer-examples/tree/master/Getting%20started%20-%20Standalone). \ No newline at end of file