6

WPF のビジュアルをレシート プリンター (Star TSP 700II) に印刷しています。ビジュアルが小さいときは問題なく、問題なく印刷されます。

ただし、ビジュアルが大きくなると、画像が切り取られ、Star プリンターのロールに特定のサイズで印刷され、残りの画像を印刷せずにカットされます。

PrintDialog.PrintVisual(Grid1, "Test");

PageMediaSize を調整してみましたが、印刷結果は何も変わりません。

興味深いことに、Microsoft XPS Document Writer に印刷すると、保存されたファイルに完全なイメージが含まれています。

ここに画像の説明を入力

また、印刷されるサイズが常に最大の高さ = A4 ページの高さであることにも気付きました。問題は、A4 の高さを超えて印刷する方法です (プリンターの設定からテスト ドキュメントを印刷すると、これを行うことができます)。

4

3 に答える 3

9

わかりました、次のクラスを使用してこれを解決しました。基本的に、印刷したいものをスクロールビューアー内に配置し、その中にスタックパネルを配置してから、このスタックパネルを印刷ヘルパーに渡すと、クリッピングなしで印刷されるようになりました:

public static class PrintHelper
{

    public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog)
    {
        var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
        var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
        var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
        var fixedDoc = new FixedDocument();
        //If the toPrint visual is not displayed on screen we neeed to measure and arrange it  
        toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
        //  
        var size = toPrint.DesiredSize;
        //Will assume for simplicity the control fits horizontally on the page  
        double yOffset = 0;
        while (yOffset < size.Height)
        {
            var vb = new VisualBrush(toPrint)
            {
                Stretch = Stretch.None,
                AlignmentX = AlignmentX.Left,
                AlignmentY = AlignmentY.Top,
                ViewboxUnits = BrushMappingMode.Absolute,
                TileMode = TileMode.None,
                Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height)
            };
            var pageContent = new PageContent();
            var page = new FixedPage();
            ((IAddChild)pageContent).AddChild(page);
            fixedDoc.Pages.Add(pageContent);
            page.Width = pageSize.Width;
            page.Height = pageSize.Height;
            var canvas = new Canvas();
            FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
            FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
            canvas.Width = visibleSize.Width;
            canvas.Height = visibleSize.Height;
            canvas.Background = vb;
            page.Children.Add(canvas);
            yOffset += visibleSize.Height;
        }
        return fixedDoc;
    }

    public static void ShowPrintPreview(FixedDocument fixedDoc)
    {
        var wnd = new Window();
        var viewer = new DocumentViewer();
        viewer.Document = fixedDoc;
        wnd.Content = viewer;
        wnd.ShowDialog();
    }

    public static void PrintNoPreview(PrintDialog printDialog,FixedDocument fixedDoc)
    {
        printDialog.PrintDocument(fixedDoc.DocumentPaginator, "Test Print No Preview");

    }

}
于 2013-10-23T23:32:32.030 に答える
1

あなたはあなたが見ることができるものだけを印刷することになっているPrintDialog.PrintVisualを使用しています。複数ページの結果を得るには、さらに多くのことを行う必要があります。

DocumentPaginatorhttp ://msdn2.microsoft.com/en-us/library/system.windows.documents.documentpaginator.aspxを試すことができます

また

PrintDialog.PrintDocumenthttp ://msdn2.microsoft.com/en-us/library/system.windows.controls.printdialog.printdocument.aspx

于 2013-02-27T16:37:59.970 に答える
1

ここ数日、私もこの問題を抱えていました。

解決策は、ルート要素をメモリにレンダリングすることでした。

PrintDialog dlg = new PrintDialog();

// Let it meassure to the printer's default width
// and use an infinity height
Grid1.Meassure(new Size(dlg.PrintableAreaWidth, double.PositiveInfinity));

// Let it arrange to the meassured size
Grid1.Arrange(new Rect(Grid1.DesiredSize));

// Update the element
Grid1.UpdateLayout();

次に、プリンターが使用する新しい用紙サイズを作成します。

プリンタのカット設定を確認する必要があります (Receiptカット モードを使用するなど)。

// Create a new papersize with the printer's default width, and the Grids height
dlg.PrintTicket.PageMediaSize 
= new PageMediaSize(dlg.PrintableAreaWidth, Grid1.ActualHeight);

// Let's print !
dlg.PrintVisual(Grid1, "blah");

これは私にとって魅力のように機能し、多くのコードを節約できました。

レシートプリンター不要なのでpagination、とても使いやすいと思います。

XAML で作成されたものをレンダリングするためにこのメソッドを使用しないことに注意してください。すべてはルート要素としてUIElementStackPanelコードで作成されます。

于 2013-11-15T11:39:37.300 に答える