def save(self, file): #avoid crashes if they wrote nothing in the page if self.data == None: self.data = TestStream if self.compression == 1: comp = zlib.compress(self.data) #this bit is very fast... base85 = pdfutils._AsciiBase85Encode(comp) #...sadly this isn't wrapped = pdfutils._wrap(base85) data_to_write = wrapped else: data_to_write = self.data # the PDF length key should contain the length including # any extra LF pairs added by Print on DOS. #lines = len(string.split(self.data,'\n')) #length = len(self.data) + lines # one extra LF each length = len(data_to_write) + len(LINEEND) #AR 19980202 if self.compression: file.write('<< /Length %d /Filter [/ASCII85Decode /FlateDecode]>>' % length + LINEEND) else: file.write('<< /Length %d >>' % length + LINEEND) file.write('stream' + LINEEND) file.write(data_to_write + LINEEND) file.write('endstream' + LINEEND)
def drawInlineImage(self, image, x, y, width=None, height=None): """Draw a PIL Image into the specified rectangle. If width and height are omitted, they are calculated from the image size. Also allow file names as well as images. This allows a caching mechanism""" # print "drawInlineImage: x=%s, y=%s, width = %s, height=%s " % (x,y, width, height) try: import Image except ImportError: print 'Python Imaging Library not available' return try: import zlib except ImportError: print 'zlib not available' return self._currentPageHasImages = 1 if type(image) == StringType: if os.path.splitext(image)[1] in ['.jpg', '.JPG']: #directly process JPEG files #open file, needs some error handling!! imageFile = open(image, 'rb') info = self.readJPEGInfo(imageFile) imgwidth, imgheight = info[0], info[1] if info[2] == 1: colorSpace = 'DeviceGray' elif info[2] == 3: colorSpace = 'DeviceRGB' else: #maybe should generate an error, is this right for CMYK? colorSpace = 'DeviceCMYK' imageFile.seek(0) #reset file pointer imagedata = [] imagedata.append('BI') # begin image # this describes what is in the image itself imagedata.append('/Width %0.4f /Height %0.4f' % (info[0], info[1])) imagedata.append('/BitsPerComponent 8') imagedata.append('/ColorSpace /%s' % colorSpace) imagedata.append('/Filter [ /ASCII85Decode /DCTDecode]') imagedata.append('ID') #write in blocks of (??) 60 characters per line to a list compressed = imageFile.read() encoded = pdfutils._AsciiBase85Encode(compressed) outstream = cStringIO.StringIO(encoded) dataline = outstream.read(60) while dataline <> "": imagedata.append(dataline) dataline = outstream.read(60) imagedata.append('EI') else: if not pdfutils.cachedImageExists(image): pdfutils.cacheImageFile(image) #now we have one cached, slurp it in cachedname = os.path.splitext(image)[0] + '.a85' imagedata = open(cachedname, 'rb').readlines() #trim off newlines... imagedata = map(string.strip, imagedata) #parse line two for width, height words = string.split(imagedata[1]) imgwidth = string.atoi(words[1]) imgheight = string.atoi(words[3]) else: #PIL Image #work out all dimensions myimage = image.convert('RGB') imgwidth, imgheight = myimage.size imagedata = [] imagedata.append('BI') # begin image # this describes what is in the image itself imagedata.append( '/W %0.4f /H %0.4f /BPC 8 /CS /RGB /F [/A85 /Fl]' % (imgwidth, imgheight)) imagedata.append('ID') #use a flate filter and Ascii Base 85 to compress raw = myimage.tostring() assert (len(raw) == imgwidth * imgheight, "Wrong amount of data for image") compressed = zlib.compress(raw) #this bit is very fast... encoded = pdfutils._AsciiBase85Encode( compressed) #...sadly this isn't #write in blocks of (??) 60 characters per line to a list outstream = cStringIO.StringIO(encoded) dataline = outstream.read(60) while dataline <> "": imagedata.append(dataline) dataline = outstream.read(60) imagedata.append('EI') #now build the PDF for the image. if not width: width = imgwidth if not height: height = imgheight # this says where and how big to draw it #self._code.append('ET') #self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, height, x, y+height)) if self.bottomup: self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, height, x, y)) else: # multiply height by (-1) to overcome flip in coordinate system -cwl self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, -height, x, y + height)) self._code.extend(imagedata) self._code.append('Q')
def drawInlineImage(self, image, x,y, width=None,height=None): """Draw a PIL Image into the specified rectangle. If width and height are omitted, they are calculated from the image size. Also allow file names as well as images. This allows a caching mechanism""" # print "drawInlineImage: x=%s, y=%s, width = %s, height=%s " % (x,y, width, height) try: import Image except ImportError: print 'Python Imaging Library not available' return try: import zlib except ImportError: print 'zlib not available' return self._currentPageHasImages = 1 if type(image) == StringType: if os.path.splitext(image)[1] in ['.jpg', '.JPG']: #directly process JPEG files #open file, needs some error handling!! imageFile = open(image, 'rb') info = self.readJPEGInfo(imageFile) imgwidth, imgheight = info[0], info[1] if info[2] == 1: colorSpace = 'DeviceGray' elif info[2] == 3: colorSpace = 'DeviceRGB' else: #maybe should generate an error, is this right for CMYK? colorSpace = 'DeviceCMYK' imageFile.seek(0) #reset file pointer imagedata = [] imagedata.append('BI') # begin image # this describes what is in the image itself imagedata.append('/Width %0.4f /Height %0.4f' %(info[0], info[1])) imagedata.append('/BitsPerComponent 8') imagedata.append('/ColorSpace /%s' % colorSpace) imagedata.append('/Filter [ /ASCII85Decode /DCTDecode]') imagedata.append('ID') #write in blocks of (??) 60 characters per line to a list compressed = imageFile.read() encoded = pdfutils._AsciiBase85Encode(compressed) outstream = cStringIO.StringIO(encoded) dataline = outstream.read(60) while dataline <> "": imagedata.append(dataline) dataline = outstream.read(60) imagedata.append('EI') else: if not pdfutils.cachedImageExists(image): pdfutils.cacheImageFile(image) #now we have one cached, slurp it in cachedname = os.path.splitext(image)[0] + '.a85' imagedata = open(cachedname,'rb').readlines() #trim off newlines... imagedata = map(string.strip, imagedata) #parse line two for width, height words = string.split(imagedata[1]) imgwidth = string.atoi(words[1]) imgheight = string.atoi(words[3]) else: #PIL Image #work out all dimensions myimage = image.convert('RGB') imgwidth, imgheight = myimage.size imagedata = [] imagedata.append('BI') # begin image # this describes what is in the image itself imagedata.append('/W %0.4f /H %0.4f /BPC 8 /CS /RGB /F [/A85 /Fl]' % (imgwidth, imgheight)) imagedata.append('ID') #use a flate filter and Ascii Base 85 to compress raw = myimage.tostring() assert(len(raw) == imgwidth * imgheight, "Wrong amount of data for image") compressed = zlib.compress(raw) #this bit is very fast... encoded = pdfutils._AsciiBase85Encode(compressed) #...sadly this isn't #write in blocks of (??) 60 characters per line to a list outstream = cStringIO.StringIO(encoded) dataline = outstream.read(60) while dataline <> "": imagedata.append(dataline) dataline = outstream.read(60) imagedata.append('EI') #now build the PDF for the image. if not width: width = imgwidth if not height: height = imgheight # this says where and how big to draw it #self._code.append('ET') #self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, height, x, y+height)) if self.bottomup: self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, height, x, y)) else: # multiply height by (-1) to overcome flip in coordinate system -cwl self._code.append('q %0.4f 0 0 %0.4f %0.4f %0.4f cm' % (width, -height, x, y+height)) self._code.extend(imagedata) self._code.append('Q')