@@ -394,11 +394,19 @@ def __init__(self, filename):
394394 self .nextObject = 1 # next free object id
395395 self .xrefTable = [ [0 , 65535 , 'the zero object' ] ]
396396 self .passed_in_file_object = False
397+ self .original_file_like = None
398+ self .tell_base = 0
397399 if is_string_like (filename ):
398400 fh = open (filename , 'wb' )
399401 elif is_writable_file_like (filename ):
400- fh = filename
401- self .passed_in_file_object = True
402+ try :
403+ self .tell_base = filename .tell ()
404+ except IOError :
405+ fh = BytesIO ()
406+ self .original_file_like = filename
407+ else :
408+ fh = filename
409+ self .passed_in_file_object = True
402410 else :
403411 raise ValueError ("filename must be a path or a file-like object" )
404412
@@ -524,6 +532,9 @@ def close(self):
524532 self .writeTrailer ()
525533 if self .passed_in_file_object :
526534 self .fh .flush ()
535+ elif self .original_file_like is not None :
536+ self .original_file_like .write (self .fh .getvalue ())
537+ self .fh .close ()
527538 else :
528539 self .fh .close ()
529540
@@ -1351,7 +1362,7 @@ def reserveObject(self, name=''):
13511362 return Reference (id )
13521363
13531364 def recordXref (self , id ):
1354- self .xrefTable [id ][0 ] = self .fh .tell ()
1365+ self .xrefTable [id ][0 ] = self .fh .tell () - self . tell_base
13551366
13561367 def writeObject (self , object , contents ):
13571368 self .recordXref (object .id )
@@ -1360,7 +1371,7 @@ def writeObject(self, object, contents):
13601371 def writeXref (self ):
13611372 """Write out the xref table."""
13621373
1363- self .startxref = self .fh .tell ()
1374+ self .startxref = self .fh .tell () - self . tell_base
13641375 self .write (("xref\n 0 %d\n " % self .nextObject ).encode ('ascii' ))
13651376 i = 0
13661377 borken = False
0 commit comments