前言
在1-4章中,我们使用了iText7来创建PDF文档。在5-6章中,我们操作和重用了现有的PDF文档。在这些章节中我们操作的PDF文档都是在ISO 32000规范下的,是PDF文件的核心标准。ISO 32000并不是PDF的唯一ISO标准,还有很多为了特定原因创建的子标准。在本章中,我们着重关注两个:
ISO 14289,也叫做PDF/UA。UA的意思就是通用访问设计(Universal Accessibility),使用PDF/UA标准的PDF的文档,每个人都可以查看,包括那些有视觉障碍的人甚至瞎子(我天,真有这么神奇吗)
ISO 19005,也叫做PDF/A。A的意思是归档化(Archiving)。目标是文档数字化的长期存储。
在本章中,我们通过创建一系列的PDF/A和PDF//UA文件会学习PDF/A和PDF/UA相关的知识。
创建PDF/UA文档
在我们开始PDF/UA例子之前,我们来看一下我们要解决的问题。在第1章,我们已经创建了带有图片的文档,在句子"Quick brown fox jumps over the lazy dog"中,我们把"dag"和"fox"替换为相应的图片,当这个文件被读入的时候,一个机器不能知道第一张图片代码一个fox,第二张图片代表dog,因此这个文件会被认为:“Quick brown jumps over the lazy”。
在一个普通的PDF中,内容会被画入画布(canvas)中。我们可能会使用高级的对象,例如List
和Table
,但是一旦PDF被创建,这些对象不会保存。一个List
是一系列行组成的,但是在list元素中一个文本片段并不知道它是list的一部分。一个Table
由一群先和特定位置的文本组成,同样的,一个文本片段并不知道它属于特定行和列。
除非我们让一个PDF变成加带标签的PDF,否则这个文档不会包含任何的语义上的结构。当一个文档没有语义结构存储的时候,我们就说这个PDF无法感知/理解(isn’t accessible)。为了可感知/理解,这个文档需要能够能够区分一个页面上哪些部分是真实的内容,哪些部分不是真实的内容(例如页眉,页码),一行文本如果不是paragraph
的一部分的话,需要知道自己是否是一个title
,当然还有其他一些要求。我们可以通过一种方式来添加所有的信息到一个页面,这个方式就是创建结构树(structure)
和把内容定义为带标签的内容
。这个可能听起来比较复杂,但是如果我们使用iText7的高级对象,我们可以高效的使用setTagged()
来达到这一目标。 通过定义PdfDocument
为带标签的文档,List
、Table
和Paragraph
等带结构的对象被引入后,会反映在带标签的PDF中。 当然这只为了PDF感知(accessible,是实在不知道翻译成啥比较好,就暂且翻译成感知吧)的其中一个要求,下面的代码可以帮我们理解其他的要求:
PdfDocument pdf = new PdfDocument(new PdfWriter(dest, new WriterProperties().addXmpMetadata()));
Document document = new Document(pdf);
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/UA example");
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
//PDF/UA: Set alt text
foxImage.getAccessibilityProperties().setAlternateDescription("Fox");
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
//PDF/UA: Set alt text
dogImage.getAccessibilityProperties().setAlternateDescription("Dog");
p.add(dogImage);
document.add(p);
document.close();
创建一个PdfDocument
和Document
,但是这次我们使用WriterProperties
的addXmpMetadata()
来自动添加XMP元数据。在PDF/UA中,必须在PDF中以XML格式存储相同的元数据。XML可能不是压缩的。不熟悉PDF内容格式的处理者/处理程序必须能够探测这个XMP元数据并能正确处理它。一个XMP数据流会在Info字典(Info dictionary)条目中自动创建。这个Info字典是一个PDF对象,它包含诸如文档标题之类的数据。除了添加XMP数据流以后,我们还需求进行以下操作来使之符合PDF/UA标准:
把这个PdfDocument
设置为带标签的(行4)
我们添加一个语言说明符。在这个例子中,文件知道在这个文件中使用的主要语言是美国英语(行5)
更改查看器首选项,以便文档的标题始终显示在PDF查看器的顶部栏中 (行6-7)。然后我们把标题放入了文档的元数据中(行8-9)
所有的字体需要被嵌入(行11)。对于字体其实还有一些其他的要求,但是我们现在讨论还为时过早。
所有的内容需要带标签。遇到图片时,我们需要使用替代图片文字提供该图片的描述(行17和行22)
现在我们已经完成了创建PDF/UA的工作。结果如下两图1和图2所示,可能与之前的差别并不是很明显,但是如果我们打开Tags版面(一定要用Adobe Acrobat Pro,用Adobe Acrobat Reader DC不行的哟):
图1. 一个PDF/UA文档和它的结构
图2. ctrl+d文档属性
我们可以看到
标签里面有
标签,
标签由两个
和两个
组成。我们会在这章的后面创建更加复杂的PDF/UA文档,现在我们先来看看PDF/A怎么创建。
创建PDF/A文档 PDF/A-1
ISO 19005的Part 1是在2005年发布的。它在Adobe PDF 1.4声明官方中被定义(那时候这份声明并不是ISO标准)。SO 19005-1引入了一系列的义务和限制:
文档的所有资源和信息必须自己存储:所有的字体需要被嵌入;扩展的动画、视频、声音和其他二进制文件是不被允许的。
文档必须把元数据保存在XMP(eXensible Metadata Platform)格式中:ISO 16684(XMP)描述了如何把XML格式的元数据保存在一个二进制文件中,以便不知道怎么读取和解释二进制文件的软件仍然可以提取文件的元数据。
不允许一些未来(先进的,不在PDF里面声明的或未来添加的)功能:PDF不能包含JavaScript而且也不能被加密
SO 19005-1:2005 (PDF/A-1)定义了两种符合性级别:
Level B(“basic”):确保长期保存文件的视觉外观。
Level A(“accessible”):不仅确保长期保存文件的视觉外观,而且引入了结构和语义特性,这个PDF需要是带标签的PDF。(注意和PDF/UA比较类似,但是不同,原因后面例子会提及)
下面的代码展示了如何把我们之前创建的"Quick brown fox"的PDF变成符合PDF/A-1b标准:
//Initialize PDFA document with output intent
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_1B,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf);
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
p.add(dogImage);
document.add(p);
document.close();
我们可以看到,我们不再使用PdfDocument
实例,相反,我们使用的是PdfADocument
实例。首先我们创建了一个PdfADocument
实例,PdfADocument
实例构造函数第一个参数是一个PdfWriter
,第二个参数是符合性级别(在这里就是PdfAConformanceLevel.PDF_A_1B
),第三个参数是一个PdfOutpuyIntext
,这个输出意图告诉文档如何解读这个文档里面存储的颜色。在第10行,我们确保字体被嵌入。
产生的PDF的样子如下图3:
图3. 一篇PDF/A-1B标准的文档
由上图我们可以看见一个带有"这个文件符合PDF/A标准规范,且已在只读模式下打开以防被修改"的小蓝条。对此我们从两个方法来解读这句话:
这句话并不意味着这个PDF实际上是符合PDF/A标准的,它只是声明它有可能是,为了确认是否符合标准,我们需要在Adobe Acrobat中打开"标准"面板,然后点击"验证符合性``链接,Acrobat会验证这个文档是否和它声明的一样,在这个例子中,结果是“验证成功";这样,我们会最终创建PDF/A-1B标准的文档。
文档已经以只读方式打开,并不是因为不允许修改(PDF/A不能保护PDF不被修改),而是Adobe Acrobat以只读的方式显示,因为任何修改都可能会改变PDF转换为不再符合PDF/A标准的PDF。在不破坏PDF/A状态的情况下更新PDF/A是被允许的。
然后我们来看看怎么创建PDF/A-1a,代码如下:
//Initialize PDFA document with output intent
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_1A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf);
//Setting some required parameters
pdf.setTagged();
//Fonts need to be embedded
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.WINANSI, true);
Paragraph p = new Paragraph();
p.setFont(font);
p.add(new Text("The quick brown "));
Image foxImage = new Image(ImageFactory.getImage(FOX));
//Set alt text
foxImage.getAccessibilityProperties().setAlternateDescription("Fox");
p.add(foxImage);
p.add(" jumps over the lazy ");
Image dogImage = new Image(ImageFactory.getImage(DOG));
//Set alt text
dogImage.getAccessibilityProperties().setAlternateDescription("Dog");
p.add(dogImage);
document.add(p);
document.close();
让我们来解读代码,在第3行中,我们把PdfConformanceLevel.PDF_A1B
变为了PdfConformanceLevel.PDF_A1A
。在第8行中,把这个PdfADocument
变成了带标签的PDF,然后加入了图片的文字描述信息,最后结果如下图4所示:
图4. 一篇PDF/A-1A标准文档
我们打开标准面板,可以看出Adobe Acrobat Pro把这个文件认为是PDF/A-1A和PDF/UA-1,但是这次并没有验证符合性链接,所以我需要借助于印前检查工具(英文版的是Preflight,晕,中文版的找了半天才找到,我在这里就分享给大家吧,估计大家都是用的中文,具体步骤为:打开工具里面的PDF标准→印前检查(或者直接左边点击打开印前检查)→找到PDF/A规范下面的PDF/A-1b规范→分析 ),如下图5:
图5. 印前检查工具查看验证符合性连接
我们继续看英文版的那张图,可以看出来结果是没有发现任何错误。我们无法验证PDF/UA符合性,因为PDF/UA涉及一些无法通过本地计算机验证的要求。例如:如果我们将狐狸形象的描述与狗的形象描述交换,机器就不会注意到。这将使文件无法访问,因为文件会根据屏幕阅读器向人们传播虚假信息。无论如何,只需知道我们创建文档不符合PDF/UA标准,因为我们省略了一些基本要素(如语言,第一个例子里面就同时设置了语言)。
从一开始就确定ISO 19005的认可部分永远不会失效。新的,后续的部分只会定义新的有用的功能。这些后续定义的就是我们即将介绍的PDF/A-2和PDF/A-3。
创建PDF/A文档 PDF/A-2和PDF/A-3
ISO 19005-2:2011 (PDF/A-2)是根据ISO标准(而不是Adobe的PDF官方文档)被添加到PDF/A标准中的。PDF/A-2在PDF1.5,1.6.1.7中很多特性和提升:
有用的添加功能有:JPEG2000的支持,容器,对象级XMP和可选内容
有用的提升改进有:对透明、类型注释、注释和数字签名有更好的支持。
PDF/A-2在符合性方面,除了原有的Level A和Level B以外,还定义了额外的level:
Level U(“Unicode”):确保文档的视觉外贸能长久保存,并且所有的文本的存储格式为UNICODE
ISO 19005-3 :2012 (PDF/A-3)几乎与PDF/A-2一毛一样。唯一的区别就是:在PDF/A-3中,附件不需要一定是PDF/A格式的。你可以把任何格式的文件当前是PFA/A-3的附件,例如可以把一个excel格式的文件当作是这个文档用到的结果,一个word格式文件用来创建一个PDF文档,等等。文档本身需要符合PDF/A规范的所有义务和限制,但这些义务和限制不适用于其附件。
在下面的例子中,我们会创建同时符合PDF/UA和PDF/A-3A标准,我们之所以会选择PDF/A-3,是因为要用到CSV文件来创建PDF,代码如下:
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_3A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
Document document = new Document(pdf, PageSize.A4.rotate());
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-3 example");
//Add attachment
PdfDictionary parameters = new PdfDictionary();
parameters.put(PdfName.ModDate, new PdfDate().getPdfObject());
PdfFileSpec fileSpec = PdfFileSpec.createEmbeddedFileSpec(
pdf, Files.readAllBytes(Paths.get(DATA)), "united_states.csv",
"united_states.csv", new PdfName("text/csv"), parameters,
PdfName.Data, false);
fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
pdf.addFileAttachment("united_states.csv", fileSpec);
PdfArray array = new PdfArray();
array.add(fileSpec.getPdfObject().getIndirectReference());
pdf.getCatalog().put(new PdfName("AF"), array);
//Embed fonts
PdfFont font = PdfFontFactory.createFont(FONT, true);
PdfFont bold = PdfFontFactory.createFont(BOLD_FONT, true);
// Create content
Table table = new Table(new float[]{4, 1, 3, 4, 3, 3, 3, 3, 1});
table.setWidthPercent(100);
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
process(table, line, bold, true);
while ((line = br.readLine()) != null) {
process(table, line, font, false);
}
br.close();
document.add(table);
//Close document
document.close();
让我们逐行解释代码:
行1-5:我们创建了PdfADocument
(类型为PdfAConformanceLevel.PDF_A_3A)
)和Document
行7:让PDF变成带标签的PDF——PDF/UA和PDF/A-3A标准。
行8-12:设置语言,文档标题和查看器首选项——PDF/UA标准。
行14-20:使用特定的参数来添加一个附件——PDF/A-3A标准。
行26-27:嵌入图片和字体——PDF/UA和PDF/A-3A标准。
行28-38:提取内容和我们之前第1章的代码一样的。
行30:关闭文档,保存内容
如下图6,我们可以看到我们用Table
和Cell
对象添加到文档里在标签面板里面,被保存了Table数据结构了,有点像HTML:
图6. 一篇PDF/A-3A标准的文档
同时,我们打开附件面板,我们可以看见CSV源文件,并且可以轻松提取出来,如下图7:
图7. 一篇PDF/A-3A标准文档和它的附件
通过上述的例子,与一般的PDF文件相比,我们创建符合PDF/UA或者PDF/A文档的时候需要添加另外的信息,*“我们是否能用iText改把现有的普通的PDF文档转换成符合PDF/UA或者PDF/A标准的文档呢?”*是在论坛和咨询里面问得最多的问题。我们希望通过这一章让大家明白iText是不能自动转换的,原因如下:
如果和之前一样有一个文档有一张fox和一张dog图片,iText不能自动给图片添加缺失的替换描述信息,因为iText不能准备识别这些图片的含义(说白了就是没有机器学习、人工智能模块,不能识别内容)
如果字体没有被嵌入,而且并没有提供相应的字体程序的的话,iText并不会知道字体长成什么样,也不能把字体嵌入到文档中。
当然这只是不能自动转换的两个小原因。让一个PDF展示小蓝条说这个文档貌似符合PDF/A标准是很容易,但是并不是所有的声明都是正确的。 最后,我们来看看PDF/A文档的拼接。
拼接PDF/A文档
当拼接PDF/A文件的时候,最值得我们注意的是,我们拼接的各个文档必须都是PDF/A文件,不能一个是PDF/A文件,一个是普通文件,而且PDF/A的Level也要一样,不能一个是A,一个是B,因为一个有结构树,一个没有,拼接在一起会导致结果错误。
我们把之前两个PDF/A A级的文档拼接起来,生成的文件如下图8所示:
图8. 拼接2篇PDF/A-A
通过标签面板我们看到一个
,紧接着是,如下代码展示了如何创建这个文档:
PdfADocument pdf = new PdfADocument(new PdfWriter(dest),
PdfAConformanceLevel.PDF_A_1A,
new PdfOutputIntent("Custom", "", "http://www.color.org",
"sRGB IEC61966-2.1", new FileInputStream(INTENT)));
//Setting some required parameters
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 PDF/A-1a example");
//Create PdfMerger instance
PdfMerger merger = new PdfMerger(pdf);
//Add pages from the first document
PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(SRC1));
merger.addPages(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
//Add pages from the second pdf document
PdfDocument secondSourcePdf = new PdfDocument(new PdfReader(SRC2));
merger.addPages(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
//Merge
merger.merge();
//Close the documents
firstSourcePdf.close();
secondSourcePdf.
整体上,这段代码可以说和之前的例子很像:
行1-11就不说了,和之前的代码没什么区别。
行12-25的话,在上一章奥斯卡奖项拼接的例子中有提及,创建PdfMerger
的时候,我们传入的是PdfADocument
对象,之后往这个PdfMerger
对象添加的是PdfDocument
类型的,如果是PdfADocument
类型的话,会检查文档的合法性。
关于PDF/UA和PDF/A标准还有很多讨论,当然还有其他子标准,例如在PDF/A-3中有一个德语发音的ZUGFeRD的标准,会在别的系列里面讲述(这个是官方文档里面说的,个人的话看需求喽,如果有时间我就开这个坑)
总结
在本章,我们探讨了符合其他PDF标准的文档的创建和拼接,学会了创建PDF/UA和PDF/A的文档,本系列也就在此结束了,当然我们还需要一些其他的系列来深入的了解iText7。
itext7学习笔记就到这里结束了,不过itext7还会出其他的系列,比如现在的itext7学习笔记杂谈系列,而且itext7官网上还有很多example和文章,同时我也会更加注重文章的格式和内容,精益求精,请大家继续支持我的itext7系列,看完文章不忘关注和点赞一波~
你可能感兴趣的:(iText,java,itext7学习笔记)
用JavaScript实现找不同小游戏
算是难了
javascript 开发语言 前端 websocket
目录倒计时的实现找不同实现对canvas的初始化实现画布的分割,父盒子>子盒子>canvas找不同逻辑的判断实现图片的导入DOM节点的监听声明两个需要监听的节点禁用页面点击事件的函数DOM监听实现勋章分数增加和生命的减少减命逻辑死亡响应websocket交互定义给后端发送的数据包断线重连最后,调用封装好的websocket创建初始之物,其行必丑代码写的非常繁琐,有很多细节在复盘的时候也会想不起来为
Java工程结构:服务器规约(JVM 碰到 OOM 场景时输出 dump 信息、设置tomcat的 JVM 的内存参数、了解服务平均耗时)
iOS逆向
Java开发的深入浅出 java 服务器 开发语言
文章目录I调用远程操作必须有超时设置。II推荐了解每个服务大致的平均耗时JVM的Xms和Xmx设置一样大小的内存容量让JVM碰到OOM场景时输出dump信息调大服务器所支持的最大文件句柄数(FileDescriptor,简写为fd)高并发服务器建议调小TCP协议的time_wait超时时间。III设置tomcat的JVM的内存参数查找Tomcat位置:快速定位服务状态和部署位置具体配置步骤查看JV
策略模式和职责链模式实现坦克大战
科学的发展-只不过是读大自然写的代码
设计模式-坦克大战-java 策略模式
目录:一个实例讲完23种设计模式当前:策略模式职责链观察者上一篇《命令模式坦克大战简单实现(java实现)》需求:坦克大战创建两种坦克坦克类型射程速度b7070米时/70公里b5050米时/70公里简单说明一下:这任然用坦克大战的需求,实现了如下3种模式策略职责链观察者(这里的观察者就一个,没有体现被观察者和观察者1对多的关系,但是观察者的价值在于被观察者发现自己有变化的时候,对观察者自动的通知,
Redis实战之Jedis使用技巧详解
小马不敲代码
实战 redis 缓存
一、前言基于redis开放的通信协议,大神们纷纷开发了各种语言的redis客户端,有c、c++、java、python、php、nodeJs等等开发语言的客户端,准确来说其实这些客户端都是基于redis命令做了一层封装,然后打包成工具以便大家更佳方便的操作redis,以Java项目为例,使用最广的就是以下三种客户端:JedisLettuceRedisson二、JedisJedis是老牌的Redis
【Spring】Spring DI(依赖注入)详解——注入参数的细节处理-内部Bean的注入
AI人H哥会Java
JAVA java 开发语言 spring 后端
引言在现代Java开发中,Spring框架已经成为了构建企业级应用的标准工具之一。Spring的核心特性之一就是依赖注入(DependencyInjection,DI),它通过将对象的依赖关系从代码中解耦出来,提升了代码的可维护性和可测试性。特别是在大型项目中,良好的依赖管理能够显著降低代码的复杂度,提高开发效率。依赖注入的基本概念依赖注入是一种设计模式,用于实现控制反转(InversionofC
arcgis for JavaScript入门篇
五彩斑斓黑123
arcgis for javascript arcgis javascript 开发语言
介绍ArcGISforJavaScript是一种基于Web的地图开发解决方案,由ESRI公司开发。它允许开发人员在Web应用程序中嵌入交互式地图,并使用JavaScript编写地图应用程序。ArcGISforJavaScript提供了许多功能强大的API和工具,使开发人员能够创建高度定制的地图应用程序。它支持各种地图数据源,包括ESRI的ArcGISOnline服务、第三方地图服务、以及开发人员自
JSONObject解析数据库Date类型报错问题
知忆_IS
数据库 java database postgresql
JSONObject解析数据库Date类型报错问题最近项目在写服务器后端查询空间数据的接口时,由于表结构不一致,直接写了一个通用函数用json储存数据库中查询的结果,然而今天前端查询一个表的时候无法查到相应的结果,查了一下代码发现爆了如下错误。报错:Causedby:java.lang.IllegalArgumentExceptionatjava.sql.Date.getHours原因是该表中存在
【贪心算法】洛谷P4995 - 跳跳
仟濹
算法学习笔记 贪心算法 算法
2025-01-21-第44篇【洛谷】贪心算法题单-【贪心算法】-【学习笔记】作者(Author):郑龙浩/仟濹(CSND账号名)目录文章目录目录洛谷P4995跳跳!题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示样例解释数据范围思路代码洛谷P4995跳跳!题目描述你是一只小跳蛙,你特别擅长在各种地方跳来跳去。这一天,你和朋友小F一起出去玩耍的时候,遇到
【Elasticsearch 】 聚合分析:聚合概述
程风破~
Elasticsearch elasticsearch 大数据 搜索引擎
博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分
ArcGIS API for JavaScript获取和配置-ArcGIS Web 开发学习(一)
大海上飞翔
ArcGIS Web API javascript arcgis
ArcGISAPIforJavaScript获取和配置最近开始学习WebGIS开发,刚一接触就很是让人恼火,第一个问题就是:ArcGISAPIforJavaScript库和SDK的获取。(1)我直接访问的是ARCGIS的资源中心:http://resources.arcgis.com/zh-cn/home/,点击JavaScript,出现以下页面:https://developers.arcg
mvc学习笔记
JDS_DIJ
笔记 mvc
mvc设计框架的形成最早是servlet==>缺点:生成html页面太麻烦,所以引入了jsp,jsp本质就是servletjsp==>缺点:阅读起来困难,难维护,于是引入javabean,用来专门和数据打交道;形成jsp的设计框架model1jsp+javabean==>缺点:jsp即要接受请求,又要展示数据,所以又加入servlet;专门用来接受请求;形成jsp的设计框架model2jsp+ja
MVC 架构学习笔记
disgare
架构 mvc 架构 学习
MVC架构学习笔记Service与DAO层方法命名规约业务错误是用返回值来处理还是抛异常来处理Service与DAO层方法命名规约CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能。对应这里的crud方法的命名,每个人有不同的实践。以下是阿里
微信 PC 版 4.0:新架构,新升级
创意锦囊
微信 架构
探索微信PC版4.0:新架构带来的革命性升级微信在2023年底推出了PC客户端4.0测试版,引入了全新的QT+C++原生跨平台架构。这次架构重构标志着微信在桌面端从传统的WebView技术迈向更现代化、高性能的原生技术基础,带来了显著的功能升级和用户体验优化。从旧到新:架构大变革旧架构:WebView+JavaScript微信旧版PC客户端主要依赖WebView技术,通过HTML、CSS和Java
深入探究 Java 异常处理
潜意识Java
Java知识 java python 开发语言
目录一、异常是什么,为啥要处理它二、Java异常体系概述三、Java异常处理方式1.try-catch-finally块2.throws关键字3.throw关键字四、自定义异常五、异常处理的最佳实践六、总结在Java编程的旅程中,异常处理就像是一位默默守护的卫士,时刻保障着程序的稳健运行。当程序运行过程中出现错误或异常情况时,合理的异常处理机制能够避免程序崩溃,让程序以一种可控的方式继续执行或优雅
Go语言学习笔记—golang流程控制
PPPsych
Go语言基础学习笔记 golang 学习
视频来源:B站《golang入门到项目实战[2022最新Go语言教程,没有废话,纯干货!]》文章为自己整理的学习笔记,侵权即删,谢谢支持!文章目录一Go语言中的流程控制简介二Go语言中的if语句2.1语法2.2实例演示2.3注意事项三Go语言中的ifelse语句3.1语法3.2实例演示3.3注意事项(同if语句)四Go语言中的ifelseif语句4.1语法4.2实例演示五Go语言中的嵌套if语句5
Docker的原理:如何理解容器技术的力量 思维导图-java架构
用心去追梦
大数据 java storm
要理解Docker的原理以及容器技术的力量,可以通过一个思维导图来帮助整理和展示信息。以下是一个基于文本的思维导图结构,用于说明Docker和容器技术的关键概念,特别关注于Java架构师可能会感兴趣的部分:Docker与容器技术│├───基本概念│├───容器(Container)││└───是一个轻量级、可移植、自包含的软件包│├───镜像(Image)││└───包含应用程序及其所有依赖项的只
Java 驱动大数据流处理:Storm 与 Flink 入门 (大数据)
用心去追梦
大数据 java storm
Java是一种广泛使用的编程语言,特别适用于企业级应用开发。随着数据量的不断增长,处理大数据流成为了现代软件开发中的一个重要领域。ApacheStorm和ApacheFlink是两个用于处理大规模数据流的开源框架,它们都支持用Java编写的应用程序。下面将简要介绍这两个框架,并提供一些入门指导。ApacheStormApacheStorm是一个免费、开源的分布式实时计算系统。Storm让用户能够轻
实现音乐播放器实现:前端HTML,CSS,JavaScript综合大项目(java实战)
用心去追梦
前端 html css
创建一个音乐播放器项目,使用HTML、CSS和JavaScript作为前端技术栈,并结合Java后端(如果需要),可以是一个很好的实战项目。这个项目不仅能够帮助你掌握前端开发技能,还能让你了解如何与后端交互来获取数据。下面是实现这样一个音乐播放器项目的步骤指南,包括了从规划到部署的各个方面。1.项目规划规划功能基本功能播放/暂停按钮。音量控制。进度条。歌曲列表显示。高级功能随机播放。列表循环。搜索
hive电影数据分析系统 Springboot协同过滤-余弦函数推荐系统 爬虫2万+数据 大屏数据展示 + [手把手视频教程 和 开发文档]
QQ-1305637939
毕业设计 大数据毕设 计算机毕业设计 hive spring boot 爬虫
hive电影数据分析Springboot协同过滤-余弦函数推荐系统爬虫2万+数据大屏数据展示+[手把手视频教程和开发文档]【功能介绍】1.java爬取【豆瓣电影】网站中电影数据,保存为data.csv文件,数据量2万+2.data.csv上传到hadoop集群环境3.MR数据清洗data.csv4.Hive汇总处理,将Hive处理的结果数据保存到本地Mysql数据库中5.Springboot+Vu
hadoop电影数据分析系统 Springboot协同过滤-余弦函数推荐系统 爬虫2万+数据 大屏数据展示 + [手把手视频教程 和 开发文档]
QQ-1305637939
计算机毕业设计 毕业设计 大数据毕设 hadoop spring boot 爬虫
全套视频教程全套开发文档hadoop电影数据分析系统Springboot协同过滤-余弦函数推荐系统爬虫2万+数据大屏数据展示【Hadoop项目】1.java爬取【豆瓣电影】网站中电影数据,保存为data.csv文件,数据量2万+2.data.csv上传到hadoop集群环境3.data.csv数据清洗4.MR数据汇总处理,将Reduce的结果数据保存到本地Mysql数据库中5.Springboot
spark电影数据分析系统 Springboot协同过滤-余弦函数推荐系统 爬虫2万+数据 大屏数据展示 + [手把手视频教程 和 开发文档]
QQ-1305637939
毕业设计 大数据毕设 计算机毕业设计 spark spring boot 爬虫 大数据 电影推荐 电影分析
spark电影数据分析系统Springboot协同过滤-余弦函数推荐系统爬虫2万+数据大屏数据展示+[手把手视频教程和开发文档【功能介绍】1.java爬取【豆瓣电影】网站中电影数据,保存为data.csv文件,数据量2万+2.data.csv上传到hadoop集群环境3.MR数据清洗data.csv4.Spark汇总处理,将Spark处理的结果数据保存到本地Mysql数据库中5.Springboo
小白入门MATLAB学习笔记
小mushroom
matlab 学习 笔记
绘图:使用MATLAB绘制三叶玫瑰线公式:玫瑰线的极坐标方程为:ρ=a*sin(nθ),ρ=a*cos(nθ)用直角坐标方程表示为:x=a*sin(nθ)*cos(θ),y=a*sin(nθ)*sin(θ)其中n为玫瑰线的叶数,我们绘制三叶玫瑰线,因而公式中取n=3代码:t=-2*pi:0.01:2*pi;x=sin(3*t).*cos(t);y=2*sin(3*t).*sin(t);z=3*si
二分查找(Java版)
爱学Java
Java数据结构与算法 java 算法
二分查找算法Java版算法介绍算法复杂度算法思想算法注意事项算法基础版改进版平衡版最左侧查找最右侧查找总结二分查找算法介绍算法复杂度时间复杂度:O(logn)空间复杂度:O(1)算法思想二分查找(BinarySearch)是一种高效的搜索算法,适用于在有序数组或序列中查找目标元素的位置。其核心思想是利用数组的有序性,将查找范围逐步缩小至目标值所在的子范围。1,确定查找范围:在有序数组中,设定两个指
什么是ShardingSphere的关联表?
java1234_小锋
java ShardingSphere
大家好,我是锋哥。今天分享关于【什么是ShardingSphere的关联表?】面试题。希望对大家有帮助;什么是ShardingSphere的关联表?1000道互联网大厂Java工程师精选面试题-Java资源分享网在ShardingSphere中,关联表(也叫做跨库跨表查询)是指多个表之间通过关联查询而涉及到的表。当你在进行数据库分片时,可能会遇到多个表需要通过外键、联合查询等方式进行连接的情况。S
MySQL有哪些高可用方案?
java1234_小锋
mysql mysql 数据库
大家好,我是锋哥。今天分享关于【RMySQL有哪些高可用方案?】面试题。希望对大家有帮助;MySQL有哪些高可用方案?1000道互联网大厂Java工程师精选面试题-Java资源分享网MySQL的高可用方案可以帮助确保数据库在发生故障时仍能持续提供服务,避免单点故障带来的影响。以下是一些常见的MySQL高可用方案:1.主从复制(Master-SlaveReplication)概述:主从复制是最常见的
RocketMQ如何保证消息顺序?
java1234_小锋
java rocketmq
大家好,我是锋哥。今天分享关于【RocketMQ如何保证消息顺序?】面试题。希望对大家有帮助;RocketMQ如何保证消息顺序?1000道互联网大厂Java工程师精选面试题-Java资源分享网RocketMQ是阿里巴巴开源的一款分布式消息队列,它能够保证消息的顺序性。为了保证消息顺序,RocketMQ采用了特定的机制和设计。具体来说,RocketMQ主要通过以下几个方式来确保消息的顺序:1.消息的
盘点原生JavaScript中直接触发事件的方式
javascript
JavaScript提供了多种方式来直接触发事件,无论是在用户交互、程序逻辑处理或是数据更新时。本文将全面探讨原生JavaScript中各种事件触发方式,并通过深入的技术案例分析,帮助开发者掌握这些方法在实际开发中的应用。使用dispatchEvent原生JavaScript中触发事件的核心方法是dispatchEvent。这个方法允许开发者为任何DOM元素触发几乎任何类型的事件,包括但不限于点击
Android Rxjava3 使用场景
2401_89760309
android
Observable>>hotKey=ApiManager.getInstance().getApiService().getHotKey();Observable.just(articleList).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).map(newFunction,Observable>>
深度学习学习笔记(第30周)
qq_51339898
深度学习 人工智能
一、摘要本周报的目的在于汇报第30周的学习成果,本周主要聚焦于基于深度学习的图像分割领域的常用模型U-net。 U-net是最常用、最简单的一种分割模型,在2015年被提出。UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络结构,因此称为UNet。UNet算法的关键创新是在解码器中引入了跳跃连接(SkipConnections),即将编码器中的特征图与解码器中对应的特征图进行连接
RocketMQ的集群架构是怎样的?
java1234_小锋
java java-rocketmq rocketmq 架构
大家好,我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助;RocketMQ的集群架构是怎样的?1000道互联网大厂Java工程师精选面试题-Java资源分享网RocketMQ是阿里巴巴开源的分布式消息中间件,广泛用于处理高吞吐量、高可用的消息队列服务。它的集群架构设计非常注重高可用性、可扩展性和高效性。以下是RocketMQ的集群架构主要组件和工作原理:1.集
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项  
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi