为了账号安全,请及时绑定邮箱和手机立即绑定

如何保存占据PDF文件整个页面的绘图

如何保存占据PDF文件整个页面的绘图

小怪兽爱吃肉 2022-01-11 17:22:32
我想创建一个用于使用 python打印的多页 PDF 文件。我更愿意使用可以在任何环境中正常工作的库来做到这一点,所以我尝试使用matplotlib。我可以制作所需的 A4 大小的图形,并创建一个多页的 PDF 文件,但图形艺术家缩小并且不占据整个页面。我可以生成 A4 大小页面的 PDF 并在图形周围填充,或者生成页面尺寸较小的 PDF 文件(页面在图形周围缩小以移除填充,图形保持相同大小)。有人可以帮忙吗?(我不认为这是重复的,还有其他关于填充的问题,但与我的目标不同,我看不到任何对我有用的答案 - 我已经搜索了好几天!)到目前为止,我在几个 SO 问题/答案之后尝试过的是:bbox_inches='tight', pad_inches=0在pyplot.savefig()函数中使用,它提供了一个小于 A4 的 PDF 页面,没有填充。(奇怪的是,这适用于 EPS 格式,它可以在 A4 纸上直接打印成实际尺寸,但我不知道如何制作多页文件。)如果我不使用bbox_inches='tight', pad_inches=0,图形大小似乎或多或少相同,但周围的填充填充空间以制作 A4 页面。使用fig.tight_layout(rect=[0,0,1,1])or fig.tight_layout(pad=0),它保留填充。此示例代码以 EPS(A4 无填充)、PDF(A4 带填充)和 TIFF(无填充但尺寸较小,因此打印时有填充)生成图形:import matplotlib.pyplot as pltfrom matplotlib import gridspecdef 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]
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

我找到了一个解决方案,可以创建一个 A4 形状的图形,当另存为 A4 PDF 页面时,它会占据整个页面(不是 100% 正确,有一个很小的利润,但它可以达到目的)。


它只需要添加gs.tight_layout(fig, pad=0). 我不完全明白为什么,但我怀疑当我试图消除figure对象的填充(使用plt.savefig(..., bbox_inches='tight', pad_inches=0)or fig.tight_layout(...))时,图形可能会到达 A4 页面的边框,但GridSpec不会,所以我看到的填充是在 theGridSpec和 the的边界之间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')



查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信