Revision: 6739
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6739&view=rev
Author: jouni
Date: 2009-01-06 08:07:18 +0000 (Tue, 06 Jan 2009)
Log Message:
-----------
Create a PdfFile wrapper named PdfPages to act as the target of savefig
to avoid saving figures in png format onto the file-like PdfPages object.
Modified Paths:
--------------
trunk/matplotlib/CHANGELOG
trunk/matplotlib/doc/api/api_changes.rst
trunk/matplotlib/examples/pylab_examples/multipage_pdf.py
trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG 2009-01-05 18:11:47 UTC (rev 6738)
+++ trunk/matplotlib/CHANGELOG 2009-01-06 08:07:18 UTC (rev 6739)
@@ -1,3 +1,6 @@
+2009-01-06 Change user-visible multipage pdf object to PdfPages to
+ avoid accidents with the file-like PdfFile. - JKS
+
2009-01-05 Fix a bug in pdf usetex: allow using non-embedded fonts. - JKS
2009-01-05 optional use of preview.sty in usetex mode. - JJL
Modified: trunk/matplotlib/doc/api/api_changes.rst
===================================================================
--- trunk/matplotlib/doc/api/api_changes.rst 2009-01-05 18:11:47 UTC (rev
6738)
+++ trunk/matplotlib/doc/api/api_changes.rst 2009-01-06 08:07:18 UTC (rev
6739)
@@ -6,6 +6,10 @@
outward-facing API. If updating matplotlib breaks your scripts, this
list may help describe what changes may be necessary in your code.
+* You can now print several figures to one pdf file. See the docstrings
+ of the class :class:`matplotlib.backends.backend_pdf.PdfPages` for
+ more information.
+
* Removed configobj_ and `enthought.traits`_ packages, which are only
required by the experimental traited config and are somewhat out of
date. If needed, install them independently.
Modified: trunk/matplotlib/examples/pylab_examples/multipage_pdf.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/multipage_pdf.py 2009-01-05
18:11:47 UTC (rev 6738)
+++ trunk/matplotlib/examples/pylab_examples/multipage_pdf.py 2009-01-06
08:07:18 UTC (rev 6739)
@@ -1,14 +1,17 @@
+# This is a demo of creating a pdf file with several pages.
+
import numpy as np
import matplotlib
-from matplotlib.backends.backend_pdf import PdfFile
+from matplotlib.backends.backend_pdf import PdfPages
from pylab import *
-pdf = PdfFile('multipage_pdf.pdf')
+# Create the PdfPages object to which we will save the pages:
+pdf = PdfPages('multipage_pdf.pdf')
figure(figsize=(3,3))
plot(range(7), [3,1,4,1,5,9,2], 'r-o')
title('Page One')
-savefig(pdf, format='pdf')
+savefig(pdf, format='pdf') # note the format='pdf' argument!
close()
rc('text', usetex=True)
@@ -16,14 +19,15 @@
x = np.arange(0,5,0.1)
plot(x, np.sin(x), 'b-')
title('Page Two')
-savefig(pdf, format='pdf')
+pdf.savefig() # here's another way - or you could do pdf.savefig(1)
close()
rc('text', usetex=False)
-figure(figsize=(4,5))
+fig=figure(figsize=(4,5))
plot(x, x*x, 'ko')
title('Page Three')
-savefig(pdf, format='pdf')
+pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig
close()
+# Remember to close the object - otherwise the file will not be usable
pdf.close()
Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2009-01-05
18:11:47 UTC (rev 6738)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2009-01-06
08:07:18 UTC (rev 6739)
@@ -1882,7 +1882,64 @@
manager = FigureManagerPdf(canvas, num)
return manager
+class PdfPages(object):
+ """
+ A multi-page PDF file.
+ Use like this:
+
+ # Initialize:
+ pdf_pages = PdfPages('foo.pdf')
+
+ # As many times as you like, create a figure fig, then either:
+ fig.savefig(pdf_pages, format='pdf') # note the format argument!
+ # or:
+ pdf_pages.savefig(fig)
+
+ # Once you are done, remember to close the object:
+ pdf_pages.close()
+
+ (In reality PdfPages is a thin wrapper around PdfFile, in order to
+ avoid confusion when using savefig and forgetting the format
+ argument.)
+ """
+ __slots__ = ('_file',)
+
+ def __init__(self, filename):
+ """
+ Create a new PdfPages object that will be written to the file
+ named *filename*. The file is opened at once and any older
+ file with the same name is overwritten.
+ """
+ self._file = PdfFile(filename)
+
+ def close(self):
+ """
+ Finalize this object, making the underlying file a complete
+ PDF file.
+ """
+ self._file.close()
+ self._file = None
+
+ def savefig(self, figure=None, **kwargs):
+ """
+ Save the Figure instance *figure* to this file as a new page.
+ If *figure* is a number, the figure instance is looked up by
+ number, and if *figure* is None, the active figure is saved.
+ Any other keyword arguments are passed to Figure.savefig.
+ """
+ if isinstance(figure, Figure):
+ figure.savefig(self, format='pdf', **kwargs)
+ else:
+ if figure is None:
+ figureManager = Gcf.get_active()
+ else:
+ figureManager = Gcf.get_fig_manager(figure)
+ if figureManager is None:
+ raise ValueError, "No such figure: " + `figure`
+ else:
+ figureManager.canvas.figure.savefig(self, format='pdf')
+
class FigureCanvasPdf(FigureCanvasBase):
"""
The canvas the figure renders into. Calls the draw and print fig
@@ -1905,8 +1962,8 @@
image_dpi = kwargs.get('dpi', 72) # dpi to use for images
self.figure.set_dpi(72) # there are 72 pdf points to an inch
width, height = self.figure.get_size_inches()
- if isinstance(filename, PdfFile):
- file = filename
+ if isinstance(filename, PdfPages):
+ file = filename._file
else:
file = PdfFile(filename)
file.newPage(width, height)
@@ -1914,10 +1971,10 @@
width, height, 72, RendererPdf(file, image_dpi))
self.figure.draw(renderer)
renderer.finalize()
- if file != filename: # we opened the file
+ if isinstance(filename, PdfPages): # finish off this page
+ file.endStream()
+ else: # we opened the file above; now finish it off
file.close()
- else: # multipage file; just finish off the page
- file.endStream()
class FigureManagerPdf(FigureManagerBase):
pass
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins