[OS X TeX] OT: Tool for Comparing PDF files ?
Steffen Wolfrum
osxtex_2 at st.estfiles.de
Thu Apr 5 16:49:20 CEST 2007
Hi,
I have to admit that I am still not familiar with command_line/UNIX stuff.
That's the reason why I didn't try Michael's script up-to now.
But Axel's enthusiastic comment made me curious and so I am considering to dive into it.
I just don't know where to start: Which package (pnmarith/pnmarith???) do I need now, and where do I get it?
Steffen
On Thu, 8 Mar 2007 04:17:07 -0600, Axel E. Retif wrote:
> On Mar 2, 2007, at 09:41, Michael Sternberg wrote:
>
>> Hello,
>>
>> On Mar 1, 2007, at 9:34 , Steffen Wolfrum wrote:
>>> Does someone know a tool for comparing PDF documents?
>>>
>>> Now and then I make small changes in the source files and would
>>> feel saver if I'd had a tool that would show me when a resulting
>>> PDF has / has not differences (to a PDF that was made before I made
>>> the changes) …
>>>
>>
>> Try the script tacked-on below. It does a graphical diff:
>>
>> diffps -h
>> diffps fileA.pdf fileB.pdf
>>
>> You need the netpbm[plus] package and Ghostscript.
>
> Your shell script is wonderful! Thank you. I tried it with two
> identical PDFs, and it reported nothing; then I changed (with
> Acrobat) just 1 letter in one of the two 224-page long PDFs, and it
> found the difference.
>
> Just one thing, though ---it calls pnmarith instead of the new
> pamarith. According to
>
> http://netpbm.sourceforge.net/doc/pnmarith.html
>
> pnmarith is obsolete. (And Gerben Wierda's Netpbm i-package comes
> with the new pamarith, not pnmarith.)
>
> Thank you again,
>
> Axel
>
>> By default, it uses "xv" ("Preview" on MacOS) to display differing
>> pages. Use "-x foo" to specify another viewer, which must read ppm
>> and png files.
>>
>> For repeated uses, it uses a page-cache, which you can override with
>> -f and clean with -c.
>>
>>
>> Regards, Michael
>> ------------------------------------------------------------
>> #!/bin/bash
>> # compare pages in two similar ps-files by highlighting their differences
>> # (uses grayscale pixmaps for comparing)
>> #
>> # Usage: (see -h)
>> #
>> # Created by Michael Sternberg, 2001-2007. Use at your own risk.
>>
>> PROGRAM=`basename $0`
>>
>> CACHE=.diffps
>> PAGES="*"
>> RES=72
>> VIEWER="xv -nolimit -24"
>> PAIR_FILE=pairs
>> VIEWS=1
>> HIST_THRESHOLD=1
>>
>> case `uname` in
>> Darwin) VIEWER="open -a Preview" ;;
>> esac
>>
>> Usage () {
>> cat << EOT
>> Compare postscript/pdf files visually.
>> Usage: $PROGRAM [options] file1 [file2 | dir]
>>
>> If file2 is not given, the latest version from CVS is used.
>>
>> Options:
>> Page rendering:
>> -d directory
>> directory for page cache (default: "$CACHE")
>>
>> -p pages
>> view only the given pages (quoted shell glob pattern)
>> (default: "$PAGES")
>>
>> -t threshold
>> minimum number of pixels to differ (default: $HIST_THRESHOLD)
>>
>> -r res Resolution for pixmap rendering (default: $RES)
>>
>> -f re-do comparison (force; discard cache)
>>
>> Viewing:
>> -0 report only
>> -1 view differing pages in diff-mode (red = recent; default)
>> -2 view differing pages pairwise
>> -3 both of the above
>> -x viewer specify image viewer for above (default: xv)
>>
>> General:
>> -h This help.
>> -c clean cache
>>
>> Created by Michael Sternberg, 2001-2007. Use at your own risk.
>> EOT
>> exit
>> }
>>
>> Clean_Cache () {
>> case $CACHE in
>> */*) echo $CACHE: not a subdirectory -- please clean manually. 1>&2
>> exit ;;
>> esac
>> rm -rf $CACHE # better know what you're doing
>> }
>>
>>
>> # parse options
>> while :
>> do
>> case "$1" in
>> -d) CACHE=$2; shift 2 ;;
>> -p) PAGES=$2; shift 2 ;;
>> -r) RES=$2; shift 2 ;;
>> -f) FORCE=1; shift ;;
>> -t) HIST_THRESHOLD=$2; shift 2 ;;
>>
>> -0) VIEWS=0; shift ;;
>> -1) VIEWS=1; shift ;;
>> -2) VIEWS=2; shift ;;
>> -3) VIEWS=3; shift ;;
>> -x) VIEWER=$2; shift 2 ;;
>>
>> -c) CLEAN=1; shift ;;
>> -h) Usage ;;
>>
>> -*) echo $0: unknown option 1>&2
>> Usage
>> exit 1 ;;
>> *) break ;;
>> esac
>> done
>>
>> # clean cache. Exit if this is the only task.
>> if [ -n "$CLEAN" ]; then
>> Clean_Cache
>> case $# in
>> 0) exit ;;
>> esac
>> fi
>>
>> # attempt to create cache dir
>> mkdir $CACHE 2> /dev/null
>>
>> A_PS="$1"
>> B_PS="${2-$CACHE}"
>> [ -d "$B_PS" ] && B_PS="$B_PS/$A_PS"
>>
>> case $# in
>> 2) ;;
>> 1) # get older copy from CVS
>> cvs up -p "$A_PS" > "$B_PS" || exit
>> # swap A and B to have named file as B, i.e., newer copy
>> X="$B_PS"; B_PS="$A_PS"; A_PS="$X"
>> ;;
>> *) echo Invalid input. 1>&2
>> Usage
>> exit 1
>> ;;
>> esac
>>
>> A_BASE="${A_PS//\//_}"
>> B_BASE="${B_PS//\//_}"
>>
>> # convert to pixmap format; use cache when available and not outdated
>> if [ ! -f $CACHE/"$A_BASE"-001.pgm \
>> -o "$A_PS" -nt $CACHE/"$A_BASE"-001.pgm \
>> -o -n "$FORCE" \
>> ]
>> then
>> gs -dNOPAUSE -sDEVICE=pgmraw -r$RES
>> -sOutputFile=$CACHE/"$A_BASE"-%03d.pgm \
>> "$A_PS" quit.ps || exit
>> fi
>>
>> if [ ! -f $CACHE/"$B_BASE"-001.pgm \
>> -o "$B_PS" -nt $CACHE/"$B_BASE"-001.pgm \
>> -o -n "$FORCE" \
>> ]
>> then
>> gs -dNOPAUSE -sDEVICE=pgmraw -r$RES
>> -sOutputFile=$CACHE/"$B_BASE"-%03d.pgm \
>> "$B_PS" quit.ps || exit
>> fi
>>
>> # compare pages
>> OWD=`pwd`
>> cd $CACHE
>> rm -f $PAIR_FILE 2> /dev/null
>> for A_PGM in "$A_BASE"-${PAGES}.pgm
>> do
>> SUFFIX="${A_PGM//*-/}"
>> N=${SUFFIX/.pgm/}
>>
>> B_PGM="$B_BASE-${SUFFIX}"
>>
>> H_DAT="$A_BASE-$B_BASE-${N}-hist.dat"
>> V="$A_BASE-$B_BASE-${N}-view.png"
>> D="$A_BASE-$B_BASE-${N}-diff.png"
>>
>> if [ ! -f "$H_DAT" -o -n "$FORCE" ]; then
>> # get histogram of diffs
>> pnmarith -diff "$A_PGM" "$B_PGM" | tee "$D".pgm | pgmhist > "$H_DAT"
>> fi
>>
>> ## Sample histogram:
>> # value count b% w%
>> # ----- ----- -- --
>> # 0 484690 100% 100%
>> # 255 14 100% 0.00289%
>>
>> # count non-black pixels
>> H_COUNT=`awk 'NR>3 { sum += $2} END {print 1*sum}' "$H_DAT"`
>>
>> # assemble views of differing pages (only)
>> if [ $H_COUNT -ge $HIST_THRESHOLD ]; then
>> echo $N differ 1>&2
>> if [ ! -f "$V" -o -n "$FORCE" ]; then
>> rgb3toppm "$A_PGM" "$B_PGM" "$B_PGM" \
>> | pnmtopng -transparent white -background grey50 > "$V"
>> pnmtopng "$D".pgm > "$D"
>> fi
>> echo "$V" "$A_PGM" "$B_PGM" >> $PAIR_FILE
>> fi
>> rm -f "$D".pgm 2> /dev/null
>>
>> ## When memory is tight -- This renders options "-2" and "-3" useless.
>> #if [ -z "$VIEWS" ]; then
>> # rm "$A_PGM" "$B_PGM
>> #fi
>> done
>>
>> # decide which images to view
>> case $VIEWS in
>> 1) COLS=1 ;; # diff-view only
>> 2) COLS=2-3 ;; # page pairs only
>> 3) COLS=1-3 ;; # all
>> *) exit ;;
>> esac
>>
>> # see if xargs supports the flag -r --no-run-if-empty
>> xargs -r < /dev/null 2> /dev/null && XARGS_ARGS="-r"
>>
>> if [ -f $PAIR_FILE ]; then
>> cut -f$COLS -d' ' $PAIR_FILE | xargs $XARGS_ARGS $VIEWER
>> fi
>>
>> # EOF
>>
>>
>> ------------------------- Helpful Info -------------------------
>> Mac-TeX Website: http://www.esm.psu.edu/mac-tex/
>> TeX FAQ: http://www.tex.ac.uk/faq
>> List Archive: http://tug.org/pipermail/macostex-archives/
>> List Reminders & Etiquette: http://www.esm.psu.edu/mac-tex/list/
>>
>>
>>
>
>
> ------------------------- Helpful Info -------------------------
> Mac-TeX Website: http://www.esm.psu.edu/mac-tex/
> TeX FAQ: http://www.tex.ac.uk/faq
> List Archive: http://tug.org/pipermail/macostex-archives/
> List Reminders & Etiquette: http://www.esm.psu.edu/mac-tex/list/
>
>
------------------------- Helpful Info -------------------------
Mac-TeX Website: http://www.esm.psu.edu/mac-tex/
TeX FAQ: http://www.tex.ac.uk/faq
List Archive: http://tug.org/pipermail/macostex-archives/
List Reminders & Etiquette: http://www.esm.psu.edu/mac-tex/list/
More information about the macostex-archives
mailing list