I solved this once using a custom webpart that loaded a custom javascript file on pages where the report service webparts resides (requires jQuery). The following snippet is a bit old and might contain requirements not eligible to yours but you should get the point:
jQuery(document).ready(function () {
var $rsViewers = $('div[rsviewer=RSViewer]'),
toolbarHeight = $('tr[id$=ToolbarRow]').height(),
/* Function that updates the reports height to fit its contents */
updateReportHeight = function ($rsViewer) {
var $visibleReportContent = $('div[id^=VisibleReportContent]', $rsViewer);
/* Wait until visible */
if ($visibleReportContent.is(':visible')) {
var newHeight = $('table[id$=ReportViewer_fixedTable]', $rsViewer).height() + toolbarHeight,
currentHeight = $rsViewer.height();
/* If width of content greater than webpart, add horizontal scroll */
if ($('table[id$=ReportViewer_fixedTable]').width() > $('div[id$=ViewerAreaUpdatePanel]', $rsViewer).width()) {
$('div[id$=ReportViewer]', $rsViewer).css('overflow-y', 'hidden').css('overflow-x', 'scroll');
} else {
$('div[id$=ReportViewer]', $rsViewer).css('overflow-y', 'hidden').css('overflow-x', 'hidden');
}
/* Already equal - abort */
if (newHeight == currentHeight) {
return;
}
/* Modify css and attributes so we get wanted behaviour */
$rsViewer.parent('div[id^=WebPartWP]').css('overflow', '');
$visibleReportContent.css('height', newHeight + 'px');
$('td[id$=ViewerCell]', $rsViewer).css('height', newHeight + 'px');
$('div[id$=ViewerAreaUpdatePanel]', $rsViewer).css('height', '');
$('td[id$=CenterPanelCell]', $rsViewer).attr('valign', 'top');
$('div[id$=PromptAreaUpdatePanel]', $rsViewer).parent().attr('valign', 'top');
$('.sqlrv-SeparatorContainer', $rsViewer).css('height', (newHeight - 10) + 'px').parent().attr('valign', 'top');
} else {
setTimeout(function () {
updateReportHeight($rsViewer);
}, 500);
}
};
/* For each ReportViewer webpart, adjust the height */
$rsViewers.each(function (index, value) {
updateReportHeight($($rsViewers[index]));
});
/* Bind the 'removeParameterContainerHeight' function so it fires when the webpart is updated through the updatepanel. */
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function (sender, args) {
var $rsViewers = $('div[rsviewer=RSViewer]');
$rsViewers.each(function (index, value) {
updateReportHeight($($rsViewers[index]));
});
});
});