【问题标题】:Save Matlab Simulink Model as PDF with tight bounding box将 Matlab Simulink 模型另存为带有紧密边界框的 PDF
【发布时间】:2014-01-20 16:01:34
【问题描述】:

给定一个 Simulink 框图(模型),我想制作一个“屏幕截图”,以便稍后在 LaTeX 文档中使用。我希望这个屏幕截图是带有紧密边界框的 PDF(矢量图形,-> pdflatex),我的意思是图表周围没有不必要的空白。

我搜索了网络,搜索了 stackexchange,搜索了 matlab 文档。但到目前为止还没有成功。一些注意事项:

  1. 对于数字,有此问题的解决方案。我有一个 Simulink 框图,它是不同的(见下文)。
  2. 我知道使用 pdfcrop 等附加软件的解决方案。
  3. PDF 似乎是唯一真正产生矢量图形的驱动程序(此处为 Win7 上的 R2013b)。 EPS 和 PS 输出内部似乎有位图。你放大,你看到它。

我尝试过的:

1.

print的默认行为

modelName = 'vdp';         % example system
load_system(modelName);    % load in background

% print to file as pdf and as jpeg
print(['-s',modelName],'-dpdf','pdfOutput1')
print(['-s',modelName],'-djpeg','jpegOutput1')

JPEG 看起来不错,边界框很紧。 PDF 以看起来像 A4 或 usletter 的页面为中心。不是我想要的。

2.

有几个用于打印框图的参数。请参阅 Simulink 参考页 http://www.mathworks.com/help/simulink/slref/model-parameters.html。让我们提取一些:

modelName = 'vdp';         % example system
load_system(modelName);    % load in background

PaperPositionMode = get_param(modelName,'PaperPositionMode');
PaperUnits        = get_param(modelName,'PaperUnits');
PaperPosition     = get_param(modelName,'PaperPosition');
PaperSize         = get_param(modelName,'PaperSize');

根据文档,PaperPosition 包含一个四元素向量 [left, bottom, width, height]。最后两个元素指定bounding box,前两个指定bounding box左下角到纸张左下角的距离。

现在,当我打印 PDF 输出并使用标尺测量时,我发现边界框的值及其左下角的位置都完全错误(是的,我在 PaperUnits 中测量过)。这真是个无赖。我本可以计算出边距来修剪纸张,以便稍后在\includegraphics[clip=true,trim=...]{pdfpage} 中使用。

3.

当然,我最初想要的是已经裁剪的 PDF。有一个数字的解决方案,它是这样的:将边界框移动到纸张的左下角,然后将纸张大小更改为边界框的大小。

oldPaperPosition = get_param(modelName,'PaperPosition');

set_param(modelName,'PaperPositionMode','manual');
set_param(modelName,'PaperPosition',[0 0 oldPaperPosition(3:4)]);
set_param(modelName,'PaperSize',oldPaperPosition(3:4));

对于 simulink 模型,这有两个问题。 PaperSize 是模型的只读参数。并且更改 PaperPosition 对输出完全没有影响。

我的想法已经用完了,真的。

编辑 ----------------------------------

好的,让您随时了解最新信息:我已与 Matlab 支持人员讨论过这个问题。

  • 在 R2013b 中,存在导致 PaperPositionMode 的错误行为和 PaperPostion 的边界框错误的错误。
  • 没有从打印中提取比例因子的已知方法。
  • 他们建议采用这种方式:Simulink --(print)--> SVG --(Inkscape)--> PDF。这种方式真的很好用。 (正确的)边界框是 svg 节点的属性,导出到 SVG 时的比例因子始终相同。此外,Inkscape 会生成已裁剪的 PDF。所以这种方法解决了我所有的问题,只是你需要 Inkscape。

【问题讨论】:

  • 之后裁剪 pdf 有什么问题?有一些工具 - pdfcrop 或 Briss。
  • 有两个问题。 print 按照它的想法缩放模型,我找不到从中获取比例因子的方法。所以通过裁剪它没有完成。假设我希望 Simulink 模型中的 10pt 字体在我的文档后面的许多模型中看起来相同。我该怎么做呢?我正在编写一个工具供其他人使用。他们不想手工做东西,也不喜欢安装额外的软件,这是第二个问题。
  • 这应该有效地给出相同的结果:tex.stackexchange.com/questions/57418/crop-an-inserted-image

标签: matlab pdf printing simulink


【解决方案1】:

您可以尝试export_fig 导出您的数据。所见即所得!由于所制作媒体的高质量和便携性,此功能特别适合导出用于出版物和演示文稿的图形。

【讨论】:

  • 不确定这是否适用于 Simulink 模型,但绝对值得一试。
【解决方案2】:

为什么你不喜欢使用 pdfcrop?

我的代码完美运行,一切都在 Matlab 中:

function prints(name)
   %%Prints Print current simulink model screen and save as eps and pdf

   print('-s', '-depsc','-tiff', name)
   print('-s', '-dpdf','-tiff', name)
   dos(['pdfcrop ' name '.pdf '  name '.pdf &']);
end

你只需要使用“dos”命令调用pdfcrop,就可以了!

【讨论】:

    【解决方案3】:

    在 2021a 上,您有 exportgraphics。 美丽的 pdf 图片。

    figure(3);
    plot(Time.Data,wSOHO_KpKi.Data,'-',Time.Data,Demanded_Speed.Data,'--');
    grid;
    xlh = xlabel('$\mathrm{t\left [ s \right ]}$','interpreter','latex',"FontSize",15);
    ylh = ylabel('$\mathrm{\omega _{m}\left [ rads/s \right ]}$','interpreter','latex',"FontSize",15);
    xlh.Position(2) = xlh.Position(2) - abs(xlh.Position(2) * 0.05);
    ylh.Position(1) = ylh.Position(1) - abs(ylh.Position(1) * 0.01);
    exportgraphics(figure(3),'Grafico de Escalon Inicial velocidad estimada por algoritmo SOHO-KpKi.pdf');
    

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多