找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1631|回复: 13

[文件操作] 求助一下各位大佬。批处理批量单个mhtml,mht转pdf

[复制链接]
发表于 2025-12-24 15:44:58 | 显示全部楼层 |阅读模式
求助一下各位大佬。批量单个mhtml转pdf的批处理,有一些网页保存下来是mhtml和mht 的格式,非常烦人,只能是单个打印成pdf,主要是太多了。
PDFXEdit也可以拖入多个,但只能是转成一个pdf文件。求助一下大佬,批处理批量将mhtml,mht,两种网页单个转成pdf的软件。谢谢。
发表于 2025-12-24 22:04:45 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-24 22:15 编辑

回复 1# gaoyinfei

利用 word 可以打开 *.mht, *.mhtml 文件和另存为 *.pdf 文件的功能。
以下代码存为 test.bat 运行...

  1. 2>1/* ::
  2. @echo off &dir /b/s/a-d *.mht *.mhtml|cscript /nologo /e:jscript "%~f0" &pause&exit/b */
  3. ws=WSH.stdin; w=WSH.CreateObject('Word.Application');
  4. w.DisplayAlerts=0, w.Visible=false;
  5. while (!ws.atendofstream) {
  6.   mF=ws.readline(), d=w.Documents.Open(mF), d.SaveAs(mF+'.pdf',17), d.Close(); }
  7. w.quit(); WSH.quit();
复制代码

评分

参与人数 1技术 +1 收起 理由
gaoyinfei + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-12-25 14:27:31 | 显示全部楼层
回复 2# aloha20200628
非常感谢,能用,现在还在试验。昨天折腾了一天,精简版的word打不开,提示缺少outlook,没有办法,想单独安装一个单文件的,没有办法安装,中途退出了,又试了几个安装也不行。今天又下载了一个安装版的,又提示要删除以前版本,
又找office卸载软件,终于成功了。估计没有什么问题了。
 楼主| 发表于 2025-12-25 15:51:26 | 显示全部楼层
回复 2# aloha20200628
https://www.123865.com/s/F2GbVv-m1fod

大神能不能烦劳您再修改一个,最好是等同于原网页大小,因为这样转出来的图片有一半不见了。附三个示例网页。谢谢。辛苦了。
 楼主| 发表于 2025-12-26 00:31:50 | 显示全部楼层
我从office2010-2021依次装了一遍,发现打开的网页文件都是缩小的,反而wps保存的很完整,请问可不可以调用wps,这样转出来的话就会很完整了。谢谢。
发表于 2025-12-26 11:27:53 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-26 11:29 编辑

回复 5# gaoyinfei

先试试以下代码在 cmd 命令行直接启运 wps.exe 完成当前目录下单个 test.mht 或 test.mhtml 转为 test.pdf

  1. wps.exe -convert-to pdf -headless -o "test.pdf" "test.mht"
复制代码

  1. wps.exe -convert-to pdf -headless -o "test.pdf" "test.mhtml"
复制代码
如果以上实测成功,可用以下批量处理代码...

  1. @echo off & for /f "delims=" %%F in ('dir /s/b/a-d *.mht *.mhtml') do wps.exe -convert-to pdf -headless -o "%%~dpnF.pdf" "%%F"
  2. pause&exit/b
复制代码
 楼主| 发表于 2025-12-26 19:15:00 | 显示全部楼层
回复 6# aloha20200628 我试了一个,wps是无效命令。我把三个网页示例mhtml格式的放在了网盘,地址在我昨天的回复,烦劳您看下。谢谢。
发表于 2025-12-26 19:49:40 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-26 19:55 编辑

回复 7# gaoyinfei

五楼已述用wps的结果,假设wps系统安装在 D: 盘,用代码 dir /b/s/a-d d:\wps.exe 查找其真实位置,假设查找结果为  D:\Program Files (x86)\WPS Office\bin\wps.exe,再将6楼代码中的 wps.exe 改为 "D:\Program Files (x86)\WPS Office\bin\wps.exe" 即可...

另》请选择一个较小尺寸的样本文件放到百度云盘,便于下载...
 楼主| 发表于 2025-12-26 23:51:56 | 显示全部楼层
回复 8# aloha20200628 https://pan.baidu.com/s/1bLGiSCy1X_wq9yuBqR8BXA?pwd=gJgS 已经将文件在网盘分享。
刚才我试了一下,按照您说的方法,又在变量那里设置了一下,能打开文件,但是出现无法找到pdf和mhtml文件,相比较,网页里面都是一些大图,wps都是显示正常。word只能显示一半。附上出错的图片。
还要劳烦您一下。谢谢。








   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2025-12-29 20:31:33 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-29 20:49 编辑

回复 9# gaoyinfei

   用 win11 内置的 word 2021 实测了6个示例样本,均有加载问题,用2楼代码强行转换的结果与源文件相比有内容缺失和错位,再用第三方 wkHTMLtoPDF.exe 实测,被报错无法解析外部资源或用户数据路径等问题而失败...
   只好回到 mht, mhtml 的原生环境即浏览器中尝试,好在 msedge 浏览器(v142版)可以完好打开显示全部示例样本,但采用 msedge 命令行批处理方法必须启用 headless 方式,此方式不能完整继承交互方式的性能,最终归于失败。如此只能参考利用模拟键自动操作 msedge 的方法,获得基本成功,但要满足以下一些条件以便确保模拟键自动操作得以成功:
   一。源文件名尽量不要包含中文字符,如用英文字母+数字命名
   二。须关闭 msegde 浏览器运行时弹窗,如版本更新,翻译当前页面等
   三。要根据批处理中内容最多和最复杂的源文件调整代码中的变量 tk 值(毫秒数)

以下代码存为 test.bat 运行,与源文件 *.mht, *.mhtml 同目录,代码中变量 edge=... 用来定义 msedge.exe 的安装位置(须根据实况修改),转换结果文件 *.pdf 存储在 msedge 浏览器默认的下载目录,运行本脚本之前,当前目录中不要有与源文件同名的PDF文件。

  1. 2>1/* ::
  2. @echo off &taskkill /f /im msedge.exe>nul 2>nul
  3. dir /b/a-d *.mht *.mhtml|cscript /nologo /e:jscript "%~f0"
  4. taskkill /f /im msedge.exe>nul 2>nul
  5. for /f "delims=" %%d in ('powershell -nop -c "(gc '%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Preferences' -enc utf8|convertFrom-json).savefile.default_directory" ') do dir /b/a-d "%%d\*.pdf"
  6. pause&exit/b */
  7. s=WSH.stdin, w=WSH.createObject('wscript.shell'), tk=6000;
  8. edge='C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe';
  9. while (!s.atendofstream) {
  10.    inF=s.readline(), outF=inF+'.pdf';
  11.    w.run('"'+edge+'" "file://c:/temp/'+inF+'"');
  12.    WSH.sleep(2000), w.sendkeys('^p'); //打印输出
  13.    WSH.sleep(tk), w.sendkeys('{enter}'); //确认'另存为'
  14.    WSH.sleep(1000), w.sendkeys(outF); //键入输出文件名
  15.    w.sendkeys('{enter}'), WSH.sleep(3000), w.sendkeys('%{F4}'); //关闭浏览器窗口
  16.    WSH.sleep(3000); }
  17. WSH.quit();
复制代码

评分

参与人数 1技术 +1 收起 理由
gaoyinfei + 1 乐于助人

查看全部评分

发表于 2025-12-29 20:46:26 | 显示全部楼层
回复 9# gaoyinfei

10楼代码第7行中的变量 tk 值是实测6个示例样本之后的调试结果,即其中内容最多最复杂的样本文件打印输出所需的完全渲染时间(与当前软硬件条件有关),简单起见,可以先估算一个足够大的数值开始尝试...
 楼主| 发表于 2025-12-31 00:09:44 | 显示全部楼层
回复 10# aloha20200628

也不知道是不是我的电脑的原因,运行程序一闪而过,路径是对照您的方法,我是安装了edge。路径和您的一样。我是初学,这个问题搞不定。望您再费心一下。谢谢。
发表于 2025-12-31 10:09:13 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-31 10:21 编辑

回复 12# gaoyinfei

用模拟键自动操控浏览器是不得已而取之的解决方案,确实需要周全伺候,10楼已经逐条明述。
我实测6个示例样本的步骤如下以供参考(备注:实测采用的浏览器 msedge.exe 是v142版)...
一。先走一遍浏览器交互过程,以便落实必要的默认参数》用浏览器打开任一个mht或mhtml文件,ctrl+p组合键打开‘打印’窗口,确认打印机栏当前值是否为‘另存为PDF’,若否,一定要改为‘另存为PDF’,然后回车键弹出‘另存为’对话框,在默认下载目录中等待键入*.pdf文件名,键入文件名如 1.pdf 后回车键,即可完成整个交互过程。
二。创建一个测试目录如 d:\test,将6个示例样本文件*.mht, *.mhtml复制到其中,用数字1-6分别更名1.mht, 2.mht, 3.mhtml,...
三。将10楼代码存为test.bat,放在 d:\test 目录中,核实msedge.exe真实路径,确保与代码中的 edge 变量值一致(代码中须将真实路径中的路径分隔符加倍代之),然后开跑 test.bat  
 楼主| 发表于 2025-12-31 23:28:34 | 显示全部楼层
回复 13# aloha20200628
好的,非常感谢。我再试一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:05 , Processed in 0.031291 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表