Печать из приложения Win RT (приложение для Windows 8.1)

Я разрабатываю POS-приложение в Windows 8.1 (универсальное приложение). Квитанция заказа будет напечатана из приложения, и даже я могу это сделать.

Принтер - EPSON TM-U220D

Ввод - Сетка создается прагматически с динамическим контентом в ViewModel. Таким образом, эта сетка является входом для принтера

Вывод. В предварительном просмотре печати (см. Рис. 1) все выглядит хорошо, но когда квитанция фактически распечатана, содержимое обрезается с конца (см. Рис. 2).

ПИК 1 введите описание изображения здесь

ПИК 2 введите описание изображения здесь

Наблюдения -

  1. Если я вручную печатаю обычный текстовый файл с помощью команды печати (щелкните правой кнопкой мыши файл, а затем напечатайте), тогда все содержимое будет напечатано идеально.
  2. Если я распечатываю тот же самый контент из приложения, создавая динамическую сетку, то печать с маленьким шрифтом хороша, но с немного большим размером шрифта контент снова обрезается.

Пробовал -

  1. Оптимизирован код для создания Gird, указав высоту

Вопросы-

  1. Если предварительный просмотр все хорошо, то почему бы не выводить
  2. Кто-нибудь пробовал использовать приложение ePOS-Print_SDK_141020E для Магазина Windows?

Генерация динамического кода сетки

 private void AddRows(Grid grid, int count)
    {
        for (int i = 0; i < count; i++)
        {
            RowDefinition row = new RowDefinition();
            row.Height = GridLength.Auto;
            grid.RowDefinitions.Add(row);
        }
    }

    private void AddColumns(Grid grid, int count)
    {
        for (int i = 0; i < count; i++)
        {
            grid.ColumnDefinitions.Add(new ColumnDefinition());

        }
    }

    private TextBlock CreateTextBlock(string text, Color color, FontWeight fw, double fs = 10, int thick = 5)
    {
        if (color == null) color = Colors.Black;
        TextBlock txtBlock1 = new TextBlock();
        txtBlock1.Text = text;
        txtBlock1.FontSize = fs;
        txtBlock1.FontWeight = fw;
        txtBlock1.Foreground = new SolidColorBrush(color);
        txtBlock1.VerticalAlignment = VerticalAlignment.Center;
        txtBlock1.Margin = new Thickness(thick);
        return txtBlock1;
    }


    private async Task<Grid> CreateDynamicWPFGrid()
    {
        Grid ParentGrid = new Grid();
        AddRows(ParentGrid, 8);
        /* Start First Grid*/
        Grid DynamicGrid = new Grid();
        DynamicGrid.Width = 230;
        DynamicGrid.HorizontalAlignment = HorizontalAlignment.Left;
        DynamicGrid.VerticalAlignment = VerticalAlignment.Top;
        DynamicGrid.Margin = new Thickness(24, 0, 0, 0);

        AddColumns(DynamicGrid, 2);
        AddRows(DynamicGrid, 3);

        TextBlock txtBlock1 = CreateTextBlock(DateTime.Now.ToString("M/d/yy"), Colors.Black, FontWeights.Normal);
        Grid.SetRow(txtBlock1, 0);
        Grid.SetColumn(txtBlock1, 1);
        .
        .
        .
        .
        Return ParentGrid;
    }

Код событий принтера

       //Register Print Contract
    async Task RegisterPrintContract()
    {
        PrintManager manager = PrintManager.GetForCurrentView();
        manager.PrintTaskRequested += OnPrintTaskRequested;
        await PrintManager.ShowPrintUIAsync();
    }
    //Unregister Print Contract
    void UnregisterPrintContract()
    {
        PrintManager printMan = PrintManager.GetForCurrentView();
        printMan.PrintTaskRequested -= OnPrintTaskRequested;
    }
    void OnPrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
    {
        // If I need to be asynchronous, I can get a deferral. I don't *need*  
        // to do this here, I'm just faking it.  
        var deferral = args.Request.GetDeferral();

        PrintTask printTask = args.Request.CreatePrintTask("My Print Job", OnPrintTaskSourceRequestedHandler);

        printTask.Completed += OnPrintTaskCompleted;

        deferral.Complete();
    }
    void OnPrintTaskCompleted(PrintTask sender, PrintTaskCompletedEventArgs args)
    {
        // TODO: Tidy up.  
        this._document = null;
        this._pages = null;
    }
    async void OnPrintTaskSourceRequestedHandler(PrintTaskSourceRequestedArgs args)
    {
        var deferral = args.GetDeferral();

        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
          () =>
          {
              this._document = new PrintDocument();
              this._document.Paginate += OnPaginate;
              this._document.GetPreviewPage += OnGetPreviewPage;
              this._document.AddPages += OnAddPages;

              // Tell the caller about it.  
              args.SetSource(this._document.DocumentSource);
          });
        deferral.Complete();
    }
    void OnAddPages(object sender, AddPagesEventArgs e)
    {
        // Loop over all of the preview pages and add each one to  add each page to be printied
        // We should have all pages ready at this point...
        foreach (var page in this._pages)
        {
            //this._pages[page.Key]
            this._document.AddPage(this._pages[page.Key]);
        }

        PrintDocument printDoc = (PrintDocument)sender;
        // Indicate that all of the print pages have been provided
        printDoc.AddPagesComplete();
    }

    async void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
    {
        Grid x = await CreateDynamicWPFGrid();
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
          () =>
          {
              // NB: assuming it's ok to keep all these pages in  
              // memory. might not be the right thing to do  
              // of course.  
              if (this._pages == null)
              {
                  this._pages = new Dictionary<int, UIElement>();
              }
              if (!this._pages.ContainsKey(e.PageNumber))
              {

                  this._pages[e.PageNumber] = x;
              }
              if (this._document == null)
                  this._document = new PrintDocument();
              this._document.SetPreviewPage(e.PageNumber, this._pages[e.PageNumber]);
          }
        );
    }
    async void OnPaginate(object sender, PaginateEventArgs e)
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
          () =>
          {
              // I have one page and that's *FINAL* !  
              this._document.SetPreviewPageCount(e.CurrentPreviewPageNumber, PreviewPageCountType.Final);
          });
    }

0 ответов

Другие вопросы по тегам