none
Utilizar FlowDocument como editor de texto y gráficos RRS feed

  • Pregunta

  • Otra duda que tengo:

    Necesito realizar una aplicación en WPF para insertar textos y gráficos en un documento del tamaño que yo indicara para luego poder imprimir tal como lo he dejado en tiempo de ejecución. Se me ha ocurrido que la forma más idónea para realizar esto es usar un FlowDocument por el hecho que estoy montando los graficos y texto tal como va a quedar en la impresión o vista previa.

    Es posible utilizar un control FlowDocument de la forma que quiero usarlo pudiendo insertar graficos y texto en tiempo de ejecución o debo usar otro tipo de control? La razón por la que me he decantado por el FlowDocument es porque debo incluir el texto y el gráfico en un tamaño predefinido de impresión y tambien porqué luego se que eso es justo lo que se imprimirá en el papel. Lo que necesito para haceros una idea es algo parecido a un word, he visto controles de terceros que son parecidos a un Word pero no es exactamente lo que necesito.

    Espero haberme explicado bien.

    Muchas gracias de antemano.

    Saludos Cordiales al foro. 
    domingo, 8 de noviembre de 2009 16:36

Respuestas

  • Hola de nuevo dmlman.

    esto de la resolucion y demas puede llegar a ser complejo en ciertas situaciones. Intentare explicarte un poco por encima.

    En WPF mas que el tener 96 pixeles, estaria mejor dicho que es una tecnologia independiente de la resolucion, esto es debido a que se trabaja con graficos vectoriales y su escalado se realiza sin perdida y con mucha rapidez, de forma que se pueda representar el mismo grafico en diferentes resoluciones sin afectar al contenido.
    Por otra parte, las imagenes como comentas si que tienen perdida en el escalado ademas de ser un proceso mas costoso (algo obvio).

    Entonces, realmente los dpi o ppp en castellano se usan para dispositivos de impresion y escaneado, ya que es lo que define la resolucion de ese dispositivo independientemente de lo grande que sea el papel, por contra, en monitores, televisores, etc, no se suele hacer uso de este mismo sistema (solo para ciertas conversiones en programas de dibujo), entre otras cosas por que depende de lo grande que sea el monitor y esta se mide por lineas y columnas (tal cual se selecciona la resolucion en la tarjeta grafica como 800X600), por ejemplo, un monitor de 15 pulgadas a una resolucion de 800X600 tiene un punto mas pequeño que un monitor de 22 pulgadas a 800X600 (Esto es logico ¿no?) los 2 monitores tienen la misma resolucion pero uno de ellos es mas grande con lo que una simple regla de 3 nos dice que en el monitor mas pequeño tiene que tener un punto mas pequeño para la misma resolucion.

    Dicho esto, si que te puedo decir que los dispositivos de impresion de inyeccion de tinta suelen tener unos 300dpi mientras que las laser suele ser del doble o mas. y con programas como photoshop puedes hacer una conversion en las imagenes pero tan solo es la resolucion en la que sera guardada la imagen lista para imprimir, pero esta imagen se vera siempre diferente en diferentes tamaños de monitor y en diferentes resoluciones.

    Entonces, a lo nuestro:

    Como WPF es independiente de la resolucion al igual que FlowDocument, la idea de usar el FlowDocument es tan solo por que tiene funciones para el formateo de documentos, esto se podria realizar tambien con WPF, pero seria reinventar la rueda, asi que tu puedes crear el contenido de un flow document y verlo en un monitor como quieras, con las columnas que quieras y la configuracion que desees, esto no influira en la impresion ya que al imprimir, nosotros modificaremos las propiedades para realizar una impresion con los parametros que el usuario seleccione en el cuadro modal de impresion, de modo que si ya tienes codigo echo, a la hora de imprimir, tan solo tendrias que escribir algo como esto:


    // crear el cuadro de dialogo de impresion y mostrarlo
    PrintDialog pDialog = new PrintDialog();
    pDialog.ShowDialog();
    
    // obtener el documento 'FlowDocument' (Modificar segun donde resida)
    FlowDocument doc = ((document1.DockPanel1)frame1.Content).fd1;
    
    // establecer las propiedades de impresion establecidas en el dialogo de impresion
    doc.PagePadding = new Thickness(20, 40, 20, 40);
    doc.PageHeight = pDialog.PrintableAreaHeight;
    doc.PageWidth = pDialog.PrintableAreaWidth;
    doc.ColumnGap = 0;
    doc.ColumnWidth = pDialog.PrintableAreaWidth;
    
    // crear un paginador para la impresion e imprimir el documento
    IDocumentPaginatorSource dps = doc;
    pDialog.PrintDocument(dps.DocumentPaginator, "impresion");

    Por supuesto, estableciendo las propiedades como desees.

    Ya me comentaras como te ha ido.







    Saludos
    David González
    lunes, 16 de noviembre de 2009 14:54

Todas las respuestas

  • Hola dmlman.

    El FlowDocument para lo que quieres realizar es posiblemente el menjor control del que dispongas, es un control diseñado para la generacion de documentos y podras realizarlos como cualquier documento word, de echo el arbol de elementos es casi igual que OpenXml que es el nuevo formato para la suite Office a partir de la version 2007.

    De modo que haciendo uso de este control, tambien podras generar documento .docx facilmente como muestra en el articulo siguiente:
    http://www.codeproject.com/KB/WPF/OpenFlowDoc.aspx

    Yo lo he usado y biene muy bien para generar todo tipo de documentos de forma similar a word.


    Saludos
    David González
    lunes, 9 de noviembre de 2009 10:23
  • Muchisimas gracias por tu respuesta David.

    Precisamente hace unos dias leí que en WPF el tamaño de cada píxel no es dependiente de la resolución y se adoptó que en una pulgada caben exactamente 96 píxeles. Llegado a este punto mi pregunta es: Si yo utilizo para visualizar en vez de un flowdocument una imagen y a continuacion un textblock que rellenaré en tiempo de ejecución mediante un textbox, lo que yo visualice en pantalla en teoria el tamaño que le de sera el mismo tamaño el de impresión? De que forma puedo pasar a impresión lo que estoy visualizando en pantalla? Debo pasarlo a un flowdocument para imprimirlo como un reporte?

    Para más ayuda te explico más concretamente lo que pretendo: Se trata de realizar una aplicación que mientras yo escriba en un textbox se visualice debajo con el formato, efectos, etc... que yo le vaya indicando en tiempo de ejecución, luego habrá más opciones como meter imagenes, etc... pero luego lo que yo estoy viendo en pantalla deberia ser como una vista previa de lo que imprimiria, de forma que yo vea si por ejemplo me estoy pasando de márgenes y ta, además debes poder escoger distintos tamaños de papel. Espero me haya explicado bien.

    Gracias de antemano.

    Saludos Cordiales.
    lunes, 16 de noviembre de 2009 11:47
  • Hola de nuevo dmlman.

    esto de la resolucion y demas puede llegar a ser complejo en ciertas situaciones. Intentare explicarte un poco por encima.

    En WPF mas que el tener 96 pixeles, estaria mejor dicho que es una tecnologia independiente de la resolucion, esto es debido a que se trabaja con graficos vectoriales y su escalado se realiza sin perdida y con mucha rapidez, de forma que se pueda representar el mismo grafico en diferentes resoluciones sin afectar al contenido.
    Por otra parte, las imagenes como comentas si que tienen perdida en el escalado ademas de ser un proceso mas costoso (algo obvio).

    Entonces, realmente los dpi o ppp en castellano se usan para dispositivos de impresion y escaneado, ya que es lo que define la resolucion de ese dispositivo independientemente de lo grande que sea el papel, por contra, en monitores, televisores, etc, no se suele hacer uso de este mismo sistema (solo para ciertas conversiones en programas de dibujo), entre otras cosas por que depende de lo grande que sea el monitor y esta se mide por lineas y columnas (tal cual se selecciona la resolucion en la tarjeta grafica como 800X600), por ejemplo, un monitor de 15 pulgadas a una resolucion de 800X600 tiene un punto mas pequeño que un monitor de 22 pulgadas a 800X600 (Esto es logico ¿no?) los 2 monitores tienen la misma resolucion pero uno de ellos es mas grande con lo que una simple regla de 3 nos dice que en el monitor mas pequeño tiene que tener un punto mas pequeño para la misma resolucion.

    Dicho esto, si que te puedo decir que los dispositivos de impresion de inyeccion de tinta suelen tener unos 300dpi mientras que las laser suele ser del doble o mas. y con programas como photoshop puedes hacer una conversion en las imagenes pero tan solo es la resolucion en la que sera guardada la imagen lista para imprimir, pero esta imagen se vera siempre diferente en diferentes tamaños de monitor y en diferentes resoluciones.

    Entonces, a lo nuestro:

    Como WPF es independiente de la resolucion al igual que FlowDocument, la idea de usar el FlowDocument es tan solo por que tiene funciones para el formateo de documentos, esto se podria realizar tambien con WPF, pero seria reinventar la rueda, asi que tu puedes crear el contenido de un flow document y verlo en un monitor como quieras, con las columnas que quieras y la configuracion que desees, esto no influira en la impresion ya que al imprimir, nosotros modificaremos las propiedades para realizar una impresion con los parametros que el usuario seleccione en el cuadro modal de impresion, de modo que si ya tienes codigo echo, a la hora de imprimir, tan solo tendrias que escribir algo como esto:


    // crear el cuadro de dialogo de impresion y mostrarlo
    PrintDialog pDialog = new PrintDialog();
    pDialog.ShowDialog();
    
    // obtener el documento 'FlowDocument' (Modificar segun donde resida)
    FlowDocument doc = ((document1.DockPanel1)frame1.Content).fd1;
    
    // establecer las propiedades de impresion establecidas en el dialogo de impresion
    doc.PagePadding = new Thickness(20, 40, 20, 40);
    doc.PageHeight = pDialog.PrintableAreaHeight;
    doc.PageWidth = pDialog.PrintableAreaWidth;
    doc.ColumnGap = 0;
    doc.ColumnWidth = pDialog.PrintableAreaWidth;
    
    // crear un paginador para la impresion e imprimir el documento
    IDocumentPaginatorSource dps = doc;
    pDialog.PrintDocument(dps.DocumentPaginator, "impresion");

    Por supuesto, estableciendo las propiedades como desees.

    Ya me comentaras como te ha ido.







    Saludos
    David González
    lunes, 16 de noviembre de 2009 14:54