В этом примере показано, как создать отчет с большой схемой, которая охватывает несколько страниц.
Откройте модель с большой схемой.
model = 'slreportgen_demo_big_diagram';
open_system(model);
Создайте большой файл изображений для разделения на плитки.
imgFile = [model '.png']; print('-dpng', ['-s' model], imgFile);
Создание и открытие отчета.
% To create a Word report, change the output type from "pdf" to "docx". % To create an HTML report, change "pdf" to "html" or "html-file for % a multifile or single-file report, respectively. rpt = slreportgen.report.Report('myreport2', 'pdf'); open(rpt);
Получите информацию о макете страницы.
pageLayout = rpt.Document.CurrentPageLayout; pageSize = pageLayout.PageSize; pageMargins = pageLayout.PageMargins;
Установите верхний и нижний колонтитул страницы на 0 дюймов, чтобы максимизировать пространство.
pageMargins.Header = '0in'; pageMargins.Footer = '0in';
Определите размер плитки изображения, которая помещается на странице. Оптимальным размером плитки является размер страницы минус поля страницы, желоба, колонтитулы и нижние колонтитулы. Также, отрегулируйте высоту плитки, чтобы разрешить 0,5 дюйма для подписи. Обратите внимание, что для PDF документов MATLAB Report Generator задает один дюйм как равный 96 пикселям.
dpi = 96; units = mlreportgen.utils.units; tileHeight = units.toPixels(pageSize.Height, 'Resolution', dpi) ... - units.toPixels(pageMargins.Top, 'Resolution', dpi) ... - units.toPixels(pageMargins.Bottom, 'Resolution', dpi) ... - units.toPixels(pageMargins.Header, 'Resolution', dpi) ... - units.toPixels(pageMargins.Footer, 'Resolution', dpi) ... - units.toPixels('0.5in', 'Resolution', dpi); tileWidth = units.toPixels(pageSize.Width, 'Resolution', dpi) ... - units.toPixels(pageMargins.Left, 'Resolution', dpi) ... - units.toPixels(pageMargins.Right, 'Resolution', dpi) ... - units.toPixels(pageMargins.Gutter, 'Resolution', dpi); tileSize = [tileWidth tileHeight];
Вызовите локальную функцию sliceImage (см. ниже), чтобы срезать большой файл изображения в плитки изображений.
tiles = sliceImage(imgFile, [tileWidth tileHeight]);
Добавьте изображения плитки в отчет. Кроме того, добавьте подпись, чтобы указать, где находится изображение плитки относительно общего изображения.
for i = 1:numel(tiles) tile = tiles{i}; formalImage = mlreportgen.report.FormalImage(tile.File); formalImage.ScaleToFit = false; formalImage.Caption = sprintf('row: %d, col: %d', tile.Row, tile.Col); add(rpt, formalImage); end
Сгенерируйте и отобразите отчет.
close(rpt); rptview(rpt);
Чтобы разбить файл изображения на плитки, прочитайте в файле изображения и скопируйте детали размера плитки в несколько файлов изображения.
function tiles = sliceImage(imgFile, tileSize) % Read in the image file and determine the number of row and column % tiles. Note that the image data is row-major, where the rows are % specified first and the columns are second. img = imread(imgFile); imgSize = size(img); imgRows = imgSize(1); % image height imgCols = imgSize(2); % image width tileNumRows = tileSize(2); % tile height tileNumCols = tileSize(1); % tile width numCols = ceil(imgCols / tileNumCols); numRows = ceil(imgRows / tileNumRows); % Preallocate the tile data structures. tiles = cell(1, numCols*numRows); % Determine the base filename to create the tile image filenames. [fPath, fName, fExt] = fileparts(imgFile); tileName = fullfile(fPath, fName); % Iterate through all rows and columns. count = 0; for rowIdx = 1:numRows for colIdx = 1:numCols % Determine the starting and ending image data indices to copy % into the tile image. At the edges, the ending indices are % the number of rows and number of columns. rowStart = (rowIdx - 1) * tileNumRows + 1; rowEnd = rowStart + tileNumRows - 1; colStart = (colIdx - 1) * tileNumCols + 1; colEnd = colStart + tileNumCols - 1; if (rowEnd >= imgRows) rowEnd = imgRows; end nTileRows = rowEnd - rowStart + 1; if (colEnd >= imgCols) colEnd = imgCols; end nTileCols = colEnd - colStart + 1; % Copy the tile image data onto a white image tile. tileImg = uint8(255 * ones(tileNumRows, tileNumCols, 3)); tileImg(1:nTileRows, 1:nTileCols, :) = img(rowStart:rowEnd,... colStart:colEnd, :); % Write out the image tile. outFile = sprintf('%s_%d_%d.%s', tileName, rowIdx, colIdx, fExt); imwrite(tileImg, outFile); % Create the tile data structure to describe the tile. count = count + 1; tiles{count} = struct( ... 'File', outFile, ... 'Row', rowIdx, ... 'Col', colIdx); end end end