@@ -764,10 +764,29 @@ def print_ps(self, outfile, *args, **kwargs):
764
764
def print_eps (self , outfile , * args , ** kwargs ):
765
765
return self ._print_ps (outfile , 'eps' , * args , ** kwargs )
766
766
767
- def _print_ps (self , outfile , format , * args ,
768
- papertype = None , dpi = 72 , facecolor = 'w' , edgecolor = 'w' ,
769
- orientation = 'portrait' ,
770
- ** kwargs ):
767
+ def _print_ps (
768
+ self , outfile , format , * args ,
769
+ dpi = 72 , metadata = None , papertype = None , orientation = 'portrait' ,
770
+ ** kwargs ):
771
+
772
+ self .figure .set_dpi (72 ) # Override the dpi kwarg
773
+
774
+ dsc_comments = {}
775
+ if isinstance (outfile , (str , os .PathLike )):
776
+ dsc_comments ["Title" ] = \
777
+ os .fspath (outfile ).encode ("ascii" , "replace" ).decode ("ascii" )
778
+ dsc_comments ["Creator" ] = (metadata or {}).get (
779
+ "Creator" ,
780
+ f"matplotlib version { mpl .__version__ } , http://matplotlib.org/" )
781
+ source_date_epoch = os .getenv ("SOURCE_DATE_EPOCH" )
782
+ dsc_comments ["CreationDate" ] = (
783
+ datetime .datetime .utcfromtimestamp (
784
+ int (source_date_epoch )).strftime ("%a %b %d %H:%M:%S %Y" )
785
+ if source_date_epoch
786
+ else time .ctime ())
787
+ dsc_comments = "\n " .join (
788
+ f"%%{ k } : { v } " for k , v in dsc_comments .items ())
789
+
771
790
if papertype is None :
772
791
papertype = mpl .rcParams ['ps.papersize' ]
773
792
papertype = papertype .lower ()
@@ -776,42 +795,29 @@ def _print_ps(self, outfile, format, *args,
776
795
orientation = cbook ._check_getitem (
777
796
_Orientation , orientation = orientation .lower ())
778
797
779
- self .figure .set_dpi (72 ) # Override the dpi kwarg
780
-
781
798
printer = (self ._print_figure_tex
782
799
if mpl .rcParams ['text.usetex' ] else
783
800
self ._print_figure )
784
- printer (outfile , format , dpi , facecolor , edgecolor ,
785
- orientation , papertype , ** kwargs )
801
+ printer (outfile , format , dpi = dpi , dsc_comments = dsc_comments ,
802
+ orientation = orientation , papertype = papertype , ** kwargs )
786
803
787
804
@cbook ._delete_parameter ("3.2" , "dryrun" )
788
805
def _print_figure (
789
- self , outfile , format , dpi , facecolor , edgecolor ,
790
- orientation , papertype , * ,
791
- metadata = None , dryrun = False , bbox_inches_restore = None , ** kwargs ):
806
+ self , outfile , format , * ,
807
+ dpi , dsc_comments , orientation , papertype ,
808
+ dryrun = False , bbox_inches_restore = None , ** kwargs ):
792
809
"""
793
- Render the figure to hardcopy. Set the figure patch face and
794
- edge colors. This is useful because some of the GUIs have a
795
- gray figure face color background and you'll probably want to
796
- override this on hardcopy
797
-
798
- If outfile is a string, it is interpreted as a file name.
799
- If the extension matches .ep* write encapsulated postscript,
800
- otherwise write a stand-alone PostScript file.
801
-
802
- If outfile is a file object, a stand-alone PostScript file is
803
- written into this file object.
810
+ Render the figure to a filesystem path or a file-like object.
804
811
805
- metadata must be a dictionary. Currently, only the value for
806
- the key 'Creator' is used.
812
+ Parameters are as for `.print_figure`, except that *dsc_comments* is a
813
+ all string containing Document Structuring Convention comments,
814
+ generated from the *metadata* parameter to `.print_figure`.
807
815
"""
808
816
is_eps = format == 'eps'
809
817
if isinstance (outfile , (str , os .PathLike )):
810
- outfile = title = os .fspath (outfile )
811
- title = title .encode ("ascii" , "replace" ).decode ("ascii" )
818
+ outfile = os .fspath (outfile )
812
819
passed_in_file_object = False
813
820
elif is_writable_file_like (outfile ):
814
- title = None
815
821
passed_in_file_object = True
816
822
else :
817
823
raise ValueError ("outfile must be a path or a file-like object" )
@@ -848,12 +854,6 @@ def _print_figure(
848
854
rotation = 90
849
855
bbox = (llx , lly , urx , ury )
850
856
851
- # generate PostScript code for the figure and store it in a string
852
- origfacecolor = self .figure .get_facecolor ()
853
- origedgecolor = self .figure .get_edgecolor ()
854
- self .figure .set_facecolor (facecolor )
855
- self .figure .set_edgecolor (edgecolor )
856
-
857
857
if dryrun :
858
858
class NullWriter :
859
859
def write (self , * args , ** kwargs ):
@@ -874,16 +874,6 @@ def write(self, *args, **kwargs):
874
874
if dryrun : # return immediately if dryrun (tightbbox=True)
875
875
return
876
876
877
- self .figure .set_facecolor (origfacecolor )
878
- self .figure .set_edgecolor (origedgecolor )
879
-
880
- # check for custom metadata
881
- if metadata is not None and 'Creator' in metadata :
882
- creator_str = metadata ['Creator' ]
883
- else :
884
- creator_str = \
885
- f"matplotlib version { mpl .__version__ } , http://matplotlib.org/"
886
-
887
877
def print_figure_impl (fh ):
888
878
# write the PostScript headers
889
879
if is_eps :
@@ -893,18 +883,7 @@ def print_figure_impl(fh):
893
883
f"%%DocumentPaperSizes: { papertype } \n "
894
884
f"%%Pages: 1\n " ,
895
885
end = "" , file = fh )
896
- if title :
897
- print ("%%Title: " + title , file = fh )
898
- # get source date from SOURCE_DATE_EPOCH, if set
899
- # See https://reproducible-builds.org/specs/source-date-epoch/
900
- source_date_epoch = os .getenv ("SOURCE_DATE_EPOCH" )
901
- if source_date_epoch :
902
- source_date = datetime .datetime .utcfromtimestamp (
903
- int (source_date_epoch )).strftime ("%a %b %d %H:%M:%S %Y" )
904
- else :
905
- source_date = time .ctime ()
906
- print (f"%%Creator: { creator_str } \n "
907
- f"%%CreationDate: { source_date } \n "
886
+ print (f"{ dsc_comments } \n "
908
887
f"%%Orientation: { orientation .name } \n "
909
888
f"%%BoundingBox: { bbox [0 ]} { bbox [1 ]} { bbox [2 ]} { bbox [3 ]} \n "
910
889
f"%%EndComments\n " ,
@@ -1006,28 +985,18 @@ def print_figure_impl(fh):
1006
985
1007
986
@cbook ._delete_parameter ("3.2" , "dryrun" )
1008
987
def _print_figure_tex (
1009
- self , outfile , format , dpi , facecolor , edgecolor ,
1010
- orientation , papertype , * ,
1011
- metadata = None , dryrun = False , bbox_inches_restore = None , ** kwargs ):
988
+ self , outfile , format , * ,
989
+ dpi , dsc_comments , orientation , papertype ,
990
+ dryrun = False , bbox_inches_restore = None , ** kwargs ):
1012
991
"""
1013
- If text.usetex is True in rc , a temporary pair of tex/eps files
992
+ If :rc:` text.usetex` is True, a temporary pair of tex/eps files
1014
993
are created to allow tex to manage the text layout via the PSFrags
1015
994
package. These files are processed to yield the final ps or eps file.
1016
995
1017
- metadata must be a dictionary. Currently, only the value for
1018
- the key 'Creator' is used.
996
+ The rest of the behavior is as for `._print_figure`.
1019
997
"""
1020
998
is_eps = format == 'eps'
1021
- if is_writable_file_like (outfile ):
1022
- title = None
1023
- else :
1024
- try :
1025
- title = os .fspath (outfile )
1026
- except TypeError :
1027
- raise ValueError (
1028
- "outfile must be a path or a file-like object" )
1029
999
1030
- self .figure .dpi = 72 # ignore the dpi kwarg
1031
1000
width , height = self .figure .get_size_inches ()
1032
1001
xo = 0
1033
1002
yo = 0
@@ -1039,12 +1008,6 @@ def _print_figure_tex(
1039
1008
ury = lly + h
1040
1009
bbox = (llx , lly , urx , ury )
1041
1010
1042
- # generate PostScript code for the figure and store it in a string
1043
- origfacecolor = self .figure .get_facecolor ()
1044
- origedgecolor = self .figure .get_edgecolor ()
1045
- self .figure .set_facecolor (facecolor )
1046
- self .figure .set_edgecolor (edgecolor )
1047
-
1048
1011
if dryrun :
1049
1012
class NullWriter :
1050
1013
def write (self , * args , ** kwargs ):
@@ -1065,35 +1028,13 @@ def write(self, *args, **kwargs):
1065
1028
if dryrun : # return immediately if dryrun (tightbbox=True)
1066
1029
return
1067
1030
1068
- self .figure .set_facecolor (origfacecolor )
1069
- self .figure .set_edgecolor (origedgecolor )
1070
-
1071
- # check for custom metadata
1072
- if metadata is not None and 'Creator' in metadata :
1073
- creator_str = metadata ['Creator' ]
1074
- else :
1075
- creator_str = \
1076
- f"matplotlib version { mpl .__version__ } , http://matplotlib.org/"
1077
-
1078
1031
# write to a temp file, we'll move it to outfile when done
1079
-
1080
1032
with TemporaryDirectory () as tmpdir :
1081
1033
tmpfile = os .path .join (tmpdir , "tmp.ps" )
1082
- # get source date from SOURCE_DATE_EPOCH, if set
1083
- # See https://reproducible-builds.org/specs/source-date-epoch/
1084
- source_date_epoch = os .getenv ("SOURCE_DATE_EPOCH" )
1085
- if source_date_epoch :
1086
- source_date = datetime .datetime .utcfromtimestamp (
1087
- int (source_date_epoch )).strftime ("%a %b %d %H:%M:%S %Y" )
1088
- else :
1089
- source_date = time .ctime ()
1090
1034
pathlib .Path (tmpfile ).write_text (
1091
1035
f"""\
1092
1036
%!PS-Adobe-3.0 EPSF-3.0
1093
- { f'''%%Title: { title }
1094
- ''' if title else "" } \
1095
- %%Creator: { creator_str }
1096
- %%CreationDate: { source_date }
1037
+ { dsc_comments }
1097
1038
%%BoundingBox: { bbox [0 ]} { bbox [1 ]} { bbox [2 ]} { bbox [3 ]}
1098
1039
%%EndComments
1099
1040
%%BeginProlog
@@ -1122,12 +1063,9 @@ def write(self, *args, **kwargs):
1122
1063
paper_width , paper_height = orientation .swap_if_landscape (
1123
1064
self .figure .get_size_inches ())
1124
1065
else :
1125
- temp_papertype = _get_papertype (width , height )
1126
1066
if papertype == 'auto' :
1127
- papertype = temp_papertype
1128
- paper_width , paper_height = papersize [temp_papertype ]
1129
- else :
1130
- paper_width , paper_height = papersize [papertype ]
1067
+ papertype = _get_papertype (width , height )
1068
+ paper_width , paper_height = papersize [papertype ]
1131
1069
1132
1070
texmanager = ps_renderer .get_texmanager ()
1133
1071
font_preamble = texmanager .get_font_preamble ()
0 commit comments