diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py
index 4cd830829eff..817bf5fc4751 100644
--- a/lib/matplotlib/backends/backend_pdf.py
+++ b/lib/matplotlib/backends/backend_pdf.py
@@ -394,11 +394,19 @@ def __init__(self, filename):
self.nextObject = 1 # next free object id
self.xrefTable = [ [0, 65535, 'the zero object'] ]
self.passed_in_file_object = False
+ self.original_file_like = None
+ self.tell_base = 0
if is_string_like(filename):
fh = open(filename, 'wb')
elif is_writable_file_like(filename):
- fh = filename
- self.passed_in_file_object = True
+ try:
+ self.tell_base = filename.tell()
+ except IOError:
+ fh = BytesIO()
+ self.original_file_like = filename
+ else:
+ fh = filename
+ self.passed_in_file_object = True
else:
raise ValueError("filename must be a path or a file-like object")
@@ -524,6 +532,9 @@ def close(self):
self.writeTrailer()
if self.passed_in_file_object:
self.fh.flush()
+ elif self.original_file_like is not None:
+ self.original_file_like.write(self.fh.getvalue())
+ self.fh.close()
else:
self.fh.close()
@@ -1351,7 +1362,7 @@ def reserveObject(self, name=''):
return Reference(id)
def recordXref(self, id):
- self.xrefTable[id][0] = self.fh.tell()
+ self.xrefTable[id][0] = self.fh.tell() - self.tell_base
def writeObject(self, object, contents):
self.recordXref(object.id)
@@ -1360,7 +1371,7 @@ def writeObject(self, object, contents):
def writeXref(self):
"""Write out the xref table."""
- self.startxref = self.fh.tell()
+ self.startxref = self.fh.tell() - self.tell_base
self.write(("xref\n0 %d\n" % self.nextObject).encode('ascii'))
i = 0
borken = False