Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出

cairo的surface可以是pixbuf, 可以是screen, 可以是png图,也可以是pdf文件 、svg文件、ps文件,定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图,如果surface是pdf, 则直接就输出pdf文件了,画图之前不妨按标准纸张设置图的尺寸,比如A4尺寸,这样即可生成A4尺寸的 pdf 文件。

下面的freebasic示例example输出 pdf svg ps 三种格式文件:

' This is file cairo_output.bas, an example for cairo library
' (C) 2011 by Thomas[ dot ]Freiherr[ at ]gmx{ dot }net
' License GPLv 3
'
' See for details
' http://www.freebasic.net/forum/viewtopic.php?p=163599&highlight=#163599
' http://cairographics.org/documentation/

#INCLUDE ONCE "cairo/cairo.bi"
#INCLUDE ONCE "cairo/cairo-pdf.bi"
#INCLUDE ONCE "cairo/cairo-ps.bi"
#INCLUDE ONCE "cairo/cairo-svg.bi"

'{612, 792},     /* PAGE_SIZE_LETTER */
'{612, 1008},    /* PAGE_SIZE_LEGAL */
'{841.89, 1199.551},    /* PAGE_SIZE_A3 */
'{595.276, 841.89},     /* PAGE_SIZE_A4 */
'{419.528, 595.276},     /* PAGE_SIZE_A5 */
'{708.661, 1000.63},     /* PAGE_SIZE_B4 */
'{498.898, 708.661},     /* PAGE_SIZE_B5 */
'{522, 756},     /* PAGE_SIZE_EXECUTIVE */
'{288, 432},     /* PAGE_SIZE_US4x6 */
'{288, 576},     /* PAGE_SIZE_US4x8 */
'{360, 504},     /* PAGE_SIZE_US5x7 */
'{297, 684}      /* PAGE_SIZE_COMM10 */

CONST Pag_W = 595.276, Pag_H = 841.89 '                        A4 format
CONST M_PI = 4 * ATN(1) '                                             Pi

TYPE arc_seg_data
  AS cairo_t PTR c_t
  AS DOUBLE xc, yc, ri, ra, a1, a2, fg, fb
END TYPE

' draw a colored circle segment / farbiges Kreissegment zeichnen
SUB arc_seg(BYVAL seg AS arc_seg_data PTR)
  VAR pa = NEW cairo_path_t
  WITH *seg
    cairo_arc_negative(.c_t, .xc, .yc, .ri, .a2, .a1)
    cairo_arc(.c_t, .xc, .yc, .ra, .a1, .a2)
    cairo_close_path(.c_t)
    pa = cairo_copy_path(.c_t)
    cairo_set_source_rgba(.c_t, 1, .fg, .fb, 0.9)
    cairo_fill(.c_t)
    cairo_append_path(.c_t, pa)
    cairo_set_source_rgb(.c_t, 0.0, 0.0, 0.0)
    cairo_stroke(.c_t)
  END WITH
  cairo_path_destroy(pa)
END SUB

' draw / zeichnen
SUB DoDrawing(BYVAL C AS cairo_surface_t PTR)
  VAR seg = NEW arc_seg_data, t = "Press a key to output PS, PDF and SVG."
  WITH *seg
    .c_t = cairo_create(C)
    cairo_set_source_rgb(.c_t, 1.0, 1.0, 1.0) '         white background
    cairo_paint(.c_t) '                                        fill page
    cairo_set_line_width(.c_t, 0.5)
    VAR f = 0.3 * Pag_W
    .xc = f
    .yc = f
    FOR z AS INTEGER = 0 TO 1 '                        two center points
      .ri = 0.1 * f
      FOR j AS INTEGER = 1 TO 5 STEP 1 '                     five radius
        .ra = .ri + 0.35 * f / j
        FOR i AS INTEGER = 0 TO 5 STEP 2 '                three segments
          .a1 = 60.0 * M_PI / 180 * i
          .a2 = 60.0 * M_PI / 180 * (i + 1)
          .fg = .ra / f
          .fb = .a1 / M_PI / 2
          arc_seg(seg)
        NEXT
        .ri = .ra
      NEXT
'      cairo_stroke(.c_t)

      .yc = Pag_H - f
      .xc = Pag_W - f
    NEXT
    cairo_set_font_size (.c_t, 0.15 * f)
    DIM AS cairo_font_extents_t fe '                         font data
    cairo_font_extents (.c_t, @fe)

    DIM AS cairo_text_extents_t te '                         text size
    cairo_text_extents (.c_t, t, @te)
    cairo_move_to (.c_t, _ '                 lower left corner of text
                   Pag_W / 2 - (te.width / 2 + te.x_bearing), _
                   Pag_H / 2 + (te.height / 2) - fe.descent)
    cairo_show_text(.c_t, t)
    cairo_show_page(.c_t)
    cairo_destroy(.c_t)
  END WITH
  cairo_surface_flush(C)
  cairo_surface_destroy(C)
END SUB

' screen output / Bildschirmausgabe
SUB write_screen()
  VAR S_W = CUINT(Pag_W) + 1, S_H = CUINT(Pag_H) + 1
  SCREENRES S_W, S_H, 32
  VAR c_s_t = cairo_image_surface_create_for_data( _
                SCREENPTR, CAIRO_FORMAT_ARGB32, _
                S_W, S_H, S_W * LEN(single))
  SCREENLOCK
  DoDrawing(c_s_t)
  SCREENUNLOCK
  SLEEP
END SUB

' file output / Schreibt eine Datei, pdf/svg/ps je nach Endung in fname
SUB write_file(BYREF fname AS STRING = "")
  DIM AS cairo_surface_t PTR c_s_t

  SELECT CASE LCASE(RIGHT(fname, 4))
  CASE ".pdf"
    c_s_t = cairo_pdf_surface_create(fname, Pag_W, Pag_H)
  CASE ".svg"
    c_s_t = cairo_svg_surface_create(fname, Pag_W, Pag_H)
  CASE ELSE
    c_s_t = cairo_ps_surface_create(fname, Pag_W, Pag_H)
  END SELECT
  DoDrawing(c_s_t)
END SUB


' main / Hauptprogramm
write_screen()

VAR f = "cairo_circle."
write_file(f & "pdf")
write_file(f & "ps")
write_file(f & "svg")
END 0

以往pdf格式输出的pdflib库在windows下非常受欢迎(协议:个人可用,但商业使用需交license费,QT应该也是类似的协议约束)。freebasic对初期的pdflib-lite.h做了bi重写,这样在freebasic下能够直接操作pdflib库进行pdf编程,和cairo的surface做图有些相似之处,也是move_to , line_to 的画线,show_text写字。

网上已经找不到编译好的 pdflib.so 库了,高版本的库与自带的.bi不匹配。意味着,使用高版本的pdflib需要改写 pdflib.bi ; 使用pdflib-lite, 则需要自己编译,也需要稍改动一下 pdflib.bi。

编译:

打开终端,进入PDFlib-Lite目录,执行:

./configure

make

sudo make install

编译完成后,在/usr/local/include/freebasic下找到 pdflib.bi, 用任意一款文本编辑器打开它,然后,替换所有的 as single 为 as double

库放在 /usr/local/lib下应该可以找到,如果找不到的话,在/etc/ld.so.conf.d下写一个自己的配置文件,系统的lib搜寻路径就会带上它去找lib 。它是个文本文件,里面放的是库的路径,文件名自己起,符合操作系统要求即可。

下面的freebasic的示例程序,生成 pdflib_test.pdf 文件。

#include once "pdflib.bi"

dim as PDF ptr p
dim as integer font, textx, texty, x, y, w, h, fontsize, c, image
dim as string text

p = PDF_new()
'' open new PDF file
if (PDF_open_file(p, "pdflib_test.pdf") = -1) then
	print "Error: could not open PDF file. Check to see if it is open by another application"
	print "Press any key to end..."  '' pause to allow error message to be read
	sleep
	end 1
end if

'' some document information
PDF_set_info(p, "Creator", "pdflib_test.bas")
PDF_set_info(p, "Author", "GOK")
PDF_set_info(p, "Title", "FreeBASIC")

'' start a new page, set font and size
PDF_begin_page(p, a4_width, a4_height)
font = PDF_findfont(p, "Helvetica-Bold", "host", 0)

PDF_setfont(p, font, 12)

'' Insert the logo
dim as string logofilename = exepath() & "/../../fblogo.gif"
image = PDF_open_image_file(p, "gif", logofilename, "", 0)
if image = -1  then
	print "Error: Couldn't read image file """ & logofilename & """"
else
	w = PDF_get_value(p, "imagewidth", image)
	h = PDF_get_value(p, "imageheight", image)
	PDF_place_image(p, image, (a4_width - w)/2, a4_height-h-50, 1)
	'' Note: only close the image when you are finished with it. Keep it in
	'' memory if you plan on reusing it.
	PDF_close_image(p, image)
end if

'' line drawing test
PDF_moveto(p, 25, a4_height-50 - h)
PDF_lineto(p, a4_width-50, a4_height-50 - h)
PDF_stroke(p)

'' some output
texty = a4_height-50 - h -50                              '' Move down from line by 50
PDF_set_text_pos(p, 50, texty)
PDF_show(p, "This is horizontal text in Helvetica-Bold")  '' output text

textx = PDF_get_value(p, "textx", 0)                      '' determine text position
texty = PDF_get_value(p, "texty", 0)                      '' determine text position

'' save state
PDF_save(p)
PDF_translate(p, textx, texty)                            '' move origin to end of text

'' change coordinate system
PDF_rotate(p, -90)                                        '' rotate coordinates
PDF_set_text_pos(p, 30, 100)                              '' provide for distance from horiz. text
PDF_show(p, "vertical text")

'' restore saved state
PDF_restore(p)

PDF_continue_text(p, "horizontal text continues")

'' text in red
PDF_save(p)
PDF_set_text_pos(p, 50, 440)
PDF_setcolor(p, "both", "rgb", 1, 0, 0, 0)
PDF_show(p, "Write some text in a box (Courier 10 - left justified)")
PDF_restore(p)

'' Print in a box
text = "PDF Viewers support a set of 14 core fonts which need not be embedded in any PDF file. They are:" + chr(10) + chr(13) + _
	"Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, " + _
	"Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol & ZapfDingbats"

fontsize = 10
font = PDF_findfont(p, "Courier", "host", 0)

PDF_setfont(p, font, fontsize)

x = 50
y = 350
w = 500
h = 7 * fontsize
c = PDF_show_boxed(p, text, x, y, w, h, "left", "")
if (c > 0 ) then
	'' C = number of characters truncated (0 means a fit)
	print "Not all characters could be placed in the box"
end if

'' draw a box around text
PDF_rect(p, x-2, y-2, w+4, h+4)
PDF_stroke(p)

'' tidy up
PDF_end_page(p)                                           '' close page
PDF_close(p)                                              '' close PDF document
PDF_delete(p)                                             '' delete the PDF "object"

print
print "pdflib_test.pdf generated."
print
print "Press any key to continue..."                      '' pause to allow error message to be read
sleep

用它做个简历应该还行,可能也只是方便而已,现在的浏览器差不多都可以选中后保存为pdf文件,各种office也是直接就生成了。pdf虽有许多其它功能(水印、文本框等),但用的地方好像并不多,如果只是少量页面,cairo画图生成pdf方便,它是free的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务知识03

1、ES搜索引擎,高性能的分布式搜索引擎,底层基于Lucene 主要用于应用程序中的搜索系统 日志收集 2、基础概念 3、ES处理流程 5、下载中文分词器 Releases infinilabs/analysis-ik GitHub 6、分词模式 最细粒度拆分、智能分词 7、Elaticsearch配置流程 (1)把文件拖进…

2024 年适用于 Windows 和 Mac 的最佳数据恢复软件

您刚刚与朋友参加了一次难忘的告别聚会回来。您已经拍摄了数百个美好瞬间,并将它们保存在您的设备中,并渴望与您所爱的人分享。 但随后,您突然不小心从电脑中删除了整个相机文件夹。现在这是我们许多人面临的最严重的问题,因为我…

Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解

前言 2021年5月,OpenAI发表了《扩散模型超越GANs》的文章,标志着扩散模型(Diffusion Models,DM)在图像生成领域开始超越传统的GAN模型,进一步推动了DM的应用。 然而,早期的DM直接作用于像素空…

2024年2月份微软安全通告

文章目录 (一) 漏洞概要(二) 漏洞数据分析1、漏洞数量趋势2、历史微软补丁日二月漏洞对比3、漏洞数量分析 (三) 重要漏洞分析1、漏洞分析2、影响范围3、修复建议 (一) 漏洞概要 202…

SanctuaryAI推出Phoenix: 专为工作而设计的人形通用机器人

文章目录 1. Company2. Main2.1 关于凤凰™ (Phoenix)2.2 关于碳™(Carbon)2.3 商业化部署2.4 关于 Sanctuary Corporation 3. My thoughtsReference彩蛋:将手机变为桌面小机器人 唯一入选《时代》杂志 2023 年最佳发明的通用机器人。 称机器人自主做家务的速度和灵…

5G 网络切片VLAN ID配置错误导致业务不可用

【摘要】随着电联5G共建共享工作的开展,无法及时有效观测到单逻辑站点的相关指标,导致单运营商用户业务出现异常。本案例中着重对单运营商用户无法使用网络进行相关参数排查,从KPI性能指标结合故障告警发生时间,从而分析由于网络切…

BUUCTF-DASBOOK1

[第一章][1.3.5 案例解析][极客大挑战 2019]Http 1 1.启动靶机 2.查看源代码,发现有链接 3.点击链接,跳转页面有提示,意思是:它并不来自于https:/Sycsecret.buuoj.cn 打开hackbar,如图所示,然后执行 4.得到…

对于爬虫的学习

本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求:找出里面所有javaxxString str"Java自从95年问世以来,经历了…

html标签元素类型,一个前端妹子的面试笔记

计算机网络篇 HTTP HTTP 报文结构是怎样的?HTTP有哪些请求方法?GET 和 POST 有什么区别?如何理解 URI?如何理解 HTTP 状态码?简要概括一下 HTTP 的特点和缺点?对 Accept 系列字段了解多少?对于…

【Linux篇】Linux下的第一个小程序--进度条 蹦迪炫彩进图条

💛不要有太大压力🧡 💛生活不是选择而是热爱🧡 文章目录 Linux下第一个小程序:进度条两个背景知识缓冲区回车和换行是一个概念? 进图条原理进度条代码效果其他玩法:蹦迪版进度条 Linux下第一个小…

CSS常用五类选择器,附面试题

学习路线 第一阶段:网页制作 HTML:常用标签,锚点,列表标签,表单标签,表格标签,标签分类,标签语义化,注释,字符实体 CSS:CSS介绍,全局…

常用日期和时间标准对比:HTML, ISO 8601, RFC 3339, RFC 5322

1. HTML, ISO 8601, RFC 3339, RFC 5322 对比 日期和时间,对于不同系统和平台之间的数据交换和互操作至关重要。本文将对比 HTML 标准、ISO 8601、RFC 3339 和 RFC 5322,为读者提供参考。 表格文字版见文末-附 1.1. 标准链接 HTML 标准: https://html…

Vue基础入门(4)- Vuex的使用

Vue基础入门(4)- Vuex的使用 Vuex 主要内容:Store以及其中的state、mutations、actions、getters、modules属性 介绍:Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件&#xff…

Linux开发板移植rz、sz指令实现串口传输文件

一、开发环境 实现开发板和电脑通过串口来收发互传文件。 开发板:NUC980开发板 环境:Ubuntu 22.04.3 LTS 64-bit lrzsz的源码包:例如 lrzsz-0.12.20.tar.gz,下载地址https://ohse.de/uwe/software/lrzsz.html 二、移植步骤 在开发板上移植…

深拷贝浅拷贝的区别?如何实现一个深浅拷贝(非常详细哦)

文章目录 一、数据类型存储二、浅拷贝Object.assignslice()concat()拓展运算符 三、深拷贝\_.cloneDeep()jQuery.extend()JSON.stringify()循环递归 四、区别小结 一、数据类型存储 前面文章我们讲到,JavaScript中存在两大数据类型: 基本类型引用类型 …

PyTorch2.0 环境搭建详细步骤(Nvidia显卡)

Step 1 、查看显卡驱动版本 Step2、下载CUDA 11.7 或者11.8(我自己用的这个)也行,稍后我会贴出来版本匹配对应表 CUDA Toolkit - Free Tools and Training | NVIDIA Developer Step3、下载CUDNN cuDNN 9.0.0 Downloads | NVIDIA Developer Step4、安装…

183基于matlab的非线性调频模态分解(VNCMD)

基于matlab的非线性调频模态分解(VNCMD),一种基于变分方法的信号分解技术,它将信号分解为多个模式。能够处理非线性调频信号,且对噪声具有较好的鲁棒性。VNCMD的基本原理是通过最小化信号与模式之间的差异来实现信号的分解。程序已调通&#…

Vue中的v-for中为什么不推荐使用index作为key值

在Vue中,我们经常会用到v-for指令来遍历数组或对象并渲染列表。而在使用v-for指令时,通常会需要给每个遍历的元素指定一个唯一的key值,以帮助Vue更高效地更新DOM。 在很多情况下,我们可能会倾向于使用index作为key值,…

公有云等保合规安全解决方案的设计与实现

随着云计算的快速发展,公有云已成为企业的重要选择。然而,对于一些行业和组织来说,数据的安全性和合规性是使用公有云的关键问题之一。因此,公有云等保合规安全解决方案的设计与实现变得至关重要。本文将探讨公有云等保合规安全解…

粘包与拆包

优质博文:IT-BLOG-CN 一、粘包出现的原因 服务端与客户端没有约定好要使用的数据结构。Socket Client实际是将数据包发送到一个缓存buffer中,通过buffer刷到数据链路层。因服务端接收数据包时,不能断定数据包1何时结束,就有可能出…