界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器(一)

devtools/2024/9/20 4:01:31/ 标签: ui, angular.js, pdf, kendo ui, 界面控件

如今当用户需要处理PDF文件时,通常不得不下载应用程序或者浏览器插件,控制用户如何与PDF交互并不是一件容易的事。如果我们提供PDF作为内容,用户可以下载它并使用浏览器或PDF本身提供的控件进行交互。然而,一些企业可能希望控制用户使用PDF的方式,以提供更好的体验或在某些条件下限制下载。

构建这样的解决方案需要在后端和前端都付出巨大的努力,然而如果有一种方法可以让您在Angular PDF Viewer中用几行代码来管理PDF交互呢?

Kendo UI for Angular PDFViewer可以帮助大家解决上述的一些问题,它以最佳的方式应用到每个合适的场景中。

P.S:Kendo UI for Angular是专用于Angular开发的专业级Angular组件,这些组件是专门为Angular构建的,没有任何jQuery依赖项。

Kendo UI for Angular 2024 Q1新版下载(Q技术交流:726377843)

场景

为一所大学开发一个应用程序,管理部门希望为学生提供以下功能:

  • 加载PDF不需要插件
  • 把读过的最后一页保存起来
  • 只有在接受条款和条件后才能启用下载
设置项目

为了满足大学的需求,我们使用Kendo UI for Angular PDFViewer,这个组件提供了大量的功能,当与Angular集成时可提供一个全面的解决方案。

首先,用命令ng new elearning-platform设置Angular应用。

ng new elearning-platform
cd elearning-platform
npm install

Kendo UI提供了一个schematics命令来注册它的Angular PDF Viewer。

ng add @progress/kendo-angular-pdfviewer
i Using package manager: npm
√ Found compatible package version: @progress/kendo-angular-pdfviewer@14.0.0.
√ Package information loaded.
The package @progress/kendo-angular-pdfviewer@14.0.0 will be installed and executed.
Would you like to proceed? Yes
√ Packages successfully installed.
UPDATE src/app/app.module.ts (515 bytes)
UPDATE package.json (1708 bytes)
UPDATE angular.json (3165 bytes)
√ Packages installed successfully.
UPDATE src/main.ts (259 bytes)
UPDATE tsconfig.app.json (294 bytes)
UPDATE tsconfig.spec.json (300 bytes)

我们已经设置好了,现在开始为用户和PDF Viewer定义布局和界面。

布局和PDF查看器

首先从app.component.html中删除默认的HTML,添加以下HTML元素:

  • 用于选择PDF(选项:angular.pdf和signals.pdf)的下拉列表。
  • 一个复选框,同意下载条款和条件。
<h1>Welcome to E-learning Platform</h1>
<h2>You can read online and save the state, also download the book (if you agree with the terms)</h2><select>
<option value="angular.pdf">Angular</option>
<option value="signals.pdf">Signals</option>
</select><label for="acceptTerms">
Do you agree with the terms of download?
</label><input id="acceptTerms" type="checkbox" />

要添加kendo-pdfviewer和“paywall”横幅,请在导入部分导入PDFViewerModule模块。

import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterOutlet } from '@angular/router';
import {PDFViewerModule} from "@progress/kendo-angular-pdfviewer";@Component({
selector: 'app-root',
standalone: true,
imports: [CommonModule, RouterOutlet, PDFViewerModule],
templateUrl: './app.component.html',
styleUrl: './app.component.css'
})
export class AppComponent {
title = 'elearning-platform';
}

接下来,添加kendo-pdfviewer和pay-wall元素,这些元素应该只在用户从下拉列表中选择一个选项时出现。为了简化,将它们封装在一个ng容器中。

<ng-container>
<kendo-pdfviewer >
</kendo-pdfviewer>
<div class="pay-wall">
<h1>You reach limit to read </h1>
<button>Close</button>
</div>
</ng-container>

保存后,布局应该是这样的:

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器

我们现在有了一个没有任何交互的布局,在继续之前先在assets目录中创建两个PDF文件——名称与下拉菜单中显示的一致(angular.pdf和signals.pdf)。

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器

阅读器服务

其中一个主要特性是能够在用户返回平台时记住他们离开的地方,这意味着当用户打开PDF时,他们应该被带到在上次会话中离开的确切页面。

实现这一点的最简单方法是在浏览器中使用本地存储,然而为了减少app.component中的代码量,我们将创建一个服务来封装保存和存储页码的逻辑。

要生成这个服务,使用Angular CLI命令ng g s services/reader。

ng g s services/reader
CREATE src/app/services/reader.service.spec.ts (357 bytes)
CREATE src/app/services/reader.service.ts (135 bytes)

打开reader.service.ts文件,执行如下操作:

  • 将PDF文件的资产URL指定为 http://localhost:4200/assets/。
  • 添加storageKey和initialPage变量。
  • 实现两个方法,savePage和getPage。我们将把这些方法连接到pdf-kendo-viewer事件来保存和加载页面。
public assetURL = 'http://localhost:4200/assets/';
private currentPage: number = 1;
private storageKey: string = 'book-page';savePage(page: number) {
localStorage.setItem(this.storageKey, page.toString());
}getPage() {
const savedPage = localStorage.getItem(this.storageKey) || this.currentPage;
return +savedPage;
}

reader.service有了第一个版本,让我们将它与HTML标记和Kendo UI PDF查看器连接起来。

将资产绑定到Kendo PDF查看器

现在我们已经准备好了ReaderService,下一步是启用第一个交互并显示PDF。为此,我们需要在app.component.ts文件中工作,并注入ReaderService。

下面是我们将要介绍的内容:

  • 将ReaderService注入组件。
  • 初始化pdfAssetUrl和bookName变量。
  • 创建一个selectBook方法,根据从下拉列表中选择的图书更新pdfAssetUrl。
  • pdfAssetUrl和bookName绑定到PDF查看器。

首先,导入ReaderService,并使用Angular的依赖注入将其注入到组件中。

import { Component, inject } from '@angular/core';
import { ReaderService } from './services/reader.service';@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
title = 'elearning-platform';
readerService = inject(ReaderService);
....

接下来,让我们声明必要的变量并实现selectBook方法。在这个方法中,我们将通过组合readerService来更新readerService.assetUrl和bookName。

方法如下:

export class AppComponent {
title = 'elearning-platform';
readerService = inject(ReaderService);
pdfAssetUrl = '';
bookName!: string;
selectBook() {
this.pdfAssetUrl = `${this.readerService.assetURL}${this.bookName}`;
}
}

我们如何将这些变量与方法联系起来,并对变化做出反应?Angular提供了几种方法来监听事件并对变化做出反应,为了响应select元素中的change方法,我们可以使用(change)事件并将其链接到selectBook函数。

如何将选择元素的值链接到bookName变量?别担心,Angular提供了ngModel,它是FormsModule的一部分,它通过双向数据绑定帮助我们对变化做出反应。

<select (change)="selectBook()" [(ngModel)]="bookName">
<option value="angular.pdf">Angular</option>
<option value="signals.pdf">Signals</option>
</select>

接下来,我们希望响应更改,以便将PDF加载到kendo-pdfviewer组件中。为了实现这一点,我们绑定了url和saveFileName属性。

saveFileName属性允许我们在用户单击下载工具栏时定义文件的名称。

url属性是将PDF绑定到组件的几种方法之一,在本例中,我们提供存储PDF的URL。

最后的代码看起来像:

<kendo-pdfviewer
[saveFileName]="bookName"
[url]="pdfAssetUrl">
</kendo-pdfviewer>

保存更改,然后重新加载页面并与下拉菜单交互来加载不同的PDF。

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器

是的,我们已经成功加载了PDF!但是,仍然有一些功能需要完成,例如保存页面位置和控制下载选项。篇幅有限,未完待续下期见~


http://www.ppmy.cn/devtools/40147.html

相关文章

在IDEA中如何用Kafka进行异步处理

在IDEA的项目中使用Kafka进行异步处理 在项目的pom.xml文件中&#xff0c;添加以下依赖&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version> </dep…

计算机网络实验1:交换机基本配置管理

实验目的和要求 安装Packer Tracer&#xff0c;了解Packer Tracer的基本操作掌握交换机基本命令集实验项目内容 认识Packet Tracer软件 交换机的基本配置与管理 交换机的端口配置与管理 交换机的端口聚合配置 交换机划分Vlan配置 实验环境 硬件&#xff1a;PC机&#x…

kubeadm搭建K8S集群小记

概述 一时兴起&#xff0c;尝试下K8S集群的搭建 步骤 请查看参考链接1 Q&A Q: raw.githubusercontent.com被墙&#xff0c;导致kube-flannel.yml下不来 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlTh…

R语言:r画韦恩图

> setwd("") > library(openxlsx) > library(ggvenn) > data <- read.xlsx("韦恩图种2.xlsx") data$P <- ifelse(data$P 0, "F", "T") data$N <- ifelse(data$N 0, "F", "T")> data &l…

Redis基础面试知识点(1)

相比于C字符串&#xff0c;SDS的优势&#xff1a; O(1)获取字符串的长度不会缓冲区溢出减少修改字符串时所需的内存重新分配的次数&#xff08;空间预分配、惰性空间释放&#xff09;二进制API安全&#xff08;通过len获取长度&#xff09;兼容部分C字符串函数 Redis hash策略…

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇&#xff0c;前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了&#xff0c;本文将会是它们的实操讲解。 HDFS相关前文&#x…

使用凌鲨建立软件研发技能学习小组

凌鲨(OpenLinkSaas)的团队功能除了提供论坛功能&#xff0c;还能记录团队成员的成长记录。 使用方法 打开团队功能 团队功能在默认情况下是关闭的&#xff0c;你可以在登录后打开团队功能开关。 创建学习团队 日报/周报/个人目标一般是企业团队需要&#xff0c;建议关闭。 …

Docker 怎么将映射出的路径设置为非root用户权限

在Docker中&#xff0c;容器的根文件系统默认是由root用户拥有的。如果想要在映射到宿主机的路径时设置为非root用户权限&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 使用具有特定UID和GID的非root用户运行容器&#xff1a; 在运行容器时&#xff0c;你可以使用-u…

探索数据结构:树与二叉树

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 树 1.1. 树的定义 树是一种非线性的数据结构&#xff0c;它是由n&a…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

链表与顺序表的比较

目录 1.链表与顺序表的区别 1.1 存储空间 1.2 插入删除 1.3 扩容 1.4 使用场景 1.5 缓存使用率 1.链表与顺序表的区别 1.1 存储空间 顺序表在物理上与逻辑上都是连续的 链表在逻辑上连续物理不一定连续 因此顺序表我们可以任意访问而链表不可以随机访问 链表每次访问都…

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

绘制奇迹:Processing中的动态图形与动画

&#x1f680; 欢迎回到Processing的世界&#xff0c;你的艺术编程航程刚刚开始。在我们的入门篇中&#xff0c;你已经学会了如何用Processing绘制基本的静态图形。现在&#xff0c;让我们一起探索Processing强大的动态图形和动画功能&#xff0c;释放你的创造力&#xff0c;走…

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引&#xff0c;在5.7之后才会为每个表生成一个独立表空间即一个ibd文件&#xff0c;在此之前&#xff0c;所有表默认下都会存储在“系统表空间”&#xff08;共享表空间&#xff09;&#xff0c;所有表都在一个ibd文件。 inn…

贝叶斯分类器详解

1 概率论知识 1.1 先验概率 先验概率是基于背景常识或者历史数据的统计得出的预判概率&#xff0c;一般只包含一个变量&#xff0c;例如P(A)&#xff0c;P(B)。 1.2 联合概率 联合概率指的是事件同时发生的概率&#xff0c;例如现在A,B两个事件同时发生的概率&#xff0c;记…

zookeeper启动 FAILED TO START

注意&#xff1a;启动zookeeper时&#xff0c;需要使用zkServer.sh start命令将所有主机启动后&#xff0c;再查看状态 如果&#xff0c;启动一台主机&#xff0c;查看当前主机状态&#xff0c;则会报错 如果出错&#xff0c;进入到$ZOOKEEPER_HOME/logs&#xff0c;查看日志 …

19_Scala集合概述

文章目录 集合回顾javaScala集合三大类String & StringBuilderScala集合两大类 集合 回顾java scala与Java有所不同 函数式编程语言更侧重集合本身提供的哪些功能&#xff1b; Scala集合三大类 1.Seq 存储有序数据可重复 类比 List 2.Set 存储无序数据不可重复 3.Map…

C# WCF服务(由于内部错误,服务器无法处理该请求。)

由于内部错误&#xff0c;服务器无法处理该请求。有关该错误的详细信息&#xff0c;请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端&#xff0c;或打开对每个 Microsoft .NET …

[QTcreator]QT中一个cpp文件如何使用另一个界面的控件

在工作过程中将函数封装成一个类放入一个cpp文件中&#xff0c;但是里面的函数需要运用到其他界面的控件&#xff0c;以此记录昨天的学习。 首先明确一下我需要在vtkfuntion.cpp使用mainwindow.ui中的qvtkwidget控件 step1:更改mainwindow.h 添加需要应用的文件的头文件&…

[Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。

前言 最近在开发一个组件&#xff0c;但是这个东西是以dll的形式发布的界面库&#xff0c;所以在开发的时候就需要上层调用。 如果你是很懂CMake的话&#xff0c;ui_xx.h的文件目录在 ${CMAKE_CURRENT_BINARY_DIR} 下 然后除了有关这个ui_xx.h&#xff0c;还有一些别的可以简…