【问题标题】:Default Layout Orientation when printing XPSs using the WPF XPS Viewer使用 WPF XPS 查看器打印 XPS 时的默认布局方向
【发布时间】:2009-02-03 02:30:24
【问题描述】:

在使用 WPF XPS 查看器打印 XPS 时,是否可以设置默认布局方向?

我的固定文档 XPS 将其页面方向设置为横向,页面媒体大小的宽度大于其高度,并且它在查看器中正确显示为横向。 只是当您点击打印按钮时,“打印对话框”首选项默认为“纵向”,并且会这样打印。

我宁愿不必更改用户的默认打印设置,如果 XPS 查看器能够按照设计打印的方式打印 XPS,我会更喜欢它。

【问题讨论】:

标签: printing xps xpsdocument xpsviewer


【解决方案1】:

填写打印票的字段:

  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)
  {
    ...
  }

【讨论】:

    【解决方案2】:

    我相信在创建 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 文档。

    【讨论】:

      【解决方案3】:

      这并不是 MXDW 的真正问题,而是驱动程序在 Windows 上的工作方式的问题。为特定会话保存用户选择。这意味着您可以在第一次打印和退出应用程序之间打印时重复使用首次打印设置。大多数打印机都是这样运行的,除非有人想出一种方法将这些信息保存在某个地方并让用户在会话中重复使用它。

      所以,我尝试破解 GPD 文件(通常存储打印机的打印信息)。方向有两个可能的值:PORTRAIT 和 LANDSCAPE_CC270,默认设置为 PORTRAIT。见下文:

      **%********************************************* ************************************ *% 方向 *%************************************************ ****************************** *特点:方向 { *rcNameID: =ORIENTATION_DISPLAY *默认选项:肖像

      *Option: PORTRAIT
      {
          *rcNameID: =PORTRAIT_DISPLAY
      }
      
      *Option: LANDSCAPE_CC270
      {
          *rcNameID: =LANDSCAPE_DISPLAY
      }
      

      }

      现在,如果我将交换默认值更改为 LANDSCAPE_CC270,打印首选项将停止出现(并且任何打印都会失败)。事实上,似乎指定任何其他值都会将默认值保留为 PORTRAIT。毫无疑问,MS 进行某种检查以防止我们破解此驱动程序。 MS好像没有 希望任何人篡改其设置:(

      但是您可以尝试更多地调整 GPD 值,看看是否有您喜欢的东西出现。会继续破解更多。

      警告:如果您不知道自己在做什么,则不应篡改 GPD 文件。如果你 还想继续做备份!

      提示:它们存储在%WINDOWS%system32\spool\drivers\w32x86\3 文件夹中。

      【讨论】:

        【解决方案4】:
        <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();
        
                }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-05
          • 2011-07-08
          • 2011-02-17
          • 2011-11-30
          • 2011-02-04
          • 2011-01-30
          • 2019-09-22
          • 2011-09-21
          相关资源
          最近更新 更多