Hi All, I have been working on a printing issue for a while. I currently use iText to convert scanned .tiff documents to PDFs for a large paperless application here at Sun. The problem that I have encountered is that the PDF that iText created from tiffs are not printable, I get a typecheck-restore error. I have tried from many versions of Acrobat, and even tried with Ghostscript. If I use Ghostscript to convert the PDF's to PS the postscript will not print however, if I use ghostscript to "convert" a pdf to a pdf using the following command:
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=./itext-gs.pdf
./itext.pdf
the PDF becomes printable from Acroread or Ghostscript. I have looked
at the contents of the two PDFs and don't see any significant
differences. The encoding is the same..
I have attached example PDFs, one that doesn't print - itext.pdf
(created from iText) and the same PDF after the ghostscript command has
been run on it and it is printable - itext-gs.pdf. If someone can take
a look at these and give me an idea where to start or if it is a
limitation of iText, please let me know as I have about 9000 documents a
day that go through this process and need to fix it soon before I have
to run the gs command on hundreds of thousands of PDFs.
Thank you!!
Jared
Also, here is the code that converts the tiffs to PDFs:
public boolean tiffToPdf(String theTiffFile, String theOutFile)
{
Document document = null;
try {
// creation of the different writers
File file = new File(theTiffFile);
SeekableStream s = new FileSeekableStream(file);
TIFFDirectory dir = new TIFFDirectory(s, 0);
long IFDOffset = dir.getIFDOffset();
Watermark watermark = null;
PdfWriter writer = null;
PdfContentByte cb = null;
while (IFDOffset != 0L) {
dir = new TIFFDirectory(s, IFDOffset, 0);
IFDOffset = dir.getNextIFDOffset();
long h =
dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_LENGTH);
long w =
dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_WIDTH);
if (document == null)
{
if((int)w > 1800)
{
watermark = new
Watermark(Image.getInstance(ConverterProperties.WATERMARKLOC),0,-150);
document = new Document(PageSize.A4.rotate(), 50,
50, 50, 50);
}
else
{
watermark = new
Watermark(Image.getInstance(ConverterProperties.WATERMARKLOC),0,0);
document = new Document(PageSize.A4, 50, 50, 50,
50);
}
writer = PdfWriter.getInstance(document, new
FileOutputStream(theOutFile));
cb = writer.getDirectContent();
document.add(watermark);
document.open();
}
else
{
if((int)w > 1700)
{
document.setPageSize(PageSize.A4.rotate());
}
else
{
document.setPageSize(PageSize.A4);
}
}
long offset =
dir.getFieldAsLong(TIFFImageDecoder.TIFF_STRIP_OFFSETS);
long size =
dir.getFieldAsLong(TIFFImageDecoder.TIFF_STRIP_BYTE_COUNTS);
boolean reverse = false;
if (dir.isTagPresent(TIFFImageDecoder.TIFF_FILL_ORDER))
reverse =
(dir.getFieldAsLong(TIFFImageDecoder.TIFF_FILL_ORDER) == 2L);
int compression =
(int)dir.getFieldAsLong(TIFFImageDecoder.TIFF_COMPRESSION);
switch (compression) {
case TIFFImage.COMP_FAX_G3_1D:
compression = Image.CCITTG3_1D;
break;
case TIFFImage.COMP_FAX_G3_2D:
compression = Image.CCITTG3_1D;
if
(dir.isTagPresent(TIFFImageDecoder.TIFF_T4_OPTIONS)) {
if
(((int)dir.getFieldAsLong(TIFFImageDecoder.TIFF_T4_OPTIONS) & 1) != 0)
compression = Image.CCITTG3_2D;
}
break;
case TIFFImage.COMP_FAX_G4_2D:
compression = Image.CCITTG4;
break;
default:
throw new Exception("Compression type " +
compression + " not supported");
}
byte im[] = new byte[(int)size];
s.seek(offset);
s.readFully(im);
Image img = Image.getInstance((int)w, (int)h, reverse,
compression, 0, im);
img.scalePercent(72f / 200f * 100);
img.setAbsolutePosition(0, 0);
cb.addImage(img);
document.newPage();
}
document.close();
return true;
}
catch (Exception de) {
de.printStackTrace();
createErrorPDF(theTiffFile, theOutFile);
return false;
}
}
itext-gs.pdf
Description: Adobe PDF document
itext.pdf
Description: Adobe PDF document
