Impresión de Dibujos en gtkmm

La operación de impresión utilizando gtkmm resulta muy simple y útil a la vez permitiendo la escritura de dibujos tanto en la impresora como en archivos PDF.

Supongamos que se tiene el siguiente código cairomm:

const double width = print_context->get_width();
  const double height = print_context->get_height();
  Cairo::RefPtr cairo_ctx = print_context->get_cairo_context();
  cairo_ctx->set_source_rgb(0, 0, 0);
  cairo_ctx->set_font_size(28.0);
  std::string text("Taller de Programación - FIUBA");
  Cairo::TextExtents extents;
  cairo_ctx->get_text_extents(text, extents);
  cairo_ctx->move_to (width/2.0 + - extents.x_bearing - extents.width/2, height/2.0);
  cairo_ctx->show_text(text);

Este pequeño bloque obtiene el tamaño del contexto de impresión y dibuja el texto “Taller de Programación – FIUBA” en el centro. Las operaciones utilizadas se pueden encontrar en la referencia de cairomm o bien en el tutorial [1]. Es importante destacar que el código anterior sólo depende de un objeto llamado print_context que entrega un Cairo::Context pero que se puede adaptar fácilmente a un DrawingArea donde el Cairo::Context de dibujo es recibido por parámetro [2].

Para permitir la impresión del texto anterior es necesario definir una clase heredera de Gtk::PrintOperation y realizar la escritura en su print_context como se detalla a continuación:

class CustomPrintOperation : public Gtk::PrintOperation
{
public:
  static Glib::RefPtr create();
 protected:
  virtual void on_begin_print(const Glib::RefPtr& context);
  virtual void on_draw_page(const Glib::RefPtr& context, int page_nr);
 };
 Glib::RefPtr CustomPrintOperation::create()
{
  return Glib::RefPtr(new CustomPrintOperation());
}
 void CustomPrintOperation::on_begin_print(
        const Glib::RefPtr& print_context)
{
  set_n_pages(1);
}
 void CustomPrintOperation::on_draw_page(const Glib::RefPtr& print_context, int page_nr)
{
  const double width = print_context->get_width();
  const double height = print_context->get_height();
  Cairo::RefPtr cairo_ctx = print_context->get_cairo_context();
  cairo_ctx->set_source_rgb(0, 0, 0);
  cairo_ctx->set_font_size(28.0);
  std::string text("Taller de Programación - FIUBA");
  Cairo::TextExtents extents;
  cairo_ctx->get_text_extents(text, extents);
  cairo_ctx->move_to (width/2.0 + - extents.x_bearing - extents.width/2, height/2.0);
  cairo_ctx->show_text(text);
 void on_printoperation_done(Gtk::PrintOperationResult result, const Glib::RefPtr& operation)
{
[...] //realizar chequeo de finalización de operación.
}
 Glib::RefPtr print = CustomPrintOperation::create();
 print->set_track_print_status();
print->set_default_page_setup(m_refPageSetup);
print->set_print_settings(m_refSettings);
 print->signal_done().connect(sigc::bind(sigc::ptr_fun(&on_printoperation_done), print));
try
{
  print->run(Gtk::PRINT_OPERATION_ACTION_PRINT_DIALOG, currentWindow);
}
catch (const Gtk::PrintError& ex)
{
  std::cerr << "An error occurred while trying to run a print operation:"
  << ex.what() << std::endl;
}

Como resultado se obtendrá un cuadro de diálogo de impresión que permitirá elegir entre una exportación a PDF o una impresión en papel del dibujo resultante del código cairomm antes visto.

Para más información sobre esta funcionalidad de gtkmm, referirse al capítulo de impresión del tutorial de gtkmm [3].

Se adjunta un ejemplo de código completo basado en mencionado tutorial:

Descargar ejemplo CustomPrintOperation

[1] http://cairographics.org/tutorial/
[2] http://developer.gnome.org/gtkmm-tutorial/3.2/sec-cairo-drawing-model.html
[3] http://developer.gnome.org/gtkmm-tutorial/3.2/chapter-printing.html