Показать полную графическую версию : BAT DOC->JPG
Имеется огромное число файлов .doc в каждом примерно по 130 страниц, на выходе необходимо получить .jpg файлы склеенные по 3 страницы.
превратить doc в jpg труда особого не составило, благо есть и под винду линуксовые пакеты типа ghostscript, imagemagick. ну и конечно же LibreOffice.
Вообще путь получился достаточно сложный, по тому как мною не было найдено программы которая может перевести "на лету" пакетно из командной строки doc в jpg. По этому у меня получился промежуточный шаг - перевод doc - pdf.
1) переводим DOC в PDF с помощью LibreOffice:
soffice.exe -headless --convert-to pdf:writer_pdf_Export %1 --outdir %~dp1\TMP
вообще LibreOffice должен сам уметь сохранять doc в jpg, но заставить его делать это, я не смог. достаточно лишь заменить параметры на эти:
soffice.exe -headless --convert-to jpg:writer_jpg_Export %1 --outdir %~dp1\TMP
точнее файл jpg я получил, но 1 и не читаемый.
2) затем PDF в JPG постранично программой ghostscript:
gswin32.exe -q -dNOPAUSE -dPDFFitPage -dFIXEDMEDIA -sDEFAULTPAPERSIZE=a4 -dSAFER -sDEVICE=jpeg -r300 -sOutputFile="%~dp1\TMP\%~n1_page_%%03d.jpg" "%~dp1\TMP\%~n1.pdf"
на выходе имеем множество jpg файлов вида:
bla-bla-bla_page_001.jpg
bla-bla-bla_page_002.jpg
bla-bla-bla_page_003.jpg
...
bla-bla-bla_page_n.jpg
3) дело осталось за малым, склеить 3 соседние картинки в одну программой montage из пакета imagemagick:
montage.exe bla-bla-bla_page_00[1-3].jpg -tile 3x1 -geometry +0+0 001-003.jpg
но как заставить FOR брать первый файл, склеивать его с двумя соседями, не обрабатывать их и сразу брать 4 файл, при этом проверять существование каждого файла, в случае если файла не существует, не производить объединение или объединять всего лишь 2 файла вместо 3.
В принципе меня устраивает длина моего решения, но возможно, кто-то уже сталкивался с подобной задачей и решил ее короче или может быть есть альтернативный метод решения который будет работать быстрее. Хотелось бы тогда его услышать. Условие лишь одно - все должно работать из командной строки, никаких интерфейсов с кнопками, нужна пакетная обработка.
при этом проверять существование каждого файла, в случае если файла не существует, не производить объединение или объединять всего лишь 2 файла вместо 3. »
Вариант «при отсутствии какого-либо из трёх файлов объединять оставшиеся» я вообще не вижу смысла рассматривать по причине отсутствия логики в этом.
Примерно так:
@echo off
setlocal enableextensions enabledelayedexpansion
for /l %%i in (1, 3, 130) do (
set /a iCount = %%i
set sNamePart=00!iCount!
set sName1=bla-bla-bla_page_!sNamePart:~-3!.jpg
if exist "!sName1!" (
echo ^<-- !sName1!
set sNameGroup=!sNamePart!
set /a iCount += 1
set sNamePart=00!iCount!
set sName2=bla-bla-bla_page_!sNamePart:~-3!.jpg
if exist "!sName2!" (
echo ^<-- !sName2!
set sNameGroup=!sNameGroup!-!sNamePart!
set /a iCount += 1
set sNamePart=00!iCount!
set sName3=bla-bla-bla_page_!sNamePart:~-3!.jpg
if exist "!sName3!" (
echo ^<-- !sName3!
set sNameGroup=!sNameGroup!-!sNamePart!
echo --^> !sNameGroup!.jpg
echo.
"C:\Program Files\ImageMagick-6.3.4-Q8\montage.exe" "!sName1!" "!sName2!" "!sName3!" -tile 3x1 -geometry +0+0 "!sNameGroup!.jpg"
) else (
echo --^> !sNameGroup!.jpg
echo.
"C:\Program Files\ImageMagick-6.3.4-Q8\montage.exe" "!sName1!" "!sName2!" -tile 3x1 -geometry +0+0 "!sNameGroup!.jpg"
goto :eof
)
) else (
echo --^> !sNameGroup!.jpg
echo.
"C:\Program Files\ImageMagick-6.3.4-Q8\montage.exe" "!sName1!" -tile 3x1 -geometry +0+0 "!sNameGroup!.jpg"
goto :eof
)
) else (
goto :eof
)
)
endlocal
exit /b 0
E:\Песочница\0241>0001.cmd
<-- bla-bla-bla_page_001.jpg
<-- bla-bla-bla_page_002.jpg
<-- bla-bla-bla_page_003.jpg
--> 001-002-003.jpg
<-- bla-bla-bla_page_004.jpg
<-- bla-bla-bla_page_005.jpg
<-- bla-bla-bla_page_006.jpg
--> 004-005-006.jpg
<-- bla-bla-bla_page_007.jpg
<-- bla-bla-bla_page_008.jpg
<-- bla-bla-bla_page_009.jpg
--> 007-008-009.jpg
<-- bla-bla-bla_page_010.jpg
<-- bla-bla-bla_page_011.jpg
--> 0010-0011.jpg
Спасибо, то что нужно! Единственное, с нумерацией конечных файлов есть небольшие проблемы, но это поправимо.
Единственное, с нумерацией конечных файлов есть небольшие проблемы »
Какие?
Какие? »
001-002-003.jpg
0010-0011-0012.jpg
0013-0014-0015.jpg
0016-0017-0018.jpg
0019-0020-0021.jpg
0022-0023-0024.jpg
0025-0026-0027.jpg
0028-0029-0030.jpg
0031-0032-0033.jpg
0034.jpg
004-005-006.jpg
007-008-009.jpg
По такому принципу именовать файлы больше нет необходимости, так как полное имя файла все равно не видно (там где они читаться будут), а это критично. Присвоил каждому файлу свой порядковый номер.
По такому принципу именовать файлы больше нет необходимости… »
От же ж :(… Именно из-за этого именования код пакетного файла пришлось настолько «раздуть».
Спасибо, ясно.
Снова вернусь к этой же теме. До недавнего времени скрипт предложенный Iska (за что ему огромное спасибо), полностью меня устраивал и работал по сей день. Но в виду того, что последнее время в файлах doc стали чаще встречаться страницы с альбомной ориентацией, появилась потребность его подкорректировать, а скорее всего, вообще переписать. Так как, ghostscript при создании jpg все страницы считает портретными и при склеивании montage они выглядят коряво. Пришлось разбить скрипт на 2 части: первый из doc создает jpg, а второй их склеивает и добавил еще один скрипт который в качестве параметров запуска получает имена jpg файлов и осуществляет их вращение на 90 градусов при этом добавляет суффикс "_rotate". Эти файлы склеивать нет необходимости. Но из-за того что в скрипте выше, цикл работает с шагом 3 и в списке файлов уже нет очередности получается полная белиберда. В итоге скрипт выше приходится запускать для каждой группы файлов между файлами с суффиксами "_rotate", а это очень неудобно. Хотелось бы его усовершенствовать, но своих знаний не хватает, а конкретно не знаю как создать цикл. Прошу помощи как минимум в этом, а в идеале вообще бы объединить все скрипты в один, но тут все упирается в ghostscript. В общем хотелось бы на выходе получать файлы в виде:
001-002-003.jpg
004.jpg (вращение на 90)
005.jpg (вращение на 90)
006-007-008.jpg
009-010.jpg
011.jpg (вращение на 90)
012.jpg
013.jpg (вращение на 90)
014-015-016.jpg
и т.д.
Нашел решение своей задачи, не знаю на сколько правильно оно грамматически, но отработало оно во всех случаях правильно. Как оказалось, скрипт предложенный Iska до сих пор работает на ура, нужно лишь для каждого случая изменять начальное и конечное значения цикла.
@echo off
setlocal enableextensions enabledelayedexpansion
set /a MinCount = 1
set /a MaxCount = 201
for /l %%i in (!MinCount!, 1, !MaxCount!) do (
set /a iCount = %%i
set iNamePart=00!iCount!
if not exist "%1\!iNamePart:~-3!.jpg" (
set /a MaxCount = !iCount! - 1
call :test %1 !MinCount! !MaxCount!
set /a MinCount = !iCount! + 1
)
)
:test
for /l %%e in (%2, 3, %3) do (
set /a eCount = %%e
set eNamePart=00!eCount!
set eName1=!eNamePart:~-3!.jpg
if exist "%1\!eName1!" (
echo ^<-- !eName1!
set eNameGroup=!eNamePart:~-3!
set /a eCount += 1
set eNamePart=00!eCount!
set eName2=!eNamePart:~-3!.jpg
if exist "%1\!eName2!" (
echo ^<-- !eName2!
set eNameGroup=!eNameGroup!-!eNamePart:~-3!
set /a eCount += 1
set eNamePart=00!eCount!
set eName3=!eNamePart:~-3!.jpg
if exist "%1\!eName3!" (
echo ^<-- !eName3!
set eNameGroup=!eNameGroup!-!eNamePart:~-3!
echo --^> !eNameGroup!.jpg
echo.
montage "%1\!eName1!" "%1\!eName2!" "%1\!eName3!" -tile 3x1 -geometry +0+0 "%1\!eNameGroup!.jpg"
del/q "%1\!eName1!" "%1\!eName2!" "%1\!eName3!"
) else (
echo --^> !eNameGroup!.jpg
echo.
montage "%1\!eName1!" "%1\!eName2!" -tile 2x1 -geometry +0+0 "%1\!eNameGroup!.jpg"
del/q "%1\!eName1!" "%1\!eName2!"
goto :eof
)
) else (
echo --^> !eNameGroup!.jpg
echo.
goto :eof
)
) else (
goto :eof
)
)
endlocal
exit /b 0
Может быть есть более грамотное решение?
По ходу решения задачи возникло еще пара вопросов:
- Как определить количество jpg файлов в папке %1? (нужно для присвоения значения MaxCount)
- Сколько параметров запуска поддерживает bat\cmd файл? На сколько я знаю, это число равно 9, но это если в внутри файла обращаться к каждому отдельно (%1 %2 %3 ... %9), а если необходимо обращаться ко всем сразу (%*)?
Ну и о наболевшем: очень хотелось бы все-таки объединить этот скрипт с остальными скриптами, но этому мешает портретная ориентация страницы. Может быть кто-то подскажет возможность извлечения сначала портретных, а затем альбомных страниц при помощи ghostscript'а или другого ПО, поддерживающего работу из командной строки? Или может быть есть возможность получить список всех страниц из файла pdf с указанием ориентации?
- Как определить количество jpg файлов в папке %1? »
Решил так:
for %%i in (%1\*.jpg) do set /a MaxCount += 1
только вот при замене строки set /a MaxCount = 201 на эту строку, скрипт не доходит до проверки файла на существование (if not exist "%1\!iNamePart:~-3!.jpg") и соответственно выполнение прерывается, чего не происходит если до цикла указать set /a MaxCount = 1, но тогда итоговое значение MaxCount по завершению цикла будет на единичку больше. Не критично конечно, но все же интересно почему так происходит.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.