none
Xamlで帳票を印刷すると細い線が消える RRS feed

  • 質問

  • 初歩的な質問で失礼いたします。

    Xamlで印刷用の帳票を作成しているのですが、帳票で描いている線が消えてしまい困っています。

    プレビューを表示すると線は見えるのですが、印刷を行うと消えています。

    「Background="Transparent"」に設定を行っても線が消えます。

    バックグランドを透明に設定しておけば消えないと考えていたのですが、それでもダメでした。

    印刷機の設定なども疑ったのですが、プリンタのプロパティを「プリンターに直接印刷データを送る」に

    変更しても結果は同じでした。

    その他、ハイコントラストの設定はオフで、Microsoft XPS Document Writerに出力しプレビューを確認すると線はでており

    印刷すると消えました。

    そもそも、透明にしたにも関わらず線が消える理由はなぜでしょうか?

    また、何か方法があれば教えて頂きたいです。

    <UserControl ~省略~
                 Background="Transparent">
        <UserControl.Resources>
            <Style x:Key="LineStyle" TargetType="{x:Type Line}">
                <Setter Property="StrokeThickness" Value="0.1" />
                <Setter Property="Stroke" Value="Black" />
                <Setter Property="StrokeDashArray" Value="20,10" />
            </Style>
        </UserControl.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="1"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="18"/>
                <ColumnDefinition Width="1*"/>
            </Grid.ColumnDefinitions>
                <TextBlock Text="テスト" VerticalAlignment="Center"/>
            <Border Grid.Row="1" Grid.ColumnSpan="2" BorderThickness="0,0,0,0.1" >
                <Border.BorderBrush>
                    <VisualBrush>
                        <VisualBrush.Visual>
                            <Line X1="0" X2="{Binding pageWidth}" Style="{StaticResource LineStyle}"/>
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Border.BorderBrush>
            </Border>
        </Grid>
    </UserControl>

    2018年12月21日 1:58

回答

  • 線が細すぎだからです。

    WPFの座標系は96/インチなので0.1の幅は1/960インチ(0.02646mm)です。
    つまり、この線をきちんと印刷しようとすると960dp以上のプリンタが必要です。

    例えば、レーザープリンタだと標準画質600dpi,高画質モード1200dpiなどありますが、標準設定だとdpiが足らずに消えて、高画質だとdpiが足りて印字されるということになったりします。

    ディスプレイだと白背景に細い黒線の場合は、アンチエイリアス処理などで周囲の色を混ざって灰色でうっすらと表示されます。
    プリンタの場合は、WPFの描画システムは手順の重ね合わせの結果なので、アンチエイリアス処理されるかどうかはプリンタ次第になります。
    アンチエイリアスが効くプリンタならdpiが低くてもうっすら印刷されるでしょう。

    あとはもしかしたらSnapsToDevicePixelsプロパティをtrueにしたら少し改善するかもしれません。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2018年12月21日 3:44
    • 回答としてマーク hisai 2018年12月25日 1:13
    2018年12月21日 3:38

すべての返信

  • 確認です。
    XPSに出力して、その後の「印刷すると消えました」は、XPSを印刷した、という事でよろしいですか?
    「プリンターに直接データを送る」は、スプールするかどうかなので、印刷されるイメージとは関係ありません。
    プリンターの設定に、細線を太くする、のようなオプションがあれば、それをいじってみて下さい。

    Jitta@わんくま同盟

    2018年12月21日 2:45
  • Excelでも、プリンターによってはWindowsに付属しているプリンタードライバーをそのまま使うと線が消えることがあります。
    プリンタードライバーがメーカーのWebページからダウンロードした最新のものであるか確認してみて下さい。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年12月21日 3:05
    モデレータ
  • Jittaさん説明が足りず申し訳ありあませんでした。

    XPSを印刷したということで大丈夫です。

    私が作成したアプリでプレビュー時に線が見えるのに対し、印刷時には消えてしまうので

    XPSでも確認を行うと同じような結果になったという事です。

    また、「プリンターの設定に、細線を太くする」設定があったので試してみましたが線は印字されませんでした...

    2018年12月21日 3:08
  • 線が細すぎだからです。

    WPFの座標系は96/インチなので0.1の幅は1/960インチ(0.02646mm)です。
    つまり、この線をきちんと印刷しようとすると960dp以上のプリンタが必要です。

    例えば、レーザープリンタだと標準画質600dpi,高画質モード1200dpiなどありますが、標準設定だとdpiが足らずに消えて、高画質だとdpiが足りて印字されるということになったりします。

    ディスプレイだと白背景に細い黒線の場合は、アンチエイリアス処理などで周囲の色を混ざって灰色でうっすらと表示されます。
    プリンタの場合は、WPFの描画システムは手順の重ね合わせの結果なので、アンチエイリアス処理されるかどうかはプリンタ次第になります。
    アンチエイリアスが効くプリンタならdpiが低くてもうっすら印刷されるでしょう。

    あとはもしかしたらSnapsToDevicePixelsプロパティをtrueにしたら少し改善するかもしれません。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2018年12月21日 3:44
    • 回答としてマーク hisai 2018年12月25日 1:13
    2018年12月21日 3:38
  • trapemiyaさん

    プリンタードライバーを最新に更新しましたが、それでも改善はしませんでした。

    2018年12月21日 3:53
  • gekkaさん

    上記のグリットを何行か続けて記載を行うと、一行の項目のみ線が入らないので

    単純に線が細すぎるだけではないと思っています。

    SnapsToDevicePixelsを設定しても変化は見られませんでした。

    アンチエイリアスを試してみようと思います。

    ありがとうございました。

    2018年12月21日 7:24
  • 回答ではないですが、

    自分の環境で、罫線ではないですが、細線が消える事が起きています。
    こちらはプリンタの問題では無いかと思っています。

    環境: 某社の安いインクジェックプリンタ。
    Windows10上から、印刷

    PDFとかの文書を印刷すると、ほぼ確実に文字の細線部分が消えます。(別のはOK) 最初は安いし、仕方ないかと思っていたのですが、最近、見捨てる決断をしました。

    プリンタの依存性はないでしょうか?

    参考までに。
    あ、.... 出力ファイルをダンプすれば、分かるかもと思ったのですが、ドライバアンインストールしてしまった。

    2018年12月22日 1:05
  • pepperleaf01さん

    とりあえず、BorderにMargin設定をすることで線は印字されるようになりました。

    これで何故上手くいったのかは全く分からないですが、とりあえず線は出るようになりました。

    ですがプリンタによっては印字されない場合もあるので、pepperleaf01さんやgekkaさんが言うように

    プリンタの性能の問題ではないかと判断しました。

    ありがとうございました。

    2018年12月25日 1:21