Haru Free PDF Library——生成PDF的库
PDF是我们极其常用的文件格式,但对如何生成PDF,个人一直觉得很神秘,其实利用一些公开的PDF库,我们就可以直接生成PDF文件,而不用关注PDF文件的内部细节。我知道的PDF库有如CARIO和HARU。
HARU是一款免费的,跨平台的,开源的生成PDF的库。支持嵌入PNG、JPEG图片,支持CJK字体编码。用C语言编写,因此可以在C/C++中调用。HARU也提供了Ruby,Delphhi,和C#的捆绑(binding)。项目主页见http://libharu.sourceforge.net/index.html和http://libharu.org/wiki/Main_Page。
项目主页上有详尽的文档来说明如何安装和使用。在Mac OX下,不喜欢折腾的人可以用macports来安装(当然,必须先安装macports,google之):
sudo port install libharu
下面是从项目主页上摘下来的例子text_demo.c
下面是代码,可以从主页上下载:text_demo.c, grid_sheet.c, grid_sheet.h
/** << Haru Free PDF Library 2.0.0 >> -- text_demo.c** Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>** Permission to use, copy, modify, distribute and sell this software* and its documentation for any purpose is hereby granted without fee,* provided that the above copyright notice appear in all copies and* that both that copyright notice and this permission notice appear* in supporting documentation.* It is provided "as is" without express or implied warranty.**/#include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <setjmp.h> #include "hpdf.h" #include "grid_sheet.h"jmp_buf env;#ifdef HPDF_DLL void __stdcall #else void #endif error_handler (HPDF_STATUS error_no,HPDF_STATUS detail_no,void *user_data) {printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,(HPDF_UINT)detail_no);longjmp(env, 1); }void show_stripe_pattern (HPDF_Page page,HPDF_REAL x,HPDF_REAL y) {HPDF_UINT iy = 0;while (iy < 50) {HPDF_Page_SetRGBStroke (page, 0.0, 0.0, 0.5);HPDF_Page_SetLineWidth (page, 1);HPDF_Page_MoveTo (page, x, y + iy);HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, "ABCabc123"),y + iy);HPDF_Page_Stroke (page);iy += 3;}HPDF_Page_SetLineWidth (page, 2.5); }void show_description (HPDF_Page page,HPDF_REAL x,HPDF_REAL y,const char *text) {float fsize = HPDF_Page_GetCurrentFontSize (page);HPDF_Font font = HPDF_Page_GetCurrentFont (page);HPDF_RGBColor c = HPDF_Page_GetRGBFill (page);HPDF_Page_BeginText (page);HPDF_Page_SetRGBFill (page, 0, 0, 0);HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);HPDF_Page_SetFontAndSize (page, font, 10);HPDF_Page_TextOut (page, x, y - 12, text);HPDF_Page_EndText (page);HPDF_Page_SetFontAndSize (page, font, fsize);HPDF_Page_SetRGBFill (page, c.r, c.g, c.b); }int main (int argc, char **argv) {const char *page_title = "Text Demo";HPDF_Doc pdf;HPDF_Font font;HPDF_Page page;char fname[256];const char* samp_text = "abcdefgABCDEFG123!#$%&+-@?";const char* samp_text2 = "The quick brown fox jumps over the lazy dog.";float tw;float fsize;int i;int len;float angle1;float angle2;float rad1;float rad2;float ypos;strcpy (fname, argv[0]);strcat (fname, ".pdf");pdf = HPDF_New (error_handler, NULL);if (!pdf) {printf ("error: cannot create PdfDoc object\n");return 1;}if (setjmp(env)) {HPDF_Free (pdf);return 1;}/* set compression mode */HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL);/* create default-font */font = HPDF_GetFont (pdf, "Helvetica", NULL);/* add a new page object. */page = HPDF_AddPage (pdf);/* draw grid to the page */print_grid (pdf, page);/* print the lines of the page.HPDF_Page_SetLineWidth (page, 1);HPDF_Page_Rectangle (page, 50, 50, HPDF_Page_GetWidth(page) - 100,HPDF_Page_GetHeight (page) - 110);HPDF_Page_Stroke (page);*//* print the title of the page (with positioning center). */HPDF_Page_SetFontAndSize (page, font, 24);tw = HPDF_Page_TextWidth (page, page_title);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, (HPDF_Page_GetWidth(page) - tw) / 2,HPDF_Page_GetHeight (page) - 50, page_title);HPDF_Page_EndText (page);HPDF_Page_BeginText (page);HPDF_Page_MoveTextPos (page, 60, HPDF_Page_GetHeight(page) - 60);/** font size*/fsize = 8;while (fsize < 60) {char buf[50];int len;/* set style and size of font. */HPDF_Page_SetFontAndSize(page, font, fsize);/* set the position of the text. */HPDF_Page_MoveTextPos (page, 0, -5 - fsize);/* measure the number of characters which included in the page. */strcpy(buf, samp_text);len = HPDF_Page_MeasureText (page, samp_text,HPDF_Page_GetWidth(page) - 120, HPDF_FALSE, NULL);/* truncate the text. */buf[len] = 0x00;HPDF_Page_ShowText (page, buf);/* print the description. */HPDF_Page_MoveTextPos (page, 0, -10);HPDF_Page_SetFontAndSize(page, font, 8);#ifdef __WIN32___snprintf(buf, 50, "Fontsize=%.0f", fsize);#elsesnprintf(buf, 50, "Fontsize=%.0f", fsize);#endifHPDF_Page_ShowText (page, buf);fsize *= 1.5;}/** font color*/HPDF_Page_SetFontAndSize(page, font, 8);HPDF_Page_MoveTextPos (page, 0, -30);HPDF_Page_ShowText (page, "Font color");HPDF_Page_SetFontAndSize (page, font, 18);HPDF_Page_MoveTextPos (page, 0, -20);len = strlen (samp_text);for (i = 0; i < len; i++) {char buf[2];float r = (float)i / (float)len;float g = 1 - ((float)i / (float)len);buf[0] = samp_text[i];buf[1] = 0x00;HPDF_Page_SetRGBFill (page, r, g, 0.0);HPDF_Page_ShowText (page, buf);}HPDF_Page_MoveTextPos (page, 0, -25);for (i = 0; i < len; i++) {char buf[2];float r = (float)i / (float)len;float b = 1 - ((float)i / (float)len);buf[0] = samp_text[i];buf[1] = 0x00;HPDF_Page_SetRGBFill (page, r, 0.0, b);HPDF_Page_ShowText (page, buf);}HPDF_Page_MoveTextPos (page, 0, -25);for (i = 0; i < len; i++) {char buf[2];float b = (float)i / (float)len;float g = 1 - ((float)i / (float)len);buf[0] = samp_text[i];buf[1] = 0x00;HPDF_Page_SetRGBFill (page, 0.0, g, b);HPDF_Page_ShowText (page, buf);}HPDF_Page_EndText (page);ypos = 450;/** Font rendering mode*/HPDF_Page_SetFontAndSize(page, font, 32);HPDF_Page_SetRGBFill (page, 0.5, 0.5, 0.0);HPDF_Page_SetLineWidth (page, 1.5);/* PDF_FILL */show_description (page, 60, ypos,"RenderingMode=PDF_FILL");HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos, "ABCabc123");HPDF_Page_EndText (page);/* PDF_STROKE */show_description (page, 60, ypos - 50,"RenderingMode=PDF_STROKE");HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos - 50, "ABCabc123");HPDF_Page_EndText (page);/* PDF_FILL_THEN_STROKE */show_description (page, 60, ypos - 100,"RenderingMode=PDF_FILL_THEN_STROKE");HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_THEN_STROKE);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos - 100, "ABCabc123");HPDF_Page_EndText (page);/* PDF_FILL_CLIPPING */show_description (page, 60, ypos - 150,"RenderingMode=PDF_FILL_CLIPPING");HPDF_Page_GSave (page);HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_CLIPPING);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos - 150, "ABCabc123");HPDF_Page_EndText (page);show_stripe_pattern (page, 60, ypos - 150);HPDF_Page_GRestore (page);/* PDF_STROKE_CLIPPING */show_description (page, 60, ypos - 200,"RenderingMode=PDF_STROKE_CLIPPING");HPDF_Page_GSave (page);HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE_CLIPPING);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos - 200, "ABCabc123");HPDF_Page_EndText (page);show_stripe_pattern (page, 60, ypos - 200);HPDF_Page_GRestore (page);/* PDF_FILL_STROKE_CLIPPING */show_description (page, 60, ypos - 250,"RenderingMode=PDF_FILL_STROKE_CLIPPING");HPDF_Page_GSave (page);HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_STROKE_CLIPPING);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, ypos - 250, "ABCabc123");HPDF_Page_EndText (page);show_stripe_pattern (page, 60, ypos - 250);HPDF_Page_GRestore (page);/* Reset text attributes */HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);HPDF_Page_SetRGBFill (page, 0, 0, 0);HPDF_Page_SetFontAndSize(page, font, 30);/** Rotating text*/angle1 = 30; /* A rotation of 30 degrees. */rad1 = angle1 / 180 * 3.141592; /* Calcurate the radian value. */show_description (page, 320, ypos - 60, "Rotating text");HPDF_Page_BeginText (page);HPDF_Page_SetTextMatrix (page, cos(rad1), sin(rad1), -sin(rad1), cos(rad1),330, ypos - 60);HPDF_Page_ShowText (page, "ABCabc123");HPDF_Page_EndText (page);/** Skewing text.*/show_description (page, 320, ypos - 120, "Skewing text");HPDF_Page_BeginText (page);angle1 = 10;angle2 = 20;rad1 = angle1 / 180 * 3.141592;rad2 = angle2 / 180 * 3.141592;HPDF_Page_SetTextMatrix (page, 1, tan(rad1), tan(rad2), 1, 320, ypos - 120);HPDF_Page_ShowText (page, "ABCabc123");HPDF_Page_EndText (page);/** scaling text (X direction)*/show_description (page, 320, ypos - 175, "Scaling text (X direction)");HPDF_Page_BeginText (page);HPDF_Page_SetTextMatrix (page, 1.5, 0, 0, 1, 320, ypos - 175);HPDF_Page_ShowText (page, "ABCabc12");HPDF_Page_EndText (page);/** scaling text (Y direction)*/show_description (page, 320, ypos - 250, "Scaling text (Y direction)");HPDF_Page_BeginText (page);HPDF_Page_SetTextMatrix (page, 1, 0, 0, 2, 320, ypos - 250);HPDF_Page_ShowText (page, "ABCabc123");HPDF_Page_EndText (page);/** char spacing, word spacing*/show_description (page, 60, 140, "char-spacing 0");show_description (page, 60, 100, "char-spacing 1.5");show_description (page, 60, 60, "char-spacing 1.5, word-spacing 2.5");HPDF_Page_SetFontAndSize (page, font, 20);HPDF_Page_SetRGBFill (page, 0.1, 0.3, 0.1);/* char-spacing 0 */HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, 140, samp_text2);HPDF_Page_EndText (page);/* char-spacing 1.5 */HPDF_Page_SetCharSpace (page, 1.5);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, 100, samp_text2);HPDF_Page_EndText (page);/* char-spacing 1.5, word-spacing 3.5 */HPDF_Page_SetWordSpace (page, 2.5);HPDF_Page_BeginText (page);HPDF_Page_TextOut (page, 60, 60, samp_text2);HPDF_Page_EndText (page);/* save the document to a file */HPDF_SaveToFile (pdf, fname);/* clean up */HPDF_Free (pdf);return 0; }
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <setjmp.h> #include "hpdf.h" #include "grid_sheet.h"#ifdef STAND_ALONE jmp_buf env;#ifdef HPDF_DLL void __stdcall #else void #endif error_handler (HPDF_STATUS error_no,HPDF_STATUS detail_no,void *user_data) {printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,(HPDF_UINT)detail_no);longjmp(env, 1); }#endif /* STAND_ALONE */void print_grid (HPDF_Doc pdf,HPDF_Page page) {HPDF_REAL height = HPDF_Page_GetHeight (page);HPDF_REAL width = HPDF_Page_GetWidth (page);HPDF_Font font = HPDF_GetFont (pdf, "Helvetica", NULL);HPDF_UINT x, y;HPDF_Page_SetFontAndSize (page, font, 5);HPDF_Page_SetGrayFill (page, 0.5);HPDF_Page_SetGrayStroke (page, 0.8);/* Draw horizontal lines */y = 0;while (y < height) {if (y % 10 == 0)HPDF_Page_SetLineWidth (page, 0.5);else {if (HPDF_Page_GetLineWidth (page) != 0.25)HPDF_Page_SetLineWidth (page, 0.25);}HPDF_Page_MoveTo (page, 0, y);HPDF_Page_LineTo (page, width, y);HPDF_Page_Stroke (page);if (y % 10 == 0 && y > 0) {HPDF_Page_SetGrayStroke (page, 0.5);HPDF_Page_MoveTo (page, 0, y);HPDF_Page_LineTo (page, 5, y);HPDF_Page_Stroke (page);HPDF_Page_SetGrayStroke (page, 0.8);}y += 5;}/* Draw virtical lines */x = 0;while (x < width) {if (x % 10 == 0)HPDF_Page_SetLineWidth (page, 0.5);else {if (HPDF_Page_GetLineWidth (page) != 0.25)HPDF_Page_SetLineWidth (page, 0.25);}HPDF_Page_MoveTo (page, x, 0);HPDF_Page_LineTo (page, x, height);HPDF_Page_Stroke (page);if (x % 50 == 0 && x > 0) {HPDF_Page_SetGrayStroke (page, 0.5);HPDF_Page_MoveTo (page, x, 0);HPDF_Page_LineTo (page, x, 5);HPDF_Page_Stroke (page);HPDF_Page_MoveTo (page, x, height);HPDF_Page_LineTo (page, x, height - 5);HPDF_Page_Stroke (page);HPDF_Page_SetGrayStroke (page, 0.8);}x += 5;}/* Draw horizontal text */y = 0;while (y < height) {if (y % 10 == 0 && y > 0) {char buf[12];HPDF_Page_BeginText (page);HPDF_Page_MoveTextPos (page, 5, y - 2); #ifdef __WIN32___snprintf (buf, 12, "%u", y); #elsesnprintf (buf, 12, "%u", y); #endifHPDF_Page_ShowText (page, buf);HPDF_Page_EndText (page);}y += 5;}/* Draw virtical text */x = 0;while (x < width) {if (x % 50 == 0 && x > 0) {char buf[12];HPDF_Page_BeginText (page);HPDF_Page_MoveTextPos (page, x, 5); #ifdef __WIN32___snprintf (buf, 12, "%u", x); #elsesnprintf (buf, 12, "%u", x); #endifHPDF_Page_ShowText (page, buf);HPDF_Page_EndText (page);HPDF_Page_BeginText (page);HPDF_Page_MoveTextPos (page, x, height - 10);HPDF_Page_ShowText (page, buf);HPDF_Page_EndText (page);}x += 5;}HPDF_Page_SetGrayFill (page, 0);HPDF_Page_SetGrayStroke (page, 0); }#ifdef STAND_ALONEint main (int argc, char **argv) {HPDF_Doc pdf;HPDF_Page page;char fname[256];strcpy (fname, argv[0]);strcat (fname, ".pdf");pdf = HPDF_New (error_handler, NULL);if (!pdf) {printf ("error: cannot create PdfDoc object\n");return 1;}if (setjmp(env)) {HPDF_Free (pdf);return 1;}/* add a new page object. */page = HPDF_AddPage (pdf);HPDF_Page_SetHeight (page, 600);HPDF_Page_SetWidth (page, 400);print_grid (pdf, page);/* save the document to a file */HPDF_SaveToFile (pdf, fname);/* clean up */HPDF_Free (pdf);return 0; }#endif /* STAND_ALONE */
#ifndef __GRID_SHEET_H #define __GRID_SHEET_H#include "hpdf.h"void print_grid (HPDF_Doc pdf,HPDF_Page page);#endif /* __GRID_SHEET_H */
转载于:https://www.cnblogs.com/liyropt/archive/2012/12/08/2809379.html
Haru Free PDF Library——生成PDF的库相关推荐
- MFC使用Haru free pdf lib生成pdf文件
MFC使用Haru free pdf lib生成pdf文件 我们先创建一个项目MFCPDFDemo,在上面添加一个编辑框和一个按钮: haru free pdf类库下载地址 这里直接下载dll,如果想 ...
- python pdf报告_Python实现html转换为pdf报告(生成pdf报告)功能示例
本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能.分享给大家供大家参考,具体如下: 1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装pyt ...
- python数据生成pdf,Python生成pdf文件的方法
摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...
- java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件
Java 使用pdf 模板生成pdf文件 --制作流程 1. 使用工具 adobe acrobat dc.word 2015 2. 使用 word 繪制一個 3*5 的表格並保存, ...
- itextpdf通过pdf模板生成pdf文件
itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...
- delphi使用Foxit Quick PDF Library读写pdf文本和图片
简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...
- python 根据PDF 目录生成PDF书签
Python 代码 PDF 生成书签代码 ,使用PyPDF4 库. txt_path 目录文件 pdf_path pdf 文件 换成自己的地址 txt 文件 格式 第 1 章-LAMP 网站构建-1 ...
- php培训 pdf,php生成pdf
php生成pdf 如何把一个动态的php页面生成pdf格式的文件啊. 更新时间:2019-10-29 07:36 最满意答案 你的意思是用php来生成pdf文件么? 这个php提供了一个扩展的. 可以 ...
- java 其他文件转pdf_java 其他文件转成pdf java生成pdf
java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...
最新文章
- python读书笔记二、文件基本操作
- Redis事物分布式锁
- 【学术技巧】让你的 GitHub 秒变高大上!
- mysql缺少函数_Sqlserver的窗口函数的精彩应用之数据差距与数据岛-答案篇
- 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
- 服务器维护 测试化验加工费,测试化验加工费.PPT
- php向下滑动,js如何判断鼠标滚轮是向下还是向上滚动
- keyProperty=“id“ 和useGeneratedKeys=“true“作用
- HDU3788 ZOJ问题
- 拓端tecdat|R语言代写岭回归ridge regression分析租房价格报告
- 如何修改hosts文件
- 万能地图下载器下载谷歌卫星地图在ArcGIS中套合
- 平面设计中有趣的词云图如何设计
- 高斯过程回归(Gaussian Process Regression)
- 《MySQL入门学习》(p61~p62)
- jQuery 插件——免费版
- Shell--点名器脚本,实现点名去重。
- freemarker 导出word文件中包含图片
- 2019,苹果艰难又关键的一年
- Python爬虫分析——B站UP主视频数据分析