如何保存占据PDF文件整页的情节
How to save a plot occupying the whole page of a PDF file
我想使用 python 创建一个 用于打印的多页 PDF 文件。我更愿意使用可以在任何环境中正常工作的库来执行此操作,因此我尝试使用 matplotlib.
我可以生成想要的 A4 大小的图形,并创建一个多页 PDF 文件,但是 图形艺术家缩小并且不占满整个页面。
我可以生成 A4 大小页面的 PDF,并在图形周围添加填充,或者生成较小页面尺寸的 PDF 文件(页面在图形周围缩小以移除填充,图形保持相同大小) .
有人可以帮忙吗?
(我不认为这是重复的,还有其他关于填充的问题,但与我的目标不同,我看不到任何对我有用的答案 - 我已经搜索了好几天!)
到目前为止,我在一些 SO questions/answers 之后尝试的是:
- 在
pyplot.savefig()
函数中使用 bbox_inches='tight', pad_inches=0
,生成小于 A4 的无填充 PDF 页面。
(奇怪的是,这适用于 EPS 格式,它可以在 A4 纸上直接打印成实际尺寸,但我不知道如何用它制作多页文件。)
如果我不使用bbox_inches='tight', pad_inches=0
,图形大小看起来差不多,但是周围的填充填充了space来制作A4页面。
使用fig.tight_layout(rect=[0,0,1,1])
或fig.tight_layout(pad=0)
,保留填充。
此示例代码生成 EPS(A4 无填充)、PDF(A4 带填充)和 TIFF(无填充但尺寸较小,因此当您打印时它有填充)的图形:
import matplotlib.pyplot as plt
from matplotlib import gridspec
def plot_form_page():
# A4 canvas
fig_width_cm = 21 # A4 page
fig_height_cm = 29.7
inches_per_cm = 1 / 2.54 # Convert cm to inches
fig_width = fig_width_cm * inches_per_cm # width in inches
fig_height = fig_height_cm * inches_per_cm # height in inches
fig_size = [fig_width, fig_height]
plt.rc('text', usetex=False) # so that LaTeX is not needed when creating a PDF with PdfPages later on
fig = plt.figure()
fig.set_size_inches(fig_size)
fig.set_facecolor('#9999ff')
gs = gridspec.GridSpec(29, 21, wspace=0.1, hspace=0.1)
# external axis
ax0 = fig.add_subplot(gs[:, :])
# for side in ["top", "bottom", "left", "right"]:
# ax0.spines[side].set_visible(False)
# header
ax1 = fig.add_subplot(gs[1:4, 1:4])
ax1.set_facecolor('#bbffbb')
ax2 = fig.add_subplot(gs[1:4, 4:-6])
ax2.set_facecolor('#ffbbff')
ax3 = fig.add_subplot(gs[1:4, -6:-1])
ax3.set_facecolor('#00bbff')
# form
ax4, ax5, ax6, ax7 = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 1:10]) for i in range(4)]
[ax8, ax9, ax10, ax11] = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 11:20]) for i in range(4)]
axes = [ax4, ax8, ax5, ax9, ax6, ax10, ax7, ax11]
for ax in axes:
ax.set_facecolor('#bbbbbb')
for ax in fig.axes:
ax.set_xticks([])
ax.set_yticks([])
print(fig.properties()['figwidth'], fig.properties()['figheight'])
# from previous tests:
#fig.tight_layout(pad=0)
plot_form_page()
plt.savefig('page.tiff',
dpi=300,
orientation='portrait',
box_inches='tight', pad_inches=0)
plt.savefig('page.pdf',
dpi=300,
orientation='portrait',
bbox_inches='tight', pad_inches=0)
plt.savefig('page.eps',
dpi=300,
orientation='portrait',
papertype='a4',
bbox_inches='tight', pad_inches=0)
fig.properties() 给我正确的 A4 尺寸(以英寸为单位):
fig.properties()['figwidth']
fig.properties()['figheight']
8.26771653543307 11.69291338582677
但打印时图形会缩小以允许填充
您可以在此处查看 PDF 文件中的效果:
https://www.dropbox.com/s/naqy9vj4ht6g2mv/Screenshot%202019-04-16%20at%2011.46.48.png?dl=0
使用 EPS 问题不大:
https://www.dropbox.com/s/umycd8ofwod3nk5/Screenshot%202019-04-16%20at%2012.05.52.png?dl=0
(但同样,我不知道如何创建多页 EPS)
对于 TIFF 文件,我得到相同的结果:
https://www.dropbox.com/s/eid1zstbm954121/Screenshot%202019-04-16%20at%2012.11.59.png?dl=0
这不一定是因为打印软件添加了填充 - 现在的图实际上更小,因为它在 300dpi 下为 1929 × 2655 像素,这使得它为 6.43 × 8.85 英寸 - 肯定比 A4 小。
编辑:当然,这可以通过使用选项 'fit the page' 打印来解决,但这适用于任何具有 A4 比例 的图像,如果可能的话,我想控制尺寸。
感谢@ImportanceOfBeingErnest 的评论,经过反复试验,我找到了一个创建 A4 形状图形的解决方案,当另存为 A4 PDF 页面时,它占据了整个页面(不是 100 % 正确,有很小的余量,但它达到了目的)。
只需要添加gs.tight_layout(fig, pad=0)
。我不完全明白为什么,但我怀疑当我试图消除 figure
对象的填充时(使用 plt.savefig(..., bbox_inches='tight', pad_inches=0)
或 fig.tight_layout(...)
),图形可能会到达边界A4 页面,但 GridSpec
不会,所以我看到的填充是在 GridSpec
和 figure
的边界之间,而不是纸张的边界。当 GridSpec
和 figure
之间的填充设置为 0,并且 figure
为 A4 尺寸时,事情似乎如我所愿。
(我仍然不明白为什么在某些情况下PDF文件的页面会变小,但我打算把它留在这里)。
这是我想要的代码,如果您创建 PDF 文件,打开并检查属性,大小为 A4,矩形靠近边框。对于其他选项,页边距较大或页面尺寸较小。
import matplotlib.pyplot as plt
from matplotlib import gridspec
def plot_form_page():
# A4 canvas
fig_width_cm = 21 # A4 page
fig_height_cm = 29.7
inches_per_cm = 1 / 2.54 # Convert cm to inches
fig_width = fig_width_cm * inches_per_cm # width in inches
fig_height = fig_height_cm * inches_per_cm # height in inches
fig_size = [fig_width, fig_height]
plt.rc('text', usetex=False) # so that LaTeX is not needed when creating a PDF with PdfPages later on
fig = plt.figure()
fig.set_size_inches(fig_size)
fig.set_facecolor('#9999ff')
gs = gridspec.GridSpec(29, 21, wspace=0.1, hspace=0.1)
# external axis
ax0 = fig.add_subplot(gs[:, :])
# for side in ["top", "bottom", "left", "right"]:
# ax0.spines[side].set_visible(False)
# header
ax1 = fig.add_subplot(gs[1:4, 1:4])
ax1.set_facecolor('#bbffbb')
ax2 = fig.add_subplot(gs[1:4, 4:-6])
ax2.set_facecolor('#ffbbff')
ax3 = fig.add_subplot(gs[1:4, -6:-1])
ax3.set_facecolor('#00bbff')
# form
ax4, ax5, ax6, ax7 = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 1:10]) for i in range(4)]
[ax8, ax9, ax10, ax11] = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 11:20]) for i in range(4)]
axes = [ax4, ax8, ax5, ax9, ax6, ax10, ax7, ax11]
for ax in axes:
ax.set_facecolor('#bbbbbb')
for ax in fig.axes:
ax.set_xticks([])
ax.set_yticks([])
#print(fig.properties()['figwidth'], fig.properties()['figheight'])
gs.tight_layout(fig, pad=0)
plot_form_page()
plt.savefig('page.pdf',
dpi=300,
orientation='portrait')
我想使用 python 创建一个 用于打印的多页 PDF 文件。我更愿意使用可以在任何环境中正常工作的库来执行此操作,因此我尝试使用 matplotlib.
我可以生成想要的 A4 大小的图形,并创建一个多页 PDF 文件,但是 图形艺术家缩小并且不占满整个页面。
我可以生成 A4 大小页面的 PDF,并在图形周围添加填充,或者生成较小页面尺寸的 PDF 文件(页面在图形周围缩小以移除填充,图形保持相同大小) .
有人可以帮忙吗?
(我不认为这是重复的,还有其他关于填充的问题,但与我的目标不同,我看不到任何对我有用的答案 - 我已经搜索了好几天!)
到目前为止,我在一些 SO questions/answers 之后尝试的是:
- 在
pyplot.savefig()
函数中使用bbox_inches='tight', pad_inches=0
,生成小于 A4 的无填充 PDF 页面。
(奇怪的是,这适用于 EPS 格式,它可以在 A4 纸上直接打印成实际尺寸,但我不知道如何用它制作多页文件。)
如果我不使用
bbox_inches='tight', pad_inches=0
,图形大小看起来差不多,但是周围的填充填充了space来制作A4页面。使用
fig.tight_layout(rect=[0,0,1,1])
或fig.tight_layout(pad=0)
,保留填充。
此示例代码生成 EPS(A4 无填充)、PDF(A4 带填充)和 TIFF(无填充但尺寸较小,因此当您打印时它有填充)的图形:
import matplotlib.pyplot as plt
from matplotlib import gridspec
def plot_form_page():
# A4 canvas
fig_width_cm = 21 # A4 page
fig_height_cm = 29.7
inches_per_cm = 1 / 2.54 # Convert cm to inches
fig_width = fig_width_cm * inches_per_cm # width in inches
fig_height = fig_height_cm * inches_per_cm # height in inches
fig_size = [fig_width, fig_height]
plt.rc('text', usetex=False) # so that LaTeX is not needed when creating a PDF with PdfPages later on
fig = plt.figure()
fig.set_size_inches(fig_size)
fig.set_facecolor('#9999ff')
gs = gridspec.GridSpec(29, 21, wspace=0.1, hspace=0.1)
# external axis
ax0 = fig.add_subplot(gs[:, :])
# for side in ["top", "bottom", "left", "right"]:
# ax0.spines[side].set_visible(False)
# header
ax1 = fig.add_subplot(gs[1:4, 1:4])
ax1.set_facecolor('#bbffbb')
ax2 = fig.add_subplot(gs[1:4, 4:-6])
ax2.set_facecolor('#ffbbff')
ax3 = fig.add_subplot(gs[1:4, -6:-1])
ax3.set_facecolor('#00bbff')
# form
ax4, ax5, ax6, ax7 = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 1:10]) for i in range(4)]
[ax8, ax9, ax10, ax11] = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 11:20]) for i in range(4)]
axes = [ax4, ax8, ax5, ax9, ax6, ax10, ax7, ax11]
for ax in axes:
ax.set_facecolor('#bbbbbb')
for ax in fig.axes:
ax.set_xticks([])
ax.set_yticks([])
print(fig.properties()['figwidth'], fig.properties()['figheight'])
# from previous tests:
#fig.tight_layout(pad=0)
plot_form_page()
plt.savefig('page.tiff',
dpi=300,
orientation='portrait',
box_inches='tight', pad_inches=0)
plt.savefig('page.pdf',
dpi=300,
orientation='portrait',
bbox_inches='tight', pad_inches=0)
plt.savefig('page.eps',
dpi=300,
orientation='portrait',
papertype='a4',
bbox_inches='tight', pad_inches=0)
fig.properties() 给我正确的 A4 尺寸(以英寸为单位):
fig.properties()['figwidth']
fig.properties()['figheight']
8.26771653543307 11.69291338582677
但打印时图形会缩小以允许填充
您可以在此处查看 PDF 文件中的效果:
https://www.dropbox.com/s/naqy9vj4ht6g2mv/Screenshot%202019-04-16%20at%2011.46.48.png?dl=0
使用 EPS 问题不大:
https://www.dropbox.com/s/umycd8ofwod3nk5/Screenshot%202019-04-16%20at%2012.05.52.png?dl=0
(但同样,我不知道如何创建多页 EPS)
对于 TIFF 文件,我得到相同的结果:
https://www.dropbox.com/s/eid1zstbm954121/Screenshot%202019-04-16%20at%2012.11.59.png?dl=0
这不一定是因为打印软件添加了填充 - 现在的图实际上更小,因为它在 300dpi 下为 1929 × 2655 像素,这使得它为 6.43 × 8.85 英寸 - 肯定比 A4 小。
编辑:当然,这可以通过使用选项 'fit the page' 打印来解决,但这适用于任何具有 A4 比例 的图像,如果可能的话,我想控制尺寸。
感谢@ImportanceOfBeingErnest 的评论,经过反复试验,我找到了一个创建 A4 形状图形的解决方案,当另存为 A4 PDF 页面时,它占据了整个页面(不是 100 % 正确,有很小的余量,但它达到了目的)。
只需要添加gs.tight_layout(fig, pad=0)
。我不完全明白为什么,但我怀疑当我试图消除 figure
对象的填充时(使用 plt.savefig(..., bbox_inches='tight', pad_inches=0)
或 fig.tight_layout(...)
),图形可能会到达边界A4 页面,但 GridSpec
不会,所以我看到的填充是在 GridSpec
和 figure
的边界之间,而不是纸张的边界。当 GridSpec
和 figure
之间的填充设置为 0,并且 figure
为 A4 尺寸时,事情似乎如我所愿。
(我仍然不明白为什么在某些情况下PDF文件的页面会变小,但我打算把它留在这里)。
这是我想要的代码,如果您创建 PDF 文件,打开并检查属性,大小为 A4,矩形靠近边框。对于其他选项,页边距较大或页面尺寸较小。
import matplotlib.pyplot as plt
from matplotlib import gridspec
def plot_form_page():
# A4 canvas
fig_width_cm = 21 # A4 page
fig_height_cm = 29.7
inches_per_cm = 1 / 2.54 # Convert cm to inches
fig_width = fig_width_cm * inches_per_cm # width in inches
fig_height = fig_height_cm * inches_per_cm # height in inches
fig_size = [fig_width, fig_height]
plt.rc('text', usetex=False) # so that LaTeX is not needed when creating a PDF with PdfPages later on
fig = plt.figure()
fig.set_size_inches(fig_size)
fig.set_facecolor('#9999ff')
gs = gridspec.GridSpec(29, 21, wspace=0.1, hspace=0.1)
# external axis
ax0 = fig.add_subplot(gs[:, :])
# for side in ["top", "bottom", "left", "right"]:
# ax0.spines[side].set_visible(False)
# header
ax1 = fig.add_subplot(gs[1:4, 1:4])
ax1.set_facecolor('#bbffbb')
ax2 = fig.add_subplot(gs[1:4, 4:-6])
ax2.set_facecolor('#ffbbff')
ax3 = fig.add_subplot(gs[1:4, -6:-1])
ax3.set_facecolor('#00bbff')
# form
ax4, ax5, ax6, ax7 = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 1:10]) for i in range(4)]
[ax8, ax9, ax10, ax11] = [fig.add_subplot(gs[ 5+(i*6):10+(i*6), 11:20]) for i in range(4)]
axes = [ax4, ax8, ax5, ax9, ax6, ax10, ax7, ax11]
for ax in axes:
ax.set_facecolor('#bbbbbb')
for ax in fig.axes:
ax.set_xticks([])
ax.set_yticks([])
#print(fig.properties()['figwidth'], fig.properties()['figheight'])
gs.tight_layout(fig, pad=0)
plot_form_page()
plt.savefig('page.pdf',
dpi=300,
orientation='portrait')