[prev in list] [next in list] [prev in thread] [next in thread] 

List:       hylafax
Subject:    Re: [hylafax-users] More on Fedora 12 and ghostscript
From:       Lee Howard <faxguy () howardsilvan ! com>
Date:       2010-04-27 2:32:13
Message-ID: 4BD64CAD.60004 () howardsilvan ! com
[Download RAW message or body]

Raman,

Thank you for this very useful and well-researched post.

Indeed, the problem has to do with Ghostscript 8.71 now preparing 
multi-strip TIFFs with MMR encoding (whereas before MMR-encoded images 
were always single-strip).  This is rather silly behavior on the part of 
Ghostscript, and it seems to go against RFC-1314, but it seems to be 
legitimate to libtiff and a myriad of other TIFF readers, and so we can 
cope with it.

I've attached the patch to fix this for HylaFAX+ 5.4.1.  I've committed 
it to the HylaFAX+ CVS, and it will be in the next HylaFAX+ release.  
This patch will unfortunately not apply cleanly with current hylafax.org 
releases.

While I do recommend that, to resolve the matter, you either use current 
HylaFAX+ CVS or patch HylaFAX+ with the attached patch, it is likely 
possible to hack your current HylaFAX scripting to compensate.  To do 
that edit your /var/spool/hylafax/etc/common-functions script, and at 
the very end of the gs2fax() function put these two lines of code:

$TIFFBIN/tiffcp -r -1 $out $out.new
$MV -f $out.new $out

Please note that's a minus-one and not the letter "l" after the dash-r.

(The reason that my patch isn't so simple is because it gives us the 
capability to easily cope with other TIFF-F production problems that 
Ghostscript may have in the future.)

Thanks,

Lee.


Raman Gupta wrote:
> Earlier this month Eliran posted about ghostscript-8.71 on Fedora 12 
> breaking a working Hylafax setup:
>
> http://www.hylafax.org/archive/2010-03/msg00001.php
>
> I too have experienced the same problem with gs 8.71 on Fedora 12 i.e. 
> the receiver of a fax sent from hylafax receives a page containing 
> only the tagline.
>
> A workaround is to add:
>
> Use2D: no
>
> to the etc/config file, as suggested by the Hylafax troubleshooting 
> document for *earlier* versions of Ghostscript. YMMV.
>
> A couple of debugging notes. Without the Use2D parameter, the 
> conversion executed by hylafax is something like:
>
> /bin/bash bin/pdf2fax -o docq/doc50.pdf;c1 -r 196 -w 1728 -l 297 -m 
> 4096 -U -3 docq/doc50.pdf.47
>
> which results in gs using the tiffg4 device (I added debug statements 
> to the pdf2fax script, giving me the gs command line used).
>
> With the Use2D setting, the command line is changed to pass a -1 
> rather than a -3 parameter, and gs is configured to use the tiffg3 
> device.
>
> I manually ran the pdf2fax program with gs 8.71 using both the -1 
> (tiffg3) and -3 (tiffg4) settings. While the resulting tiffg4 file is 
> smaller, I note that *both* the tiffg3 and tiffg4 files seem to load 
> perfectly fine when viewed in several different programs including 
> Okular, Gimp, Windows Picture and Fax viewer, and others. Here is the 
> tiffinfo output:
>
> foo_g3.tiff:
> TIFF Directory at offset 0x870e (34574)
>   Subfile Type: multi-page document (2 = 0x2)
>   Image Width: 1728 Image Length: 2292
>   Resolution: 209.1, 196 pixels/inch
>   Bits/Sample: 1
>   Compression Scheme: CCITT Group 3
>   Photometric Interpretation: min-is-white
>   FillOrder: msb-to-lsb
>   Orientation: row 0 top, col 0 lhs
>   Samples/Pixel: 1
>   Rows/Strip: 37
>   Planar Configuration: single image plane
>   Page Number: 0-0
>   Software: GPL Ghostscript 8.71
>   DateTime: 2010:04:13 10:55:28
>   Group 3 Options: EOL padding (4 = 0x4)
>
> foo_g4.tiff:
> TIFF Directory at offset 0x5a3e (23102)
>   Subfile Type: multi-page document (2 = 0x2)
>   Image Width: 1728 Image Length: 2292
>   Resolution: 209.1, 196 pixels/inch
>   Bits/Sample: 1
>   Compression Scheme: CCITT Group 4
>   Photometric Interpretation: min-is-white
>   FillOrder: msb-to-lsb
>   Orientation: row 0 top, col 0 lhs
>   Samples/Pixel: 1
>   Rows/Strip: 37
>   Planar Configuration: single image plane
>   Page Number: 0-0
>   Software: GPL Ghostscript 8.71
>   DateTime: 2010:04:13 10:55:21
>   Group 4 Options: (0 = 0x0)
>
> However, despite the tiffg4 file appearing to be correct, the 
> destination still receives a blank fax.
>
> I'm not sure what to check next in order to debug this further, as 
> ghostscript 8.71 appears to be the culprit, and yet the output of 
> pdf2fax using ghostscript 8.71 and the tiffg4 device is fine AFAICT. 
> Is there a way to have hylafax send the manually created tiffg4 file 
> directly for testing?
>
> Cheers,
> Raman
>
>
> ____________________ HylaFAX(tm) Users Mailing List 
> _______________________
>  To subscribe/unsubscribe, click 
> http://lists.hylafax.org/cgi-bin/lsg2.cgi
> On UNIX: mail -s unsubscribe hylafax-users-request@hylafax.org < 
> /dev/null
>  *To learn about expensive HylaFAX(tm) support, mail sales@ifax.com.*
>
>


["hylafax-tiffcheckings2fax.patch" (text/x-patch)]

diff -Nru hylafax.orig/util/common-functions.sh.in hylafax/util/common-functions.sh.in
--- hylafax.orig/util/common-functions.sh.in	2010-04-26 18:59:59.324152760 -0700
+++ hylafax/util/common-functions.sh.in	2010-04-26 18:13:07.961544840 -0700
@@ -344,6 +344,138 @@
     if [ "$DITHERING" = "libtiff-fs" ]; then
 	$RM -f $out.1 $out.2 $out.3
     fi
+    if [ "$df" = "g4" ]; then
+	#
+	# Ghostscript 8.71 will create multi-strip MMR pages.
+	# To compensate we must run the tiffCheck process.
+	#
+	CHECK=$SBIN/tiffcheck       # program to check acceptability
+	PS2FAX=                     # null to prevent recursion
+	TIFFCP=$TIFFBIN/tiffcp      # part of the TIFF distribution
+	TIFF2PS=$TIFFBIN/tiff2ps    # ditto
+	TIFFINFO=$TIFFBIN/tiffinfo  # ditto
+    
+	fil=$out
+
+	tiffCheck
+    fi
+}
+
+tiffCheck()
+{
+    CLEARTMP=no
+    if [ "$fil" = "$out" ]; then
+	CLEARTMP=yes
+	fil="$fil.$$.tmp"
+	$MV $out $fil
+    fi
+    #
+    # tiffcheck looks over a TIFF document and prints out a string
+    # that describes what's needed (if anything) to make the file
+    # suitable for transmission with the specified parameters (page
+    # width, page length, resolution, encoding).  This string may
+    # be followed by explanatory messages that can be returned to
+    # the user.  The possible actions are:
+    #
+    # OK		document is ok
+    # REJECT	something is very wrong (e.g. not valid TIFF)
+    # REFORMAT	data must be re-encoded
+    # REVRES	reformat to change vertical resolution
+    # RESIZE	scale or truncate the pages
+    # REIMAGE	image is not 1-channel bilevel data
+    #
+    # Note that these actions may be combined with "+";
+    # e.g. REFORMAT+RESIZE.  If we cannnot do the necessary work
+    # to prepare the document then we reject it here.
+    #
+    RESULT=`$CHECK $opt $fil 2>/dev/null`
+
+    ACTIONS=`echo "$RESULT" | $SED 1q`
+    case "$ACTIONS" in
+    OK)				# no conversion needed
+	#
+	# 1) We don't use hard links because it screws up faxqclean
+	#    logic that assumes the only hard links are used 
+	#    temporarily when document files are being created during
+	#    the job submission process.
+	# 2) We don't use symbolic links because the links get broken
+	#    when the source document is shared between jobs and
+	#    faxq removes the source document before all jobs complete.
+	#
+	# If we ever encounter problems where the client submits corrupt
+	# TIFF and we need to clean it up before transmission, then we
+	# can simply merge OK with REFORMAT.  For now we use $CP instead
+	# of $TIFFCP, however, to provide the client some control.
+	#
+	$CP -f $fil $out
+	if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	exit 0			# successful conversion
+	;;
+    *REJECT*)			# document rejected out of hand
+	echo "$RESULT" | $SED 1d
+	if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	exit 254			# reject document
+	;;
+    REFORMAT)			# only need format conversion (e.g. g4->g3)
+	rowsperstrip="-r 9999 "
+	if [ -n "`$TIFFINFO $fil | $GREP 'Compression Scheme: ISO JBIG'`" ]; then
+	    rowsperstrip=""
+	fi
+	$TIFFCP -i -c $df -f lsb2msb $rowsperstrip$fil $out
+
+	# libtiff 3.5.7 gives exit status 9 when there are unknown tags...
+	exitcode=$?
+	if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	if [ $exitcode != 0 ] && [ $exitcode != 9 ]; then {
+	    $CAT<<EOF
+Unexpected failure converting TIFF document; the command
+
+    $TIFFCP -i -c $df -f lsb2msb $rowsperstrip$fil $out
+
+failed with exit status $?.  This conversion was done because:
+
+EOF
+	    echo "$RESULT" | $SED 1d; exit 254
+	}
+	fi
+	exit 0
+	;;
+    #
+    # REVRES|REFORMAT+REVRES	adjust vertical resolution (should optimize)
+    # *RESIZE			page size must be adjusted (should optimize)
+    # *REIMAGE			maybe should reject (XXX)
+    #
+    *REVRES|*RESIZE|*REIMAGE)
+	if [ -z "$PS2FAX" ]; then
+	    echo "Unable to format with converters."
+	    echo "Preventing ps2fax recursion."
+	    if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	    exit 254
+	fi
+	($TIFF2PS -a $fil | $PS2FAX -o $out -i "$jobid" $opt) || {
+	    $CAT<<EOF
+Unexpected failure converting TIFF document; the command
+
+    $TIFF2PS -a $fil | $PS2FAX $opt
+
+failed with exit status $?.  This conversion was done because
+
+EOF
+	    echo "$RESULT" | $SED 1d; exit 254
+	}
+	if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	exit 0
+	;;
+    *)				# something went wrong
+	echo "Unexpected failure in the TIFF format checker;"
+	echo "the output of $CHECK was:"
+	echo ""
+	echo "$RESULT"
+	echo ""
+	if [ "$CLEARTMP" = "yes" ]; then $RM -f $fil; fi
+	exit 254			# no formatter
+	;;
+    esac
 }
 
 SetupPrivateTmp()
diff -Nru hylafax.orig/util/pdf2fax.gs.sh.in hylafax/util/pdf2fax.gs.sh.in
--- hylafax.orig/util/pdf2fax.gs.sh.in	2010-04-26 18:59:59.162177384 -0700
+++ hylafax/util/pdf2fax.gs.sh.in	2010-04-26 18:11:43.787341264 -0700
@@ -70,25 +70,28 @@
 device=			# to know if it was never specified
 unlimitedlength=no	# default to fixed length-pages
 color=no		# default to monochrome-only
+opt=
+df=
 
 while test $# != 0
 do
     case "$1" in
     -i)	shift; jobid="$1" ;;
     -o)	shift; out="$1" ;;
-    -w) shift; pagewidth="$1" ;;
-    -l) shift; pagelength="$1" ;;
-    -r) shift; vres="$1" ;;
+    -w) shift; pagewidth="$1"; opt="$opt -w $1" ;;
+    -l) shift; pagelength="$1"; opt="$opt -l $1" ;;
+    -r) shift; vres="$1"; opt="$opt -r $1" ;;
     -m) shift;;				# NB: not implemented
-    -U) unlimitedlength=yes ;;
-    -1) device=tiffg3 ;;
+    -U) unlimitedlength=yes; opt="$opt $1" ;;
+    -1) device=tiffg3; opt="$opt $1"; df="g3:1d" ;;
     -2) ($PS -h | grep tiffg32d >/dev/null 2>&1) \
 	    && { device=tiffg32d; } \
 	    || { device=tiffg3; }
-	;;
+	opt="$opt $1"; df="g3:2d" ;;
     -3) ($PS -h | grep tiffg4 >/dev/null 2>&1) \
 	    && { device=tiffg4; } \
 	    || { device=tiffg3; }
+	opt="$opt $1"; df=g4
 	;;
     -color) ($PS -h | grep tiff24nc >/dev/null 2>&1) \
 	    && { color=yes; }
diff -Nru hylafax.orig/util/ps2fax.gs.sh.in hylafax/util/ps2fax.gs.sh.in
--- hylafax.orig/util/ps2fax.gs.sh.in	2010-04-26 18:59:58.718244872 -0700
+++ hylafax/util/ps2fax.gs.sh.in	2010-04-26 18:16:30.312782776 -0700
@@ -70,25 +70,29 @@
 device=			# to know if it was never specified
 unlimitedlength=no	# default to fixed length-pages
 color=no		# default to monochrome-only
+opt=
+df=
 
 while test $# != 0
 do
     case "$1" in
     -i)	shift; jobid="$1" ;;
     -o)	shift; out="$1" ;;
-    -w) shift; pagewidth="$1" ;;
-    -l) shift; pagelength="$1" ;;
-    -r) shift; vres="$1" ;;
+    -w) shift; pagewidth="$1"; opt="$opt -w $1" ;;
+    -l) shift; pagelength="$1"; opt="$opt -l $1" ;;
+    -r) shift; vres="$1"; opt="$opt -r $1" ;;
     -m) shift;;				# NB: not implemented
-    -U) unlimitedlength=yes ;;
-    -1) device=tiffg3 ;;
+    -U) unlimitedlength=yes; opt="$opt $1" ;;
+    -1) device=tiffg3; opt="$opt $1"; df="g3:1d" ;;
     -2) ($PS -h | grep tiffg32d >/dev/null 2>&1) \
 	    && { device=tiffg32d; } \
 	    || { device=tiffg3; }
+	opt="$opt $1"; df="g3:2d"
 	;;
     -3) ($PS -h | grep tiffg4 >/dev/null 2>&1) \
 	    && { device=tiffg4; } \
 	    || { device=tiffg3; }
+	opt="$opt $1"; df=g4
 	;;
     -color) ($PS -h | grep tiff24nc >/dev/null 2>&1) \
 	    && { color=yes; }
diff -Nru hylafax.orig/util/tiff2fax.sh.in hylafax/util/tiff2fax.sh.in
--- hylafax.orig/util/tiff2fax.sh.in	2010-04-26 18:59:59.350148808 -0700
+++ hylafax/util/tiff2fax.sh.in	2010-04-26 17:23:49.837248088 -0700
@@ -55,6 +55,7 @@
     exit 1
 }
 . etc/setup.cache
+. bin/common-functions
 
 CHECK=$SBIN/tiffcheck			# program to check acceptability
 PS2FAX=bin/ps2fax			# for hard conversions
@@ -121,99 +122,4 @@
     $RM -f "$out.color"
 fi
 
-#
-# tiffcheck looks over a TIFF document and prints out a string
-# that describes what's needed (if anything) to make the file
-# suitable for transmission with the specified parameters (page
-# width, page length, resolution, encoding).  This string may
-# be followed by explanatory messages that can be returned to
-# the user.  The possible actions are:
-#
-# OK		document is ok
-# REJECT	something is very wrong (e.g. not valid TIFF)
-# REFORMAT	data must be re-encoded
-# REVRES	reformat to change vertical resolution
-# RESIZE	scale or truncate the pages
-# REIMAGE	image is not 1-channel bilevel data
-#
-# Note that these actions may be combined with "+";
-# e.g. REFORMAT+RESIZE.  If we cannnot do the necessary work
-# to prepare the document then we reject it here.
-#
-RESULT=`$CHECK $opt $fil 2>/dev/null`
-
-ACTIONS=`echo "$RESULT" | $SED 1q`
-case "$ACTIONS" in
-OK)				# no conversion needed
-    #
-    # 1) We don't use hard links because it screws up faxqclean
-    #    logic that assumes the only hard links are used 
-    #    temporarily when document files are being created during
-    #    the job submission process.
-    # 2) We don't use symbolic links because the links get broken
-    #    when the source document is shared between jobs and
-    #    faxq removes the source document before all jobs complete.
-    #
-    # If we ever encounter problems where the client submits corrupt
-    # TIFF and we need to clean it up before transmission, then we
-    # can simply merge OK with REFORMAT.  For now we use $CP instead
-    # of $TIFFCP, however, to provide the client some control.
-    #
-    $CP -f $fil $out
-    exit 0			# successful conversion
-    ;;
-*REJECT*)			# document rejected out of hand
-    echo "$RESULT" | $SED 1d
-    exit 254			# reject document
-    ;;
-REFORMAT)			# only need format conversion (e.g. g4->g3)
-    rowsperstrip="-r 9999 "
-    if [ -n "`$TIFFINFO $fil | $GREP 'Compression Scheme: ISO JBIG'`" ]; then
-	rowsperstrip=""
-    fi
-    $TIFFCP -i -c $df -f lsb2msb $rowsperstrip$fil $out
-
-    # libtiff 3.5.7 gives exit status 9 when there are unknown tags...
-    exitcode=$?
-    if [ $exitcode != 0 ] && [ $exitcode != 9 ]; then {
-	$CAT<<EOF
-Unexpected failure converting TIFF document; the command
-
-    $TIFFCP -i -c $df -f lsb2msb $rowsperstrip$fil $out
-
-failed with exit status $?.  This conversion was done because:
-
-EOF
-	echo "$RESULT" | $SED 1d; exit 254
-    }
-    fi
-    exit 0
-    ;;
-#
-# REVRES|REFORMAT+REVRES	adjust vertical resolution (should optimize)
-# *RESIZE			page size must be adjusted (should optimize)
-# *REIMAGE			maybe should reject (XXX)
-#
-*REVRES|*RESIZE|*REIMAGE)
-    ($TIFF2PS -a $fil | $PS2FAX -o $out -i "$jobid" $opt) || {
-	$CAT<<EOF
-Unexpected failure converting TIFF document; the command
-
-    $TIFF2PS -a $fil | $PS2FAX $opt
-
-failed with exit status $?.  This conversion was done because
-
-EOF
-	echo "$RESULT" | $SED 1d; exit 254
-    }
-    exit 0
-    ;;
-*)				# something went wrong
-    echo "Unexpected failure in the TIFF format checker;"
-    echo "the output of $CHECK was:"
-    echo ""
-    echo "$RESULT"
-    echo ""
-    exit 254			# no formatter
-    ;;
-esac
+tiffCheck

____________________ HylaFAX(tm) Users Mailing List _______________________
  To subscribe/unsubscribe, click http://lists.hylafax.org/cgi-bin/lsg2.cgi
 On UNIX: mail -s unsubscribe hylafax-users-request@hylafax.org < /dev/null
  *To learn about commercial HylaFAX(tm) support, mail sales@ifax.com.*


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic