整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Spire.PDF for Java 10.4.9

Spire.PDF for Java 10.4.9 支持获取 PDF 文档中的 Javascript 内容

pire.PDF for Java 10.4.9 现已正式发布。该版本支持获取 PDF 文档中的 Javascript 内容,并新增了一个构造方法来解决 PdfInkAnnotation 在浏览器里没有显示的问题。此外,在提取 PDF 表格和扁平化表单域时遇到的两个问题也已成功被修复。详情请查阅以下内容。

新功能:

  • 新增一个构造方法 PdfInkAnnotation ink=new PdfInkAnnotation(Rectangle2D rect, List<int[]> inkList) 来解决添加的 PdfInkAnnotation 在浏览器里没有显示的问题。
  • 支持获取 PDF 文档中的 Javascript 内容。

问题修复:

  • 修复了表格中的文本没有被完整提取的问题。
  • 修复了扁平化表单域后保存 PDF 文档时程序抛出 java.lang.NullPointerException 异常的问题。

获取 Spire.PDF for Java 10.4.9 请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-JAVA.html

.什么是jsoup

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据,可操作 HTML 元素、属性、文本。

JSoup 功能

jsoup 实现 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。

  • 从 URL,文件或字符串中提取并解析 HTML。
  • 查找和提取数据,使用 DOM 遍历或 CSS 选择器。
  • 操纵 HTML 元素,属性和文本。
  • 根据安全的白名单清理用户提交的内容,以防止 XSS 攻击。
  • 输出整洁的 HTML。

JSoup 主要类

大多数情况下,下面给出 3 个类是我们需要重点了解的。

Jsoup 类

Jsoup 类是任何 Jsoup 程序的入口点,并将提供从各种来源加载和解析 HTML 文档的方法。 Jsoup 类的一些重要方法如下:

方法

描述

static Connection connect(String url)

创建并返回 URL 的连接。

static Document parse(File in, String charsetName)

将指定的字符集文件解析成文档。

static Document parse(String html)

将给定的 html 代码解析成文档。

static String clean(String bodyHtml, Whitelist whitelist)

从输入 HTML 返回安全的 HTML,通过解析输入 HTML 并通过允许的标签和属性的白名单进行过滤。

Jsoup 类的其他重要方法可以参见 - https://jsoup.org/apidocs/org/jsoup/Jsoup.html

Document 类

该类表示通过 Jsoup 库加载 HTML 文档。可以使用此类执行适用于整个 HTML 文档的操作。 Element 类的重要方法可以参见 - http://jsoup.org/apidocs/org/jsoup/nodes/Document.html

Element 类

HTML 元素是由标签名称,属性和子节点组成。 使用 Element 类,您可以提取数据,遍历节点和操作 HTML。 Element 类的重要方法可参见 - http://jsoup.org/apidocs/org/jsoup/nodes/Element.html

2.代码工程

实验目的

实现解析liuhaihua.cn首页list

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>jsoup</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

    </dependencies>
</project>

controller

package com.et.jsoup;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map=new HashMap<>();
        map=JsoupUtil.parseHtml("http://www.liuhaihua.cn/");
        map.put("msg", "HelloWorld");
        return map;
    }
}

工具类

package com.et.jsoup;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @author liuhaihua
 * @version 1.0
 * @ClassName JsoupUtil
 * @Description todo
 * @date 2024/06/24/ 9:16
 */

public class JsoupUtil {
        public static Map<String ,Object> parseHtml(String url){
            Map<String,Object> map=new HashMap<>();
            //1.生成httpclient,相当于该打开一个浏览器
            CloseableHttpClient httpClient=HttpClients.createDefault();
            CloseableHttpResponse response=null;
            //2.创建get请求,相当于在浏览器地址栏输入 网址
            HttpGet request=new HttpGet(url);
            //设置请求头,将爬虫伪装成浏览器
            request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
//        HttpHost proxy=new HttpHost("60.13.42.232", 9999);
//        RequestConfig config=RequestConfig.custom().setProxy(proxy).build();
//        request.setConfig(config);
            try {
                //3.执行get请求,相当于在输入地址栏后敲回车键
                response=httpClient.execute(request);

                //4.判断响应状态为200,进行处理
                if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK) {
                    //5.获取响应内容
                    HttpEntity httpEntity=response.getEntity();
                    String html=EntityUtils.toString(httpEntity, "utf-8");
                    System.out.println(html);

                    /**
                     * 下面是Jsoup展现自我的平台
                     */
                    //6.Jsoup解析html
                    Document document=Jsoup.parse(html);
                    //像js一样,通过标签获取title
                    System.out.println(document.getElementsByTag("title").first());
                    Elements blogmain=document.getElementsByClass("col-sm-8 blog-main");


                    //像js一样,通过class 获取列表下的所有博客
                    Elements postItems=blogmain.first().getElementsByClass("fade-in");
                    //循环处理每篇博客
                    List<Map>  list=new ArrayList<>();
                    for (Element postItem : postItems) {
                        Map<String,Object> row=new HashMap<>();
                        //像jquery选择器一样,获取文章标题元素
                        Elements titleEle=postItem.select(".entry-title a");
                        System.out.println("文章标题:" + titleEle.text());;
                        row.put("title",titleEle.text());
                        System.out.println("文章地址:" + titleEle.attr("href"));
                        row.put("href",titleEle.attr("href"));
                        //像jquery选择器一样,获取文章作者元素
                        Elements footEle=postItem.select(".archive-content");
                        System.out.println("文章概要:" + footEle.text());;
                        row.put("summary",footEle.text());
                        Elements view=postItem.select(".views");
                        System.out.println( view.text());
                        row.put("views",view.text());
                        System.out.println("*********************************");
                        list.add(row);
                    }
                    map.put("data",list);

                } else {
                    //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                    System.out.println("返回状态不是200");
                    System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //6.关闭
                HttpClientUtils.closeQuietly(response);
                HttpClientUtils.closeQuietly(httpClient);
            }
            return  map;
        }
        public static void main(String[] args) {
            parseHtml("http://www.liuhaihua.cn/");
        }

}

DemoApplication.java

package com.et.jsoup;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

  • 启动spring boot应用
  • 访问http://127.0.0.1:8088/hello,返回解析结果

4.引用

  • 官网:https://jsoup.org/
  • GitHub:https://github.com/jhy/jsoup/
  • http://www.liuhaihua.cn/archives/710776.html

、javaScript介绍

JavaScript是一种基于对象和事件驱动的、并具有安全性能的脚本语言

(客户端语言)

JavaScript特点

向HTML页面中添加交互行为

脚本语言,语法和Java类似

解释性语言,边解释边执行


JavaScript组成:ECMAScript 、DOM、BOM

基本结构:

<script type="text/javascript">

<!—

JavaScript 语句;

—>

</script >

示例:

……

<title>初学JavaScript</title>

</head>

<body>

<script type="text/javascript">

document.write("初学JavaScript");

document.write("<h1>Hello,JavaScript</h1>");

</script>

</body>

</html>

注:<script>…</script>可以包含在文档中的任何地方,只要保证这些代码在被使用前已读取并加载到内存即可

执行原理:


外部JS文件:

<script src="export.js" type="text/javascript"></script>

直接在HTML标签中使用:

<input name="btn" type="button" value="弹出消息框"

onclick="javascript:alert('欢迎你');"/>


二、基本常见语法:

1、核心语法:同时声明和赋值变量

var catName="皮皮";

2、数据类型:

undefined:var width;

变量width没有初始值,将被赋予值undefined;

null:表示一个空值,与undefined值相等;

number:var iNum=23; //整数

var iNum=23.0; //浮点数

boolean:true 和false;

string:一组被引号(单引号或双引号)括起来的文本

var string1="This is a string";

3、typeof运算符:

typeof检测变量的返回值

typeof运算符返回值如下函数

undefined:变量被声明后,但未被赋值

string:用单引号或双引号来声明的字符串

boolean:true或false

number:整数或浮点数

object:javascript中的对象、数组和nul

4、String对象:


5、数组:


数组的常用属性和方法

类别 名称 描述

属性 length 设置或返回数组中元素的数目

方法 join( ) 把数组的所有元素放入一个字符串,通过一个的分隔符进行分隔

sort() 对数组排序

push() 向数组末尾添加一个或更多 元素,并返回新的长度


6、逻辑控制语句:

if(条件)

{

//JavaScript代码;

}