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

text_demo.c

/** << 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;
}

grid_sheet.c

#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 */

grid_sheet.h

#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的库相关推荐

  1. MFC使用Haru free pdf lib生成pdf文件

    MFC使用Haru free pdf lib生成pdf文件 我们先创建一个项目MFCPDFDemo,在上面添加一个编辑框和一个按钮: haru free pdf类库下载地址 这里直接下载dll,如果想 ...

  2. python pdf报告_Python实现html转换为pdf报告(生成pdf报告)功能示例

    本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能.分享给大家供大家参考,具体如下: 1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装pyt ...

  3. python数据生成pdf,Python生成pdf文件的方法

    摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...

  4. java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件

    Java 使用pdf 模板生成pdf文件 --制作流程 1.      使用工具 adobe acrobat dc.word 2015 2.      使用 word 繪制一個 3*5 的表格並保存, ...

  5. itextpdf通过pdf模板生成pdf文件

    itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...

  6. delphi使用Foxit Quick PDF Library读写pdf文本和图片

    简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...

  7. python 根据PDF 目录生成PDF书签

    Python 代码 PDF 生成书签代码 ,使用PyPDF4 库. txt_path 目录文件 pdf_path pdf 文件 换成自己的地址 txt 文件 格式 第 1 章-LAMP 网站构建-1 ...

  8. php培训 pdf,php生成pdf

    php生成pdf 如何把一个动态的php页面生成pdf格式的文件啊. 更新时间:2019-10-29 07:36 最满意答案 你的意思是用php来生成pdf文件么? 这个php提供了一个扩展的. 可以 ...

  9. java 其他文件转pdf_java 其他文件转成pdf java生成pdf

    java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...

最新文章

  1. python读书笔记二、文件基本操作
  2. Redis事物分布式锁
  3. 【学术技巧】让你的 GitHub 秒变高大上!
  4. mysql缺少函数_Sqlserver的窗口函数的精彩应用之数据差距与数据岛-答案篇
  5. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
  6. 服务器维护 测试化验加工费,测试化验加工费.PPT
  7. php向下滑动,js如何判断鼠标滚轮是向下还是向上滚动
  8. keyProperty=“id“ 和useGeneratedKeys=“true“作用
  9. HDU3788 ZOJ问题
  10. 拓端tecdat|R语言代写岭回归ridge regression分析租房价格报告
  11. 如何修改hosts文件
  12. 万能地图下载器下载谷歌卫星地图在ArcGIS中套合
  13. 平面设计中有趣的词云图如何设计
  14. 高斯过程回归(Gaussian Process Regression)
  15. 《MySQL入门学习》(p61~p62)
  16. jQuery 插件——免费版
  17. Shell--点名器脚本,实现点名去重。
  18. freemarker 导出word文件中包含图片
  19. 2019,苹果艰难又关键的一年
  20. Python爬虫分析——B站UP主视频数据分析

热门文章

  1. NirCmd-v2.52使用说明中文译本
  2. 腾讯云开发小程序课程笔记
  3. go语言实现发送QQ邮箱
  4. 美国往事 - 追忆我的房东Dick - 搞笑回忆
  5. 大众营销OUT,活跃科技教你玩精众营销
  6. saas供应链批发订货系统源码整套输出
  7. 【Qzone】向来缘浅 奈何情深 第三步 编译Android内核源代码
  8. Unfortunately,Launcher has stopped
  9. Ubuntu安装钉钉超简单步骤
  10. 京东成都研究所奋战618