将Matlab Simulink模型保存为PDF,带有紧密的边界框

时间:2014-01-20 16:01:35

标签: matlab pdf printing simulink

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

我搜索了网络,搜索了stackexchange,搜索了matlab doc。但到目前为止没有成功。一些说明:

  1. 对于数字,这个问题有解决方案。我有一个Simulink框图,它有所不同(见下文)。
  2. 我知道使用pdfcrop等其他软件的解决方案。
  3. PDF似乎是真正生成矢量图形的唯一驱动程序(Win7上的R2013b)。 EPS和PS输出似乎有里面的位图。你可以放大,你看到它。
  4. 我尝试过:

    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]。最后两个元素指定边界框,前两个指定边界框左下角与纸张左下角的距离。

    现在,当我打印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 - (打印) - > SVG - (Inkscape) - > PDF。这种方式非常好用。 (正确)边界框是svg节点的属性,导出到SVG时的比例因子始终相同。此外,Inkscape生成一个已经裁剪的PDF。所以这种方法解决了我所有的问题,只需要Inkscape。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

为什么你不喜欢使用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 。命令,它的工作正常!

答案 2 :(得分:0)

在 2021a 上,您有导出图形。 漂亮的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');