--- lang: ja-jp breaks: true --- # Crystal Reports で印刷すると 用紙サイズに合わせて意図せず縮小される場合の設定 2021-10-14 ## レジストリを変更する ```shell= Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports\DesignerOptions] "DealWithMinimalMarginsWhenPrinting"="0" [HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Crystal Reports\DesignerOptions] "DealWithMinimalMarginsWhenPrinting"="0" ``` ## 内部の処理を確認 `iLSpy`より。 ### PrintingHelper.DealWithMinimalMarginsWhenPrinting() ```csharp= private static bool DealWithMinimalMarginsWhenPrinting() { bool result = true; string name = ReportingVersion.CRYSTAL_REGISTRY_PATH + "\\Crystal Reports\\DesignerOptions"; RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(name); if (registryKey != null) { object value = registryKey.GetValue("DealWithMinimalMarginsWhenPrinting"); if (value is string text && text != "1") { result = false; } } return result; } ``` :::info レジストリの設定を0にすると、上記メソッドが`false`を返す。レジストリ未設定の場合は、`true`を返す。 ::: ### PrintingHelper.CalculatePrintLayout() ```csharp= private static bool CalculatePrintLayout( TwipSize physicalSize, PageMargins minMargins, TwipSize logicalSize, PageMargins reportMargins, PrintLayoutSettings layoutSettings, out double scalingFactor, out int offsetX, out int offsetY ) { scalingFactor = 1.0; offsetX = 0; offsetY = 0; bool flag = NeedToAdjustPageSize(layoutSettings, logicalSize, physicalSize); bool flag2 = false; if (flag) { scalingFactor = CalculateScalingFactor(physicalSize, logicalSize); } if (layoutSettings.Centered) { TwipSize twipSize = new TwipSize((int)((double)logicalSize.Width * scalingFactor), (int)((double)logicalSize.Height * scalingFactor)); offsetX = (int)((double)((physicalSize.Width - twipSize.Width) / 2) / scalingFactor); offsetY = (int)((double)((physicalSize.Height - twipSize.Height) / 2) / scalingFactor); } PageMargins pageMargins = new PageMargins(reportMargins.leftMargin + offsetX, reportMargins.topMargin + offsetY, reportMargins.rightMargin + offsetX, reportMargins.bottomMargin + offsetY); PageMargins pageMargins2 = new PageMargins((int)((double)pageMargins.leftMargin * scalingFactor), (int)((double)pageMargins.topMargin * scalingFactor), (int)((double)pageMargins.rightMargin * scalingFactor), (int)((double)pageMargins.bottomMargin * scalingFactor)); PageMargins empty = PageMargins.Empty; if (DealWithMinimalMarginsWhenPrinting()) { empty = new PageMargins( Math.Max(pageMargins2.leftMargin, minMargins.leftMargin), Math.Max(pageMargins2.topMargin, minMargins.topMargin), Math.Max(pageMargins2.rightMargin, minMargins.rightMargin), Math.Max(pageMargins2.bottomMargin, minMargins.bottomMargin) ); if (empty != pageMargins2) { flag2 = DealWithMinimalMargins( physicalSize, minMargins, logicalSize, reportMargins, ref scalingFactor, out offsetX, out offsetY, out empty ); } } else { empty = pageMargins; } offsetX = (int)((double)(empty.leftMargin - minMargins.leftMargin) / scalingFactor); offsetY = (int)((double)(empty.topMargin - minMargins.topMargin) / scalingFactor); return flag || flag2; } ``` :::info `DealWithMinimalMarginsWhenPrinting()`が`true`を返す場合にのみ、マージンを調整していることがうかがえる。 ::: ###### tags: `Crystal Reports` `縮小` `レジストリ` `DealWithMinimalMarginsWhenPrinting` `用紙サイズ`