简体   繁体   中英

Howto batch-convert pdf's using ImageMagick and benchmark the process?

After fiddling around for the first time with the command-line and ImageMagic, I have been able to do the following:

c:\test\paper.pdf contains a pdf file
c:\test>convert paper.pdf output-%d.tiff

The pdf file contains five pages, and the output is as expected 5 tiff files :-) Now I want to put multiple files in c:\\test and loop through them, creating pages based on the original filename. So assume the following files in c:\\test :

paper.pdf     (5 pages)
example.pdf   (2 pages)
new.pdf       (1 page)

The output of a batch script should be 8 tiff files in the c:\\test\\tiffs\\ folder:

paper-0.tiff paper-1.tiff paper-2.tiff paper-3.tiff paper-4.tiff
example-0.tiff example-1.tiff
new-0.tiff

and I would very much like the command line return the time it took converting the pdf's to tiffs:

c:\test>convert.bat
c:\test>This action took 120 seconds

I'm trying to write this batch file but since it's my first try I'm having trouble. I am first trying to loop through the test folder and create all the tiffs (leaving timing the process for now):

for %%f in (C:\test\) do convert %%f.pdf %%f-%%d.tiff

I would have expected this to work but got an error:

C:\Users\Me>convert c:\test\c:\test\.pdf c:\test\c:\test\-%d.tiff convert.exe: 
unable to open image `c:\test\c:\test\.pdf': Invalid argument @ 
error/blob.c/OpenBlob/2646. convert.exe: no decode delegate for this image 
format `c:\test\c:\test\.pdf' @ error/constitute.c/ReadImage/552. convert.exe: 
no images defined `c:\test\c:\test\-%d.tiff' @ 
error/convert.c/ConvertImageCommand/3106.

What am I doing wrong?

Timing

This is one of those jobs that it is just wrong to do (for real —it's OK to do it to show off) with batch/CMD. Nearly every programming language I've ever encountered would be better at doing this than CMD.

This particular (hackish) implementation will not work if the elapsed time goes past midnight of any given day, and depending on how you have dates configured in your locale, it might break if the run starts before 1 PM and finishes after 1 PM

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "tokens=5 delims= " %%t IN ('^<NUL time') DO SET START_TIME=%%t

:: Stuff that you're timing.

FOR /F "tokens=5 delims= " %%t IN ('^<NUL time') DO SET END_TIME=%%t

SET ELAPSED=
FOR /F "delims=:. tokens=1,2,3,4" %%a IN ("%START_TIME%") DO (
    FOR /F "delims=:. tokens=1,2,3,4" %%n IN ("%END_TIME%") DO (
        SET /A HOURS=%%n-%%a
        SET /A MINUTES=%%o-%%b
        SET /A SECONDS=%%p-%%c
        SET /A HUND=%%q-%%d

        SET /A TOTAL=!HOURS!*3600 + !MINUTES!*60 + !SECONDS!
        IF !HUND! LSS 0 (
            SET /A TOTAL=!TOTAL!-1
            SET /A HUND=!HUND!+100
        )
        IF !HUND! LSS 10 SET HUND=0!HUND!

        SET ELAPSED=!TOTAL!.!HUND!
    )
)

@ECHO.
@ECHO.
@ECHO This action took %ELAPSED% seconds.

ImageMagick

The problem I see with your convert command is that you've not told CMD what pattern to search for. It sounds like you want *.pdf . Doing this will mean that you don't need to append ".pdf" to the end of the input file name and need to remove the extension when specifying the output file name. The %%~dpnf produces the entire path to the file without the extension.

FOR %%f IN (C:\temp\*.pdf) do convert "%%~f" "%%~dpnf-%%d.tiff"

EDIT : To put the PDF's in a different location, change the %%f substitution:

FOR %%f IN (C:\temp\*.pdf) do convert "%%~f" "\path\to\tiffs\%%~nf-%%d.tiff"

Better Method?

I guess I should at least put in a plug for doing it the Right™ way. If you didn't want to invoke your command from a script in a language that supported timing (like Python), you could just retrieve the system time as an integer. This strategy will work until roughly 2038. I used Perl in this example.

@ECHO OFF

FOR /F %%t IN ('perl -e "print(time());"') DO SET START_TIME=%%t

:: stuff to time

FOR /F %%t IN ('perl -e "print(time());"') DO SET END_TIME=%%t
SET /A ELAPSED=%END_TIME%-%START_TIME%
@ECHO This step took %ELAPSED% seconds.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM