在单张纸上批量打印多个图像
Posted
技术标签:
【中文标题】在单张纸上批量打印多个图像【英文标题】:BATCH Multiple Image Printing on Single Sheet 【发布时间】:2021-07-28 17:20:06 【问题描述】:我在一个文件夹中有 1000 张图像,我想调整大小并打印每张 12 到 24 张图像。使用 BATCH 脚本从文件夹中收集图像并输出一个 html 脚本,每页 3 列和 6 行,在 Firefox 中打开(缩小以适应和打印)。
如何在 html 脚本的每张图片上添加文件名、日期。
del "c:\zz.html"
setlocal EnableDelayedExpansion
set /a "p=1"
set /a "m=2"
set /a "w=4"
echo ^<table cellspacing="5" style="border:1px solid black;"^> >>"c:\zz.html"
for /f "delims=" %%i in ('dir /s/b /a-d f:\jpeg\mdl\*.jpg') do (
set /a "p=p+1"
echo !p!
if !p! == !m! (
set "bo=")
if !p! == !w! (
set "p=1"
set "bo=<tr>")
echo !bo!^<td^>^<img width=320 height=260 src="file:\\%%i"^> >>"c:\zz.html"
)
start C:\Program Files\Mozilla Firefox\firefox.exe "c:\zz.html" &exit
这是可用的代码
del "c:\zz.html"
setlocal EnableDelayedExpansion
set /a "p=1"
set /a "m=2"
set /a "w=4"
echo ^<table cellspacing="5" style="border:1px solid black;"^> >>"c:\zz.html"
for /f "delims=" %%i in ( 'dir /s/b /a-d %1\*.*' ) do (
echo %1
set /a "p=p+1"
echo !p!
if !p! == !m! (
set "bo=")
if !p! == !w! (
set "p=1"
set "bo=<tr>")
echo !bo!^<td^>^<img width=320 height=260 src="file:\\%%i"^>^<br^>%%~nxi >>"c:\zz.html"
)
start I:\HEVC\m-oz\m.f -no-remote -profile "I:\HEVC\m-ozy" "c:\zz.html" &exit
此注册表项提供右键单击以打印任何文件夹。 (根据需要更改源文件夹)
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\==jam==j]
@="Print===ALL=IN=1=="
[HKEY_CLASSES_ROOT\Directory\shell\==jam==j\Command]
@="I:\\s\\PPP_Print\\p.cmd \"%1\""
【问题讨论】:
如果您只想布局要打印的图像,我会推荐 Imagemagick 中的montage
命令...imagemagick.org/Usage/montage
比如montage -label "%f %[EXIF:DateTimeOriginal]" c:\dir\*.jpg -tile 3x -geometry 320x+5+5 -shadow x.jpg
。请注意,您也可以将此图像用于带有 的 HTML 单击页面
@s1i2v3a 如果您发现下面我的回答有帮助,请将其标记为已接受。 See this page 解释为什么这很重要。
【参考方案1】:
我知道您为开始您的项目付出了一些努力,但您似乎需要很多帮助。感谢您分享迄今为止的进展。我想这会让你值得一份圣诞礼物。 :)
我看到您的问题有几个组成问题。
1.我想在每张纸上调整大小并打印 12 到 24 张图像。
选择一个。你要12还是24?如果您希望数字根据您打印的图像的高度而变化,您最好按照上面的建议研究 Imagemagick。
2.使用 BATCH 脚本从文件夹中收集图像并输出 HTML 脚本,每页 3 列和 6 行
3 * 6 = 18。让我们开始吧。一个 8.5"x11" 的页面将处理超过 900 像素的高度,因此将表格单元格的高度设置为 150 像素。 (150 * 6 = 900。)
3.在 Firefox 中打开(缩小以适应和打印)
您可以通过包含一些 javascript 调用 window.print();
来触发打印对话框。您仍然需要点击“打印”。
4.如何在 html 脚本的每个图像上添加文件名、日期。
假设%%I
是分配给在for
循环中捕获文件名的变量。要获取文件的basename.ext
,请使用%%~nxI
。要获取文件的最后修改日期和时间,请使用%%~tI
。有关此语法的详细信息,请参阅控制台窗口中 help for
的最后两页。
在文本和图像上使用 CSS position: absolute
,在包含它们的 td
元素上使用 position: relative
。要么这样,要么您可以将图像加载为背景图像,并在顶部显示内联文本。这需要您将 Firefox 配置为打印背景图像,但可能没有配置。
要将 18 张图片放在一个页面上,请一次遍历 18 张图片文件,然后在找到第 18 张图片后生成一个 HTML 表格。在您的 CSS 中添加 @media print
声明以确保每个表格在打印时触发分页符。为了生成您的 HTML,我建议使用 batch heredoc 函数使您的代码更易读和更易于维护。
圣诞快乐!
@echo off
setlocal enabledelayedexpansion
:: thumbnails.bat
:: generates print layout of *.jpg in current folder
:: https://***.com/a/27652107/1683264
set "htmlfile=out.html"
call :heredoc head >"%htmlfile%" && goto end_head
<^!doctype "html">
<html>
<head>
<style type="text/css">
a text-decoration: none;
img
max-width: 200px;
max-height: 150px;
position: absolute;
left: 0px;
bottom: 0px;
td
border: 1px solid black;
position: relative;
width: 200px;
height: 150px;
span
position: absolute;
left: 5px;
top: 5px;
color: purple;
font-family: "Times New Roman";
font-size: 11px;
background: rgba(255, 255, 255, 0.6);
top: 3px;
left: 3px;
@media print
table page-break-after: always;
</style>
<script type="text/javascript">
addEventListener('load', function() window.print(); , false);
</script>
</head>
<body>
:end_head
set count=1
set images=
for %%I in (*.jpg) do (
set images=!images! "%%~fI"
if !count! equ 18 (
call :build_table !images:~1!
set images=
set count=0
)
set /a count+=1
)
if %count% gtr 1 call :build_table !images:~1!
call :heredoc body >>"%htmlfile%" && goto end_body
</body>
</html>
:end_body
start "" "firefox" -new-tab "file:///%CD:\=/%/%htmlfile%"
:: End of main script
goto :EOF
:build_table <img1> <img2> ... <img18>
setlocal enabledelayedexpansion
set count=1
for %%I in (%*) do (
set "src=%%~I"
set "img!count!=<a href="file:///!src:\=/!"><img src="file:///!src:\=/!" />"
set "desc!count!=<span>%%~nxI<br />%%~tI</span></a>"
set /a count+=1
)
call :heredoc table >>"%htmlfile%" && goto end_table
<table cellspacing="5">
<tr>
<td>!img1!!desc1!</td>
<td>!img2!!desc2!</td>
<td>!img3!!desc3!</td>
</tr>
<tr>
<td>!img4!!desc4!</td>
<td>!img5!!desc5!</td>
<td>!img6!!desc6!</td>
</tr>
<tr>
<td>!img7!!desc7!</td>
<td>!img8!!desc8!</td>
<td>!img9!!desc9!</td>
</tr>
<tr>
<td>!img10!!desc10!</td>
<td>!img11!!desc11!</td>
<td>!img12!!desc12!</td>
</tr>
<tr>
<td>!img13!!desc13!</td>
<td>!img14!!desc14!</td>
<td>!img15!!desc15!</td>
</tr>
<tr>
<td>!img16!!desc16!</td>
<td>!img17!!desc17!</td>
<td>!img18!!desc18!</td>
</tr>
</table>
:end_table
endlocal
goto :EOF
:: https://***.com/a/15032476/1683264
:heredoc <uniqueIDX>
setlocal enabledelayedexpansion
set go=
for /f "delims=" %%A in ('findstr /n "^" "%~f0"') do (
set "line=%%A" && set "line=!line:*:=!"
if defined go (if #!line:~1!==#!go::=! (goto :EOF) else echo(!line!)
if "!line:~0,13!"=="call :heredoc" (
for /f "tokens=3 delims=>^ " %%i in ("!line!") do (
if #%%i==#%1 (
for /f "tokens=2 delims=&" %%I in ("!line!") do (
for /f "tokens=2" %%x in ("%%I") do set "go=%%x"
)
)
)
)
)
goto :EOF
【讨论】:
太棒了!请添加上下文菜单 .reg 脚本,(右键单击文件夹“%1”并打印该文件夹中的所有图像)以上是关于在单张纸上批量打印多个图像的主要内容,如果未能解决你的问题,请参考以下文章