在单张纸上批量打印多个图像

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。请注意,您也可以将此图像用于带有 标记 (w3schools.com/tags/att_area_href.asp) 的 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”并打印该文件夹中的所有图像)

以上是关于在单张纸上批量打印多个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何按顺序批量打印PDF\WORD\EXCEL格式的文件 混合打印500多个文件?

cad怎么批量打印 看这里

CAD布局中怎么批量打印

cad如何批量打印?

HTML Document类型的文件怎么批量打印?

lodop批量打印太多预览加载不出来问题