---
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` `用紙サイズ`