Java中将PDF转换为HTML可以使用开源库Apache PDFBox来实现。以下是一个简单的示例,说明如何使用PDFBox进行转换:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Entities;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
public class PdfToHtmlConverter {
public static void convertPdfToHtml(String pdfFilePath, String htmlOutputPath) {
try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
if (!document.isEncrypted()) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
// 创建一个HTML文档对象
Document htmlDocument = Jsoup.parseBodyFragment("<html><head><title>Converted PDF</title></head><body></body></html>");
for (int page = 0; page < document.getNumberOfPages(); ++page) {
// 从PDF页面创建一个BufferedImage
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 96, ImageType.RGB);
// 将图片转为Base64并添加到HTML中(这里假设我们只转换为图片形式的HTML)
String base64Img = getBase64Image(image);
Element imgElement = new Element("img").attr("src", "data:image/png;base64," + base64Img);
htmlDocument.body().appendChild(imgElement);
// 如果需要文本形式的HTML,则需解析图像中的文本,但这通常更为复杂,PDFBox本身并不直接提供纯文本HTML转换
}
// 输出HTML到文件
Files.write(Paths.get(htmlOutputPath), htmlDocument.html().getBytes(StandardCharsets.UTF_8));
} else {
System.err.println("The PDF file is encrypted and cannot be converted directly.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getBase64Image(BufferedImage image) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] imageData = os.toByteArray();
return Base64.getEncoder().encodeToString(imageData);
}
public static void main(String[] args) {
convertPdfToHtml("input.pdf", "output.html");
}
}
// 注意:上述代码仅演示了如何将PDF每一页转换为PNG图片,并嵌入到HTML中。
// 要获得纯文本和格式的HTML转换,可能需要更复杂的逻辑来解析PDF的文本布局和样式。
实际上,PDFBox并不直接支持将PDF内容以保持原始格式的方式完美转换成HTML。如果你需要更高级的转换,例如保留文本、表格和列表等格式,你可能需要结合其他工具或服务,或者编写自定义的PDF解析逻辑来模拟HTML结构。
在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。
• 来源:linux.cn • 作者:Seth Kenlon • 译者:MjSeven •
(本文字数:4904,阅读时长大约:6 分钟)
下载我们整理的 curl 备忘录。要在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。
curl 通常被视作一款非交互式 Web 浏览器,这意味着它能够从互联网上获取信息,并在你的终端中显示,或将其保存到文件中。从表面看,这是 Web 浏览器,类似 Firefox 或 Chromium 所做的工作,只是它们默认情况下会渲染信息,而 curl 会下载并显示原始信息。实际上,curl 命令可以做更多的事情,并且能够使用多种协议与服务器进行双向传输数据,这些协议包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等。对于普通终端用户来说,这是一个有用的工具;而对于系统管理员,这非常便捷;对于微服务和云开发人员来说,它是一个质量保证工具。
curl 被设计为在没有用户交互的情况下工作,因此与 Firefox 不同,你必须从头到尾考虑与在线数据的交互。例如,如果想要在 Firefox 中查看网页,你需要启动 Firefox 窗口。打开 Firefox 后,在地址栏或搜索引擎中输入要访问的网站。然后,导航到网站,然后单击要查看的页面。
对于 curl 来说也是如此,不同之处在于你需要一次执行所有操作:在启动 curl 的同时提供需要访问的互联网地址,并告诉它是否要将数据保存在终端或文件中。当你必须与需要身份验证的网站或 API 进行交互时,会变得有点复杂,但是一旦你学习了 curl 命令语法,它就会变得自然而然。为了帮助你掌握它,我们在一个方便的 备忘录 中收集了相关的语法信息。
你可以通过提供指向特定 URL 的链接来使用 curl 命令下载文件。如果你提供的 URL 默认为 index.html,那么将下载此页面,并将下载的文件显示在终端屏幕上。你可以将数据通过管道传递到 less、tail 或任何其它命令:
$ curl "http://example.com" | tail -n 4
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div></body></html>
由于某些 URL 包含特殊字符,shell 通常会将其解释,因此最安全的做法用引号将 URL 包起来。
某些文件无法很好的在终端中转换显示。你可以使用 --remote-name 选项使文件根据服务器上的命名进行保存:
$ curl --remote-name "https://example.com/linux-distro.iso"
$ ls
linux-distro.iso
或者,你可以使用 --output 选项来命名你想要下载的内容:
curl "http://example.com/foo.html" --output bar.html
因为 curl 不是交互式的,所以很难浏览页面上的可下载元素。如果你要连接的远程服务器允许,可以使用 curl 来列出目录的内容:
$ curl --list-only "https://example.com/foo/"
如果你正在下载一个非常大的文件,你可能会发现有时候必须中断下载。curl 非常智能,可以确定下载从何处中断并继续下载。这意味着,下一次当你下载一个 4GB 的 Linux 发行版的 ISO 出现问题时,就不必重新开始了。--continue-at 的语法有点不寻常:如果你知道下载中断时的字节数,你可以提供给 curl;否则,你可以使用单独的一个破折号(-)指示 curl 自动检测:
$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso"
如果你需要下载多个文件而不是一个大文件,那么 curl 可以帮助你解决这个问题。假设你知道要下载的文件的位置和文件名模式,则可以使用 curl 的序列标记:中括号里是整数范围的起点和终点。对于输出文件名,使用 #1 表示第一个变量:
$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp"
如果你需要使用其它变量来表示另一个序列,按照每个变量在命令中出现的顺序表示它们。例如,在这个命令中,#1 指目录 images_000 到 images_009,而 #2 指目录 file_1.webp 至 file_4.webp:
$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" --output "file_#1-#2.webp"
你也可以仅使用 curl 和 grep 进行一些基本的 Web 抓取操作,以找到想要下载的内容。例如,假设你需要下载与正在归档网页关联的所有图像,首先,下载引用了图像的页面。将页面内通过管道传输到 grep,搜索所需的图片类型(在此示例中为 PNG)。最后,创建一个 while 循环来构造下载 URL,并将文件保存到你的计算机:
$ curl https://example.com |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://example.com/"${i}" -o "${i##*/}"; \
done
这只是一个示例,但它展示了 curl 与 Unix 管道和一些基本而巧妙的解析结合使用时是多么的灵活。
用于数据交换的协议在计算机发送通信的数据包中嵌入了大量元数据。HTTP 头是数据初始部分的组件。在连接一个网站出现问题时,查看这些报文头(尤其是响应码)会有所帮助:
curl --head "https://example.com"
HTTP/2 200
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256
响应 200 通常是 HTTP 成功指示符,这是你与服务器连接时通常期望的结果。著名的 404 响应表示找不到页面,而 500 则表示服务器在处理请求时出现了错误。
要查看协商过程中发生了什么错误,添加 --show-error 选项:
$ curl --head --show-error "http://opensource.ga"
除非你可以访问要连接的服务器,否则这些问题将很难解决,但是 curl 通常会尽力连接你指定的地址。有时在网络上进行测试时,无休止的重试似乎只会浪费时间,因此你可以使用 --fail-early 选项来强制 curl 在失败时迅速退出:
curl --fail-early "http://opensource.ga"
300 这个系列的响应更加灵活。具体来说,301 响应意味着一个 URL 已被永久移动到其它位置。对于网站管理员来说,重新定位内容并留下“痕迹”是一种常见的方式,这样访问旧地址的人们仍然可以找到它。默认情况下,curl 不会进行 301 重定向,但你可以使用 --localtion 选项使其继续进入 301 响应指向的目标:
$ curl "https://iana.org" | grep title
<title>301 Moved Permanently</title>
$ curl --location "https://iana.org"
<title>Internet Assigned Numbers Authority</title>
如果你想要在访问短网址之前先查看它们,那么 --location 选项非常有用。短网址对于有字符限制的社交网络(当然,如果你使用 现代和开源的社交网络 的话,这可能不是问题),或者对于用户不能复制粘贴长地址的印刷媒体来说是有用处的。但是,它们也可能存在风险,因为其目的地址本质上是隐藏的。通过结合使用 --head 选项仅查看 HTTP 头,--location 选项可以查看一个 URL 的最终地址,你可以查看一个短网址而无需加载其完整的资源:
$ curl --head --location "<https://bit.ly/2yDyS4T>"
一旦你开始考虑了将探索 web 由一条命令来完成,那么 curl 就成为一种快速有效的方式,可以从互联网上获取所需的信息,而无需麻烦图形界面。为了帮助你适应到工作流中,我们创建了一个 curl 备忘录 ,它包含常见的 curl 用法和语法,包括使用它查询 API 的概述。
via: opensource.com
作者: Seth Kenlon 选题: lujun9972 译者: MjSeven 校对: wxy
本文由 LCTT 原创编译, Linux中国 荣誉推出
Web应用日益复杂,前端开发也发生了翻天覆地的变化变得盘根错节,到今天已经非常复杂和庞大了!用html、css、javascript老老实实的写个页面的时代早已过去。而现在要完成工作需要借助很多额外的东西,比如工程化、自动化等等。这样才显得有逼格,才像一个真正的程序猿。如果说还停留在切个图,下载个js效果怼上去的阶段,显然你会脱节的。由此也带动了很多前端工具的发展,以Gulp、Grunt、webpack等为代表的构建工具犹如雨后春笋般的生长,而webpack更为流行,使用更为广泛,可以说它现在已经是前端开发的的标配了。所以这次我会用一个系列的文章详细去介绍webpack,由浅入深解析webpack,再通过实战例子配合,掌握以后足以解决你工作中的问题。同时这套系列文章是针对最新的4.X的版本。
webpack是一款工具?什么工具?有人管他叫打包工具,这样太low了。可以看看webpack官网,页面底部的一个个小头像代表的是给webpack赞助过的人,鼠标放上去还可以看到他赞助了多少钱。就凭这么多人的赞助,也不能叫这么low逼的名,听得好像是个压缩软件。得起个高大上的名,叫构建工具(当然打包的功能是它的一大特色)
前端里的什么工程化呀自动化呀,这些东西有个特点,就是源代码无法在浏览器里直接运行,必需通过编译才行。那构建工具其实就能做这些事情。如:
代码编译,把ES6转成ES5
模块合并,把多个文件合并成一个文件,减少http请求
代码压缩优化,抽取公共代码,减少代码量
这些都是构建工具要做的事情,但是这些东西都是用代码去实现,让他们通过代码自动完成这些事情,解放我们的生产力。webpack最大的一个特色就是打包,官网的那张大图所体现的就是打包的功能,并能解决模块间相互依赖的问题,它能把乱成一锅粥的文件打包成清晰的文件,快刀斩乱麻!其次webapck是以模块为基石,对于模块化的支持体现的淋漓尽致,在webpack中所有的内容都是模块,一个图片、一个css文件、一个js文件都是一个模块。
注意:
配置文件犹如webpack的大脑,webpack的工作都是通过配置文件完成的。编译哪个文件、怎么编译、编译成什么样、输出为什么等等,所有的操作都是按配置文件里的内容来完成的,所以配置文件一个重量级的嘉宾,webapck想要运行的话配置文件是必不可少的东西。
配置文件有6个核心的东西组成,就像JavaScript由ECMAScript、DOM、BOM三部分组成一样。
entry:入口文件(你要打包,就告诉我打包哪些)
output:出口文件(我打包完了,给你放到哪里)
module:模块(放lorder,编译浏览器不认识的东西)
plugins:插件(辅助开发,提高开发效率)
devServer:服务器(webpack提供的本地服务器)
mode:模式,分为开发模式、生产模式。此为4.X里新增的
注意:
在项目文件夹(我的为webpack-demo)的根目录下创建必要的文件夹及文件,结构如下图 :
show.js代码如下
//声明一个函数,最终做为一个模块被导出
const show=content=>{
const box=document.getElementById("box");
box.innerHTML=`你好!${content}`;
}
export {show}; //ES6导出模块的语法
main.js代码如下
import {show} from './show'; //ES6导入模块的语法,‘./’为main.js的根目录src,ES6里导入的模块为js话不需要加后缀名
show('kaivon');
index.html代码如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="box"></div>
</body>
</html>
package.json.js代码如下
const path=require('path'); //nodejs的语法,引入路径模块,为了输出的时候找绝对路径
module.exports={
entry:'./src/main.js', //入口文件为main.js
output:{ //输出
path:path.resolve(__dirname,'dist'), //path.resolve为nodejs的固定语法,用于找到当前文件的绝对路径
filename:'bundle.js' //输出的文件名
},
};
在终端里执行命令webpack后,不出意外的话终端里显示如下就表示成功了
同时看一下文件结构目录,多了一个dist文件夹,以及bundle.js文件。这两个就是webpack打包生成的文件,如下
在index.html文件里引入bundle.js文件后,用浏览器打开index.html,可以看到页面里有内容了。这就代表我们已经使用webpack打包了一个文件,它的基本用法已经跑了。
<body>
<div id="box"></div>
<script src="dist/bundle.js"></script>
</body>
语法
1、entry 入口文件
2、output 出口文件
1、输出一个文件,写个字符串
2、输出多个文件,文件名前面加个标识符(id/name/hash)
1、路径必需为绝对路径
2、__dirname是nodejs里的一个模块,表示当前文件的绝对路径
3、path为nodejs的系统模块,直接引入后调用path.resolve(__dirname,'输出文件的路径');
步骤
当我们在终端里输入webpack命令的时候webpack会按以下的步骤开始工作
先打开根目录下的webpack.config.js
找entry(入口)属性的值
进入到main.js里,看到它又依赖show.js,再找到show.js
把main.js与show.js合并成一个js文件
在webpack.config.js里找到output(出口)属性
解析output里的path与filename属性的值
把第4步合并成的js文件放到dist文件夹里,并起个名字叫bundle.js
下面演示多入口,在src目录里新建两个js文件,1.js与2.js,代码如下:
1.js
console.log('这是第一个入口文件!');
2.js
console.log('这是第二个入口文件!');
修改webpack.config.js文件
const path=require('path');
//两个entry分别一一对应两个filename
module.exports={
//entry:['./src/1.js','./src/2.js'],
entry:{
one:'./src/1.js',
two:'./src/2.js'
},
output:{
//filename:'bundle.js',
filename:'[name].bundle.js' //可以以name/id/hash放在中括号里区分文件名
path:path.resolve(__dirname,'dist'),
}
}
分别注释对应的entry与filename,在终端里执行命令:webpack后,查看dist文件夹及运行index.html后查看效果
1、当entry为数组的时候,webpack会把数组里所有文件打包成一个js文件
2、当entry为对象的时候,webpack会把对象里的文件分别打包成多个文件
文章里所说到的只是entry与output的常用配置,它的配置不止这些,可以参考以下链接
entry的所有配置:https://webpack.js.org/concepts/entry-points/
output的所有配置:https://webpack.js.org/concepts/output/
资料下载:https://pan.baidu.com/s/147HSaocIRlo8nZx2bwEDzg
下一篇:Webpack 4.X 从入门到精通 - plugin(二)
*请认真填写需求信息,我们会在24小时内与您取得联系。