Differenze tra le versioni di "Creare un file PDF con le funzioni esterne del API di Cairo"
(Creata pagina con 'Per analogia di argomento rinviamo a questa pagina della WIKI.') |
|||
(2 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Per | + | La libreria '''Cairo''' consente, fra l'altro, di creare un file di tipo PDF (ma anche Post-Script). |
+ | |||
+ | Per fare ciò, si dovranno utilizzare alcune funzioni esterne della libreria (nella sua attuale versione): ''libcairo.so.2.11600.0'' | ||
+ | |||
+ | Va considerato che la libreria ''Cairo'' sviluppa il disegno dell'immagine in tre fasi: | ||
+ | <BR>1) viene creata una maschera, che comprende uno o più primitive o forme vettoriali, cioè cerchi, quadrati, i font TrueType, curve di Bézier, ecc; | ||
+ | <BR>2) viene quindi definito un sorgente, che può essere un colore, una sfumatura di colore, una bitmap o qualche grafica vettoriale; | ||
+ | <BR>3) infine il risultato viene trasferito al file di destinazione o alla superficie di un oggetto grafico. | ||
+ | |||
+ | |||
+ | Mostriamo un semplice esempio, nel quale verrà creato un file PDF: | ||
+ | Library "libcairo:2.11600.0" | ||
+ | |||
+ | Private Enum CAIRO_FONT_SLANT_NORMAL = 0, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE | ||
+ | Private Enum CAIRO_FONT_WEIGHT_NORMAL = 0, CAIRO_FONT_WEIGHT_BOLD | ||
+ | |||
+ | <FONT Color=gray>' ''cairo_surface_t * cairo_pdf_surface_create(const char *filename, double width_in_points, double height_in_points)'' | ||
+ | ' ''Creates a PDF surface of the specified size in points to be written to filename.''</font> | ||
+ | Private Extern cairo_pdf_surface_create(filename As String, width_in_points As Float, height_in_points As Float) As Pointer | ||
+ | |||
+ | <FONT Color=gray>' ''cairo_t* cairo_create(cairo_surface_t *target)'' | ||
+ | ' ''Creates a new cairo_t with all graphics state parameters set to default values and with target as a target surface.''</font> | ||
+ | Private Extern cairo_create(target As Pointer) As Pointer | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_rectangle(cairo_t *cr, double x, double y, double width, double height)'' | ||
+ | ' ''Adds a closed sub-path rectangle of the given size to the current path at position (x, y) in user-space coordinates.''</font> | ||
+ | Private Extern cairo_rectangle(cr As Pointer, xF As Float, yF As Float, width As Float, height As Float) | ||
+ | |||
+ | <FONT Color=gray>' ''cairo_pattern_t * cairo_pattern_create_radial(double cx0, double cy0, double radius0, double cx1, double cy1, double radius1)'' | ||
+ | ' ''Creates a new radial gradient cairo_pattern_t between the two circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1).''</font> | ||
+ | Private Extern cairo_pattern_create_radial(cx0 As Float, cy0 As Float, radius0 As Float, cx1 As Float, cy1 As Float, radius1 As Float) As Pointer | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_pattern_add_color_stop_rgb(cairo_pattern_t *pattern, double offset, double red, double green, double blue)'' | ||
+ | ' ''Adds an opaque color stop to a gradient pattern.''</font> | ||
+ | Private Extern cairo_pattern_add_color_stop_rgb(patternP As Pointer, offset As Float, red As Float, green As Float, blue As Float) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_set_source(cairo_t *cr, cairo_pattern_t *source)'' | ||
+ | ' ''Sets the source pattern within cr to source.''</font> | ||
+ | Private Extern cairo_set_source(cr As Pointer, patternP As Pointer) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_fill(cairo_t *cr)'' | ||
+ | ' ''A drawing operator that fills the current path according to the current fill rule.''</font> | ||
+ | Private Extern cairo_fill(cr As Pointer) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_set_font_size(cairo_t *cr, double size)'' | ||
+ | ' ''Sets the current font matrix to a scale by a factor of size.''</font> | ||
+ | Private Extern cairo_set_font_size(cr As Pointer, size As Float) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_select_font_face(cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight)'' | ||
+ | ' ''Selects a family and style of font from a simplified description as a family name, slant and weight.''</font> | ||
+ | Private Extern cairo_select_font_face(cr As Pointer, family As String, slant As Integer, font_weight As Integer) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_set_source_rgb(cairo_t *cr, double red, double green, double blue)'' | ||
+ | ' ''Sets the source pattern within cr to an opaque color.''</font> | ||
+ | Private Extern cairo_set_source_rgb(cr As Pointer, red As Float, green As Float, blue As Float) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_move_to(cairo_t *cr, double x, double y)'' | ||
+ | ' ''Begin a new sub-path.''</font> | ||
+ | Private Extern cairo_move_to(cr As Pointer, xF As Float, yF As Float) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_show_text(cairo_t *cr, const char *utf8)'' | ||
+ | ' ''A drawing operator that generates the shape from a string of UTF-8 characters.''</font> | ||
+ | Private Extern cairo_show_text(cr As Pointer, utf8 As String) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_destroy(cairo_t *cr)'' | ||
+ | ' ''Decreases the reference count on cr by one.''</font> | ||
+ | Private Extern cairo_destroy(cr As Pointer) | ||
+ | |||
+ | <FONT Color=gray>' ''void cairo_surface_destroy(cairo_surface_t *surface)'' | ||
+ | ' ''Decreases the reference count on surface by one.''</font> | ||
+ | Private Extern cairo_surface_destroy(cairo_surface As Pointer) | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim cairo, surface, pattern As Pointer | ||
+ | Dim x, y As Byte | ||
+ | |||
+ | |||
+ | <FONT Color=gray>' ''Crea il file PDF:''</font> | ||
+ | surface = cairo_pdf_surface_create("/tmp/esempio_Cairo.pdf", 100.0, 100.0) | ||
+ | |||
+ | cairo = cairo_create(surface) | ||
+ | |||
+ | <FONT Color=gray>' ''Disegna i quadrati sullo sfondo:''</font> | ||
+ | For x = 0 To 9 | ||
+ | For y = 0 To 9 | ||
+ | cairo_rectangle(cairo, x * 10.0, y * 10.0, 5, 5) | ||
+ | Next | ||
+ | Next | ||
+ | |||
+ | pattern = cairo_pattern_create_radial(50, 50, 5, 50, 50, 50) | ||
+ | |||
+ | cairo_pattern_add_color_stop_rgb(pattern, 0, 0.75, 0.15, 0.99) | ||
+ | |||
+ | cairo_pattern_add_color_stop_rgb(pattern, 0.9, 1, 1, 1) | ||
+ | |||
+ | cairo_set_source(cairo, pattern) | ||
+ | |||
+ | cairo_fill(cairo) | ||
+ | |||
+ | <FONT Color=gray>' ''Scrive in primo piano:''</font> | ||
+ | cairo_set_font_size(cairo, 15) | ||
+ | |||
+ | cairo_select_font_face(cairo, "URW Palladio L", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD) | ||
+ | |||
+ | cairo_set_source_rgb(cairo, 0, 0, 0) | ||
+ | |||
+ | cairo_move_to(cairo, 10, 25) | ||
+ | |||
+ | cairo_show_text(cairo, "Crea") | ||
+ | |||
+ | cairo_move_to(cairo, 10, 75) | ||
+ | |||
+ | cairo_show_text(cairo, "Testo qualsiasi") | ||
+ | |||
+ | <FONT Color=gray>' ''Per generare il file PDF, è necessario distruggere il contesto grafico "cairo_t" e la superficie dell'immagine:''</font> | ||
+ | cairo_destroy(cairo) | ||
+ | cairo_surface_destroy(surface) | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =Riferimenti= | ||
+ | * http://cairographics.org/manual/ | ||
+ | * http://cairographics.org/ | ||
+ | * http://zetcode.com/gfx/cairo/ | ||
+ | * http://php.net/manual/it/book.cairo.php |
Versione attuale delle 17:10, 15 ago 2020
La libreria Cairo consente, fra l'altro, di creare un file di tipo PDF (ma anche Post-Script).
Per fare ciò, si dovranno utilizzare alcune funzioni esterne della libreria (nella sua attuale versione): libcairo.so.2.11600.0
Va considerato che la libreria Cairo sviluppa il disegno dell'immagine in tre fasi:
1) viene creata una maschera, che comprende uno o più primitive o forme vettoriali, cioè cerchi, quadrati, i font TrueType, curve di Bézier, ecc;
2) viene quindi definito un sorgente, che può essere un colore, una sfumatura di colore, una bitmap o qualche grafica vettoriale;
3) infine il risultato viene trasferito al file di destinazione o alla superficie di un oggetto grafico.
Mostriamo un semplice esempio, nel quale verrà creato un file PDF:
Library "libcairo:2.11600.0" Private Enum CAIRO_FONT_SLANT_NORMAL = 0, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE Private Enum CAIRO_FONT_WEIGHT_NORMAL = 0, CAIRO_FONT_WEIGHT_BOLD ' cairo_surface_t * cairo_pdf_surface_create(const char *filename, double width_in_points, double height_in_points) ' Creates a PDF surface of the specified size in points to be written to filename. Private Extern cairo_pdf_surface_create(filename As String, width_in_points As Float, height_in_points As Float) As Pointer ' cairo_t* cairo_create(cairo_surface_t *target) ' Creates a new cairo_t with all graphics state parameters set to default values and with target as a target surface. Private Extern cairo_create(target As Pointer) As Pointer ' void cairo_rectangle(cairo_t *cr, double x, double y, double width, double height) ' Adds a closed sub-path rectangle of the given size to the current path at position (x, y) in user-space coordinates. Private Extern cairo_rectangle(cr As Pointer, xF As Float, yF As Float, width As Float, height As Float) ' cairo_pattern_t * cairo_pattern_create_radial(double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) ' Creates a new radial gradient cairo_pattern_t between the two circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1). Private Extern cairo_pattern_create_radial(cx0 As Float, cy0 As Float, radius0 As Float, cx1 As Float, cy1 As Float, radius1 As Float) As Pointer ' void cairo_pattern_add_color_stop_rgb(cairo_pattern_t *pattern, double offset, double red, double green, double blue) ' Adds an opaque color stop to a gradient pattern. Private Extern cairo_pattern_add_color_stop_rgb(patternP As Pointer, offset As Float, red As Float, green As Float, blue As Float) ' void cairo_set_source(cairo_t *cr, cairo_pattern_t *source) ' Sets the source pattern within cr to source. Private Extern cairo_set_source(cr As Pointer, patternP As Pointer) ' void cairo_fill(cairo_t *cr) ' A drawing operator that fills the current path according to the current fill rule. Private Extern cairo_fill(cr As Pointer) ' void cairo_set_font_size(cairo_t *cr, double size) ' Sets the current font matrix to a scale by a factor of size. Private Extern cairo_set_font_size(cr As Pointer, size As Float) ' void cairo_select_font_face(cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) ' Selects a family and style of font from a simplified description as a family name, slant and weight. Private Extern cairo_select_font_face(cr As Pointer, family As String, slant As Integer, font_weight As Integer) ' void cairo_set_source_rgb(cairo_t *cr, double red, double green, double blue) ' Sets the source pattern within cr to an opaque color. Private Extern cairo_set_source_rgb(cr As Pointer, red As Float, green As Float, blue As Float) ' void cairo_move_to(cairo_t *cr, double x, double y) ' Begin a new sub-path. Private Extern cairo_move_to(cr As Pointer, xF As Float, yF As Float) ' void cairo_show_text(cairo_t *cr, const char *utf8) ' A drawing operator that generates the shape from a string of UTF-8 characters. Private Extern cairo_show_text(cr As Pointer, utf8 As String) ' void cairo_destroy(cairo_t *cr) ' Decreases the reference count on cr by one. Private Extern cairo_destroy(cr As Pointer) ' void cairo_surface_destroy(cairo_surface_t *surface) ' Decreases the reference count on surface by one. Private Extern cairo_surface_destroy(cairo_surface As Pointer) Public Sub Main() Dim cairo, surface, pattern As Pointer Dim x, y As Byte ' Crea il file PDF: surface = cairo_pdf_surface_create("/tmp/esempio_Cairo.pdf", 100.0, 100.0) cairo = cairo_create(surface) ' Disegna i quadrati sullo sfondo: For x = 0 To 9 For y = 0 To 9 cairo_rectangle(cairo, x * 10.0, y * 10.0, 5, 5) Next Next pattern = cairo_pattern_create_radial(50, 50, 5, 50, 50, 50) cairo_pattern_add_color_stop_rgb(pattern, 0, 0.75, 0.15, 0.99) cairo_pattern_add_color_stop_rgb(pattern, 0.9, 1, 1, 1) cairo_set_source(cairo, pattern) cairo_fill(cairo) ' Scrive in primo piano: cairo_set_font_size(cairo, 15) cairo_select_font_face(cairo, "URW Palladio L", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD) cairo_set_source_rgb(cairo, 0, 0, 0) cairo_move_to(cairo, 10, 25) cairo_show_text(cairo, "Crea") cairo_move_to(cairo, 10, 75) cairo_show_text(cairo, "Testo qualsiasi") ' Per generare il file PDF, è necessario distruggere il contesto grafico "cairo_t" e la superficie dell'immagine: cairo_destroy(cairo) cairo_surface_destroy(surface) End