网页转pdf,这个工具真好用
网页转pdf,这个工具真好用
http://doctron.lampnick.com/
doctron在线体验demo
还有挺多其他的,可以自己搜索,但是都不符合我的预期。
在浏览器中启用打印功能,您可以通过右键点击选择“打印”或按快捷键Ctrl+P。随后,在弹出的打印设置窗口中,挑选合适的打印机,并勾选“另存为PDF”选项。完成这些步骤后,点击“保存”按钮,即可将文件下载为PDF格式。若需使用本地软件进行转换本地html转换成pdf,请按照相应软件的操作指南进行操作。
Doctron,这是我今天要介绍的重头戏。
Doctron是一款依托于Docker技术的文档转换服务,其特点是无状态、易于使用、响应迅速且保证输出质量。目前本地html转换成pdf,该服务能够实现HTML到PDF以及图片格式的转换,其中图片转换采用了基于Chrome(Chromium)浏览器的内核,以确保转换效果。此外,Doctron还支持在PDF文档上添加水印功能。
管他的网页转pdf,这个工具真好用,先把代码下载下来再说
克隆代码,请访问链接:https://gitcode.net/mirrors/lampnick/doctron.git,执行git clone命令。
仓库
运行
go build
执行命令:./doctron,配置文件为conf目录下的default.yaml。
运行截图
转pdf,访问
访问http://127.0.0.1:8080/convert/html2pdf?u=doctron&p=lampnick&url=,只需将链接中的url替换为你想要转换的网址,即可完成操作。
转换效果
接下来,我将编写程序以实现所需网页的大规模转换,然而,我面临的网页转换任务存在两项特定的要求。
1、网站需要会员登录,不然只能看得到一部分
2、需要把网站的头和尾去掉的
这让我感到很棘手,对go语言并不熟悉,尽管如此我还是硬着头皮尝试,相信一定有方法可以打开这个网址网页转pdf,这个工具真好用,于是我开始在代码中逐一排查,边找边调试,经过不懈的努力本地html转换成pdf,最终成功找到了调用该网址的位置。
第一步:添加网站用户登录cookie
添加cookie之前
添加cookie之后
第二步:去掉网站头尾
chromedp执行评估操作,指定选择器为`$('.header')`,并对其应用CSS样式,将`display`属性设置为`none`,以实现隐藏效果。
将具有类名“btn-group”的元素样式设置为“display:none”,使其不可见。
选择器“$.container .container:first”对应的元素,其CSS样式中的“display”属性将被设置为“none”,从而实现隐藏效果。
将具有类名“breadcrumb”的元素样式设置为“display:none”。
将类名为'.footer'的元素样式设置为"不显示",并将缓冲区变量buf的内容进行操作。
打开网页后执行js代码把头尾隐藏掉
第三步:程序化,批量自动生成pdf
try {
fileName = pdfFile中的斜杠被冒号所替代。
filePath变量被赋值为folder路径与fileName文件名连接后的结果。
创建一个名为srcFile的File对象,其路径设置为filePath。
创建一个新文件夹,路径为/Volumes/disk2/myproject,随后加上分隔符,再接上cl变量所表示的路径。
创建一个新文件对象,该对象指向位于新文件夹中的指定文件,命名为destFile。
if(destFile.exists()){
return;
}
if(srcFile.exists()){
//移动到对应目录
if(!newFolder.exists()){
newFolder.mkdirs();
}
FileUtils执行了文件移动操作,将源文件(srcFile)转移至目标文件(destFile)。
return;
}
if(!newFolder.exists()){
newFolder.mkdirs();
}
String url = "请访问以下网址进行转换操作,该地址为本地服务器地址,端口号为8888,具体路径为convert/html2pdf,查询参数包括用户名为doctron,项目名为lampnick,以及需要转换的URL链接,具体链接内容如下:";
HttpEntity entity = new HttpEntity(null, null);
初始化RestTemplate对象,命名为restTemplate。
ResponseEntity通过 restTemplate,执行对指定 URL 的 GET 请求,将请求实体与 byte[] 类型的响应数据关联,并完成数据交换。
if (bytes.getBody().length <= 100) {
if(urlList.containsKey(urlhref)){
Integer failCount = urlList.get(urlhref);
if(failCount > 3){
输出信息显示:“下载未果,原因如下:客户端标识为” + cl + “,文件名为” + pdfFile + “,链接地址为” + urlhref;”
return;
}
failCount++;
将urlhref对应的失败次数记录到urlList中,具体操作为:urlList.put(urlhref, failCount)。
}else{
urlList.put(urlhref , 1);
}
在指定文件夹内,针对给定的类和PDF文件,对URL链接进行PDF生成处理。
}else{
if (!destFile.exists()) {
try {
destFile.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
尝试执行以下操作:以输出流的形式创建一个指向目标文件的连接,并确保在操作完成后自动关闭该连接(FileOutputStream out = new FileOutputStream(destFile);)。
输出流写入字节内容,起始位置为0,长度等于字节内容本身的长度。
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
最终成果:
文件夹分类存放
pdf文件