开发原因:
最近前端老师布置作业,要求把书上的一章所有案例都抄一遍。本着借鉴的态度,在网上找了一圈资源,没有找到前端书上的案例源代码。因为有扫描版的书籍的pdf文件,想到可以用qq截图的文字扫描功能来复制粘贴。
问题来了,这需要依次截图几十张,手动创建几十个html文件,手动复制粘贴,麻烦。
所以,可不可以只需要一堆截图,一个程序,就可以直接生成好所有的html文件。
开发环境:
java1.8+
一、阿里云文字识别接口
文字识别需要接口来实现,这里选择了阿里云文字识别接口。当然也可以选择腾讯、科大讯飞等。
👉网站传送:阿里云文字识别官网
1、测试效果
👉:测试网页
使用之前可以在官方测试一下 接口的实现结果是否达到自己的标准
下面是我自己的图的测试效果,效果还是很不错的
书上的原图:
官方接口测试:
可以看到内容识别没有差错,所有内容均识别成功
返回json串:
观察一下json返回的数据,发现获取到数据中的"content"内容即可
2、依照官方示例使用
👉官方文档:官方文档
阿里云有专门的文字识别接口,使用如下
示例代码是上传网络中的图片,而不是上传电脑本地的图片,如何上传电脑本地的图片,示例如下
详细案例代码再文章的最后部分
读取图片部分的代码
//读取文件夹照片
java.io.InputStream bodySyream = com.aliyun.darabonba.stream.Client.readFromFilePath("文件名");
//将照片写入request
RecognizeAdvancedRequest recognizeAdvancedRequest = new RecognizeAdvancedRequest().setBody(bodySyream);
RecognizeAdvancedResponse response= client.recognizeAdvanced(recognizeAdvancedRequest);
二、案例具体实现
需要实现的功能步骤如下:
-
读取指定文件夹下的所有图片文件
-
依次遍历图片文件
- 将图片传入接口
- 将返回的结果以html文件格式输出指定目录
读取所有文件
获取指定目录下的所有文件的文件名
//new一个存放图片的目录
File file=new File("C:\\Users\\bhy\\Desktop\\html\\pictures");
//list()方法获得目录下所有文件的文件名
String [] fileName = file.list(); //用于存放文件底下所有子文件名的数组
遍历处理文件和图片写入接口
for(int i = 0 ; i <fileName.length;i++)
{
//通过一个阿里云的库获取图片的输入流 (具体依赖导入放在文末
java.io.InputStream bodySyream = com.aliyun.darabonba.stream.Client.readFromFilePath("C:\\Users\\bhy\\Desktop\\html\\pictures\\"+fileName[i]);
//图片传入接口
//将照片写入request
RecognizeAdvancedRequest recognizeAdvancedRequest = new RecognizeAdvancedRequest().setBody(bodySyream);
...
}
处理返回结果
RecognizeAdvancedResponse response= client.recognizeAdvanced(recognizeAdvancedRequest);
//获取json数据中的内容
JSONObject jsonObject = new JSONObject(response.getBody().getData());
String outcome = jsonObject.getString("content");
//测试内容
//System.out.println(jsonObject.getString("content"));
//将返回结果输出html文件放入指定文件夹中
File writeName = new File("C:\\Users\\bhy\\Desktop\\html\\outcomes\\html"+String.valueOf(i+1)+".html");
writeName.createNewFile();
try (FileWriter writer = new FileWriter(writeName);
BufferedWriter out = new BufferedWriter(writer)
) {
out.write(outcome);
out.flush(); // 把缓存区内容压入文件
}
三、效果
输入(书上的截图):
程序执行后的输出结果:
网页基本上都显示成功,nice👍
四、 pom依赖 和 具体代码实现
maven导入依赖pom.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.aliyun</groupId>
<artifactId>sample</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>sample</name>
<description>Alibaba Cloud SDK Code Sample for Java
</description>
<url>https://github.com/aliyun/alibabacloud-code-sample</url>
<licenses>
<license>
<name></name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>aliyundeveloper</id>
<name>Aliyun SDK</name>
<email>aliyunsdk@aliyun.com</email>
</developer>
</developers>
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<scm>
<connection></connection>
<developerConnection></developerConnection>
<url></url>
</scm>
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ocr_api20210707</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>darabonba-stream</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-console</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-util</artifactId>
<version>0.2.13</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>1.1.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>sonatype-nexus-staging</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<encoding>UTF-8</encoding>
<doclint>none</doclint>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.aliyun.sample.Sample</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
java代码
import com.aliyun.ocr_api20210707.Client;
import com.aliyun.ocr_api20210707.models.RecognizeAdvancedRequest;
import com.aliyun.ocr_api20210707.models.RecognizeAdvancedResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import org.json.JSONObject;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
public class test {
public static void main(String[] args) throws Exception {
// 1 创建Config实例并初始化
Config authConfig = new Config();
authConfig.accessKeyId = "阿里云用户的accesskeyid";
authConfig.accessKeySecret = "阿里云用户的accesskeysecret";
// 文字识别的服务入口
authConfig.endpoint = "ocr-api.cn-hangzhou.aliyuncs.com";
Client client = new Client(authConfig);
// 2 创建RuntimeObject实例并设置运行参数
RuntimeOptions runtime = new RuntimeOptions();
// 是否开启失败重试
runtime.autoretry = true;
// 最大重试次数
runtime.maxAttempts = 5;
// 3 创建API请求并设置参数
//设置图片文件
File file=new File("C:\\Users\\bhy\\Desktop\\html\\pictures");
String [] fileName = file.list(); //用于存放文件底下所有子文件名的数组
for(int i = 0 ; i <fileName.length;i++)
{
//读取文件夹照片
java.io.InputStream bodySyream = com.aliyun.darabonba.stream.Client.readFromFilePath("C:\\Users\\bhy\\Desktop\\html\\pictures\\"+fileName[i]);
//将照片写入request
RecognizeAdvancedRequest recognizeAdvancedRequest = new RecognizeAdvancedRequest().setBody(bodySyream);
RecognizeAdvancedResponse response= client.recognizeAdvanced(recognizeAdvancedRequest);
//获取json数据中的内容
JSONObject jsonObject = new JSONObject(response.getBody().getData());
String outcome = jsonObject.getString("content");
//测试内容
//System.out.println(jsonObject.getString("content"));
File writeName = new File("C:\\Users\\bhy\\Desktop\\html\\outcomes\\html"+String.valueOf(i+1)+".html");
writeName.createNewFile();
try (FileWriter writer = new FileWriter(writeName);
BufferedWriter out = new BufferedWriter(writer)
) {
out.write(outcome);
out.flush(); // 把缓存区内容压入文件
}
}
}
}