@@ -394,11 +394,19 @@ def __init__(self, filename):
394
394
self .nextObject = 1 # next free object id
395
395
self .xrefTable = [ [0 , 65535 , 'the zero object' ] ]
396
396
self .passed_in_file_object = False
397
+ self .original_file_like = None
398
+ self .tell_base = 0
397
399
if is_string_like (filename ):
398
400
fh = open (filename , 'wb' )
399
401
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
402
410
else :
403
411
raise ValueError ("filename must be a path or a file-like object" )
404
412
@@ -524,6 +532,9 @@ def close(self):
524
532
self .writeTrailer ()
525
533
if self .passed_in_file_object :
526
534
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 ()
527
538
else :
528
539
self .fh .close ()
529
540
@@ -1351,7 +1362,7 @@ def reserveObject(self, name=''):
1351
1362
return Reference (id )
1352
1363
1353
1364
def recordXref (self , id ):
1354
- self .xrefTable [id ][0 ] = self .fh .tell ()
1365
+ self .xrefTable [id ][0 ] = self .fh .tell () - self . tell_base
1355
1366
1356
1367
def writeObject (self , object , contents ):
1357
1368
self .recordXref (object .id )
@@ -1360,7 +1371,7 @@ def writeObject(self, object, contents):
1360
1371
def writeXref (self ):
1361
1372
"""Write out the xref table."""
1362
1373
1363
- self .startxref = self .fh .tell ()
1374
+ self .startxref = self .fh .tell () - self . tell_base
1364
1375
self .write (("xref\n 0 %d\n " % self .nextObject ).encode ('ascii' ))
1365
1376
i = 0
1366
1377
borken = False
0 commit comments