2010-02-03 12 views
15

Cuando leí libros sobre WPF, vi a los autores mencionar XPS como si fuera algo importante. Windows también incluye su visor de XPS, y he visto que aparece como una "característica" de Windows.¿Cuál es el punto de XPS?

¿Pero por qué? ¿Cuál es el punto de? ¿Quién diablos lo usa? Tengo entendido que XPS es, básicamente, como PDF, xhtml o ePub (que es solo xhtml) ... o incluso Word docx formato. Muchas de las características son las mismas entre esos formatos.

No parece tener ningún beneficio importante en comparación con cualquiera de esos otros formatos. Me parece que xhtml sería mucho más útil que XPS como una forma de guardar y cargar FlowDocuments desde RichTextBox. He visto varios blogs sobre la conversión entre los dos. La mayoría o la totalidad del texto enriquecido en Internet es (x) html. Más allá de eso, no creo que nadie lo use solo para publicar sus documentos; PDF es preferido Parece que XPS es solo un formato aleatorio que MS creó y decidió impulsar. En general me encanta la EM, pero tienen el hábito de ese tipo de cosas. ¿No podría MS haber hecho una API usando xhtml? Eso hubiera sido más útil en muchas situaciones, creo.

Entonces, ¿hay algún punto para usar XPS, particularmente en comparación con uno de los otros formatos que mencioné (o ninguno)? ¿Alguna vez ha usado XPS en sus programas o de otra manera?

Respuesta

8

Como ya se mencionó en U62, WPF viene con un control DocumentViewer que le permite ver documentos XPS. El DocumentViewer también tiene algunas funciones útiles como Imprimir, Zoom, FitToPage, etc. Por lo tanto, no necesita implementar eso o usar una herramienta de terceros.

Lo que acabo de terminar hace una hora usando XPS y el DocumentViewer fue una especie de "Vista previa de impresión de etiqueta de dirección". Permita que el usuario seleccione algunos contactos de una lista de contactos, haga clic en "Vista previa de impresión". Esto abre una nueva ventana XAML que contiene un control DocumentViewer y un ListBox con la opción de diferentes etiquetas (por ejemplo, 1 hoja con 12 etiquetas [2 columnas, 6 filas], 1 hoja con una sola etiqueta cuyo ancho y alto pueden ser definidos por el usuario) . Basado en la selección de usuarios, genero un documento XPS en el diseño que el usuario seleccionó con las direcciones de los contactos seleccionados. Si, por ejemplo, el usuario seleccionó 4 contactos y desea imprimirlos en "SingleLabelSheet", genero 1 documento XPS con 4 páginas, cada página contiene 1 dirección. Luego, muestro el XPS en el DocumentViewer y el usuario puede imprimir las etiquetas en nuestra impresora de etiquetas.

Una vez que entendí cómo funcionaba la API de XPS (al menos los conceptos básicos), fue cuestión de 2 horas para ponerla en funcionamiento.

Así que, básicamente, veo XPS como una API fácil de usar para mostrar FixedDocuments que se deben generar sobre la marcha. Pero personalmente no me gustaría guardarlos en mi HDD o modificarlos de alguna manera o lo que generalmente hace con los documentos.

3

La única ventaja real que puedo pensar es que tiene un control para ver documentos XPS en aplicaciones WPF. Los otros formatos que mencionas significan que deberías traer un renderizador de terceros (o escribir uno tú mismo si tienes un año de sobra).

btw. No sé mucho sobre ePub, pero XPS no se puede comparar directamente con XHTML, es más parecido a PDF, ya que está diseñado para tener un diseño fijo.

3

XPS a WPF es como WMF a Win32/WinForms, es un formato persistente que le permite almacenar e imprimir gráficos nativos de WPF.

XPS se utiliza para imprimir desde WPF (incluso cuando se imprime directamente desde la aplicación sin guardar, el sistema de impresión interno está construido sobre XPS) así que lo que debe EM hacer:

  1. Crear un nuevo formato de archivo que encaja exactamente con lo que están tratando de hacer
  2. Crea un traductor 100% perfecto de WPF a un formato que no controlan como PDF (y espero que Adobe no rompa todas las aplicaciones WPF con el próximo lanzamiento de Acrobat Reader)

¿Qué harías?

Guardar archivos XPS es solo una buena bonificación.

+0

Intentaré que funcione con las cosas comunes que las personas realmente usan. –

+0

Probablemente debería mencionarse que XPS no está restringido solo a WPF, sino que también se puede usar indirectamente con Win32 o WinForms. Windows XP y sistemas posteriores instalan una impresora XPS de forma predeterminada que se puede usar para generar documentos XPS. – stakx

3

Mire, puedo ser un pesimista en XPS como una solución de generación de informes, pero lo probé y encontré la documentación inicial difícil de entender, con menos muestras del mundo real que las que me hubiera gustado. Cuando lo puse en una aplicación empresarial del mundo real, me pareció frustrante, especialmente en aplicaciones LOB que requieren tablas que abarcan varias páginas.

Las cosas pueden haber cambiado desde entonces, pero tan pronto como comencé a buscar en las tablas que abarcaban varias páginas y quería que los encabezados de las columnas subieran a la cima, etc. encontré que la API requería que hiciera lo que llamaría soluciones excesivas con complejidad innecesaria.

Por lo tanto, las cosas pueden haber cambiado desde entonces (hace aproximadamente 8 meses), pero pasé de XPS a usar ITextSharp y eso ha sido mucho menos doloroso.

Así que la única ventaja que yo diría que, como todos los demás, es el construido en el visor en WPF - pero aparte de eso me siento la API puede necesitar "madura" un poco más antes de que voy a intentar algo nuevo en ella.

1

En realidad, encontré una buena razón para usar XPS. Quería imprimir desde múltiples fuentes, merge documents y especificar dúplex y engrapado. Finalmente debe imprimirse como un documento con dúplex y grapado. Estaba teniendo dificultades para hacerlo, pero me di cuenta de que al imprimir en XPS (guardado en un disco) podía lograr mi objetivo con el mínimo esfuerzo. No he encontrado ningún otro método que sea tan fácil y directo.

Dim PrintServer As New SysPrint.PrintServer("\\" & My.Computer.Name) 
    Dim PrintQ As New SysPrint.PrintQueue(PrintServer, "Ricoh Main") 
    Dim Jobs As SysPrint.PrintJobInfoCollection = PrintQ.GetPrintJobInfoCollection 
    Dim able As SysPrint.PrintCapabilities = PrintQ.GetPrintCapabilities() 

    Dim CurrentTicket As SysPrint.PrintTicket = PrintQ.CurrentJobSettings.CurrentPrintTicket 
    If able.StaplingCapability IsNot Nothing AndAlso able.StaplingCapability.Count > 0 Then 
     If able.StaplingCapability.Contains(Printing.Stapling.StapleTopLeft) Then 
      CurrentTicket.Stapling = Printing.Stapling.StapleTopLeft 
     End If 
    Else 
     Debug.Print("no stapling capability") 
    End If 

    CurrentTicket.Duplexing = Printing.Duplexing.TwoSidedLongEdge 

    Dim fiName As String = "S:\Temp\PS\XPS\Test.xps" 

    Dim TestJob As SysPrint.PrintSystemJobInfo _ 
      = PrintQ.AddJob("Test job", fiName, False)