首页 文章

使用紧凑的边界框将Matlab Simulink模型保存为PDF

提问于
浏览
3

Given a Simulink block diagram (model), I would like to produce a 'Screenshot' to be used later in a LaTeX document. I want this screenshot to be PDF (vector graphic, -> pdflatex) with a tight bounding box, by that I mean no unneccessary white space around the diagram.

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

  • 对于数字,这个问题有解决方案 . 我有一个Simulink框图,它有所不同(见下文) .

  • 我知道使用其他软件的解决方案,如 pdfcrop .

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

现在当我打印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 .

2 回答

  • 1

    您可以尝试export_fig导出您的数字 . 所见即所得!由于所 生产环境 的媒体的高质量和便携性,该功能特别适合于出口用于出版物和演示文稿的数字 .

  • 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,它就可以了!

相关问题