Ориентация макета по умолчанию при печати XPS с использованием WPF XPS Viewer

Есть ли способ установить ориентацию макета по умолчанию при печати XPS с помощью WPF XPS Viewer?

У моего фиксированного документа XPS ориентация страницы установлена ​​на альбомную, размер медиафайла страницы больше его высоты, и он корректно отображается в средстве просмотра как альбомная. Просто, когда вы нажимаете кнопку "Печать", в настройках диалогового окна "Печать" устанавливается значение "Портрет", и он печатается как таковой.

Я бы предпочел не изменять пользовательские настройки печати по умолчанию. Я бы предпочел, чтобы программа XPS Viewer печатала XPS так, как она предназначена для печати.

3 ответа

Решение

Заполните поле PrintTicket:

  PrintDialog pd = new PrintDialog();
  PrintTicket pt = new PrintTicket();
  pt.PageOrientation = PageOrientation.Landscape;
  pd.PrintTicket = pd.PrintQueue.MergeAndValidatePrintTicket(pd.PrintQueue.DefaultPrintTicket, pt).ValidatedPrintTicket;
  if (pd.ShowDialog() == true)
  {
    ...
  }

Я считаю, что правильный способ сделать это при создании FixedDocument, установлен RenderTransform = RotateTransform(90) для содержимого страницы, когда размеры выше, чем они широки. Пример:

var visualContent = new Image
            {
                Source = image,
                Stretch = Stretch.Uniform
            };
visualContent.RenderTransformOrigin = new Point(0.5, 0.5);    
visualContent.RenderTransform = new RotateTransform(90);
FixedPage fixedPage = new FixedPage();
fixedPage.Children.Add(visualContent);
var pageContent = new PageContent
{
    Child = fixedPage
};

Однако не уверен, поможет ли это с уже существующим документом XPS.

На самом деле это не проблема MXDW, а проблема с драйверами в Windows. Выбор (ы) пользователя сохраняются для определенного сеанса. Это означает, что вы можете повторно использовать настройки первой печати при печати между первой печатью и выходом из приложения. Большинство принтеров ведут себя таким образом до тех пор, пока не будет найден способ сохранить эту информацию где-нибудь и позволить пользователю повторно использовать ее во время сеансов.

Итак, я попытался взломать файл GPD (где обычно хранится информация о печати для принтера). Ориентация имеет два возможных значения: PORTRAIT и LANDSCAPE_CC270, для которых по умолчанию установлено значение PORTRAIT. Увидеть ниже:

*% ************************************************ ****************************** *% ориентация *% *************** ************************************************** ************* * Добавление: Ориентация {* rcNameID: = ORIENTATION_DISPLAY * DefaultOption: PORTRAIT

*Option: PORTRAIT
{
    *rcNameID: =PORTRAIT_DISPLAY
}

*Option: LANDSCAPE_CC270
{
    *rcNameID: =LANDSCAPE_DISPLAY
}

}

Теперь, если бы я изменил значение swap по умолчанию на LANDSCAPE_CC270, настройки печати перестали бы появляться (и любая печать не удалась бы). Фактически, оказывается, что при указании любого другого значения по умолчанию сохраняется значение PORTRAIT. Определенно, MS делает какую-то проверку, чтобы не дать нам взломать этот драйвер. Похоже, MS не хочет, чтобы кто-то вмешивался в его настройки:(

Но вы могли бы попытаться немного поиграть со значениями GPD и посмотреть, появится ли что-то по вашему вкусу. Будет продолжать взламывать немного больше.

Предостережение: файлы GPD не должны быть подделаны, если вы не знаете, что делаете. Если вы все еще хотите пойти дальше, сделайте резервную копию!

Подсказка: они хранятся в %WINDOWS%system32\spool\drivers\w32x86\3 папка.

<Grid Margin="0,0,-8,-8">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>

    <FlowDocumentScrollViewer Name="printpanel" HorizontalAlignment="Left" Width="959" FontFamily="Arial" Margin="0,-10,0,10">
        <FlowDocument x:Name="FD">

            <BlockUIContainer>

                <Canvas>
                    <Label x:Name="lblReceipt" Visibility="Visible" Content="Receipt No." HorizontalAlignment="Left" VerticalAlignment="Top" Canvas.Top="178" FontSize="12" Canvas.Left="60"/>
                    <Label x:Name="txtReceiptNo" BorderThickness="2" BorderBrush="Black" HorizontalAlignment="Left"  Padding="10,3,3,0" Height="23"   VerticalAlignment="Top" Width="200" FontSize="12" Canvas.Left="187" Canvas.Top="177" FontFamily="Arial"/>
                    <Label x:Name="lblmemNo" Visibility="Visible" Content="Membership No." HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="12" Canvas.Left="462" Canvas.Top="177"/>
                    <Label x:Name="txtMembershipNo"  BorderThickness="2" BorderBrush="Black" HorizontalAlignment="Left" Padding="10,3,3,0" Height="23"  VerticalAlignment="Top" Width="177" FontSize="12" Canvas.Left="604" Canvas.Top="177" FontFamily="Arial">

                    </Label>
                    <Label x:Name="lblAuthCentr" Visibility="Visible" Content="Authorised Center." HorizontalAlignment="Left" VerticalAlignment="Top" Canvas.Left="60" Canvas.Top="221" FontSize="12"/>
                    <TextBox x:Name="txtAuthCentr"   HorizontalAlignment="Left" TextWrapping="WrapWithOverflow" Padding="10,3,3,0" Height="38"  VerticalAlignment="Top" Width="219" FontSize="12" Canvas.Left="238" Canvas.Top="219" FontFamily="Arial"/>
                    <Label x:Name="lblSector" Visibility="Visible" Content="Sector." HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="12" Canvas.Left="492" Canvas.Top="220"/>
                    <Label x:Name="txtSector" BorderThickness="2" BorderBrush="Black"  HorizontalAlignment="Left" Padding="10,3,3,0" Height="23"  VerticalAlignment="Top" Width="115" FontSize="12" Canvas.Left="567" Canvas.Top="220" FontFamily="Arial"/>
                   

                </Canvas>
            </BlockUIContainer>

        </FlowDocument>
    </FlowDocumentScrollViewer>

    <Button Name="btnOk" Content="Print" Height="30" Grid.Row="1" Click="btnOk_Click" Margin="355,0,404,0"></Button>
</Grid>

Просто установите высоту и ширину FlowDocument

установить FD.PageWidth = 1100; FD.PageHeight = 600;

 
       
 private void btnOk_Click(object sender, RoutedEventArgs e)
        {
          

            if (File.Exists("printPreview.xps"))
            {
                File.Delete("printPreview.xps");
            }
            var xpsDocument = new XpsDocument("printPreview.xps", FileAccess.ReadWrite);
            XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
            DocumentPaginator docPage;
            FD.PageWidth = 1100; // set FlowDocument Width
            FD.PageHeight = 600; // set FlowDocument Height
            docPage = ((IDocumentPaginatorSource)FD).DocumentPaginator;
            writer.Write(docPage);
            Document = xpsDocument.GetFixedDocumentSequence();
            this.Close();
            xpsDocument.Close();
            var windows = new PrintWindow(Document);
            windows.ShowDialog();

        }

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