你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

MCU生成简单PDF文档  

[复制链接]
anobodykey 发布时间:2017-6-17 23:03
本帖最后由 anobodykey 于 2017-9-24 14:09 编辑 % \1 n- Z$ _/ Z$ }2 W

& |9 V; o# I" p# o/ E

主机环境:Win10 64bit

开发环境:MDK5.23

目标板:Cortex-M MCU

之前有次在群里看到有人询问单片机生成PDF的问题,突然觉得有些兴趣所以就学习了一下libHaru库,libHaru库是一个十分不错的库,对于PDF的实现来说也是相当齐全的,在PC上使用是完全没有问题的,但在资源紧张的MCU上,还是有些困难的,因此就想找一下适用于MCU的生成PDF的库,结果不太理想,都是一些需要实现动态内存管理的平台才行,而且这些库都是把生成的数据放在了内存中,直到保存文件时才写入到文件中,这对于一般只有几十或者几百KB级别的单片机来说更不可能了,于是乎,萌发了自己动手写一个基本的能用于MCU的生成PDF文件的库,我称之为libpdf,其中的接口参考了libHaru,如下所示:

捕获.PNG

当然有些接口还没有实现,但基本的操作还是可以的,等以后再逐渐完善吧,pdflib是生成pdf文件的,因此要基于Fatfs来实现文件的操作,pdflib库只有两个文件,也相应的参考了pdfgen库,该库在后面有链接,

头文件如下:

  1. #ifndef __PDFLIB_H__
    ) \8 B1 {/ L( I% N4 c9 l7 ~
  2. #define __PDFLIB_H__
    % K! j) I( O& }: k* w: o  l. w

  3. 9 `0 _+ _/ Y7 I5 X
  4. #include "ff.h"9 q/ C$ Z7 u5 w. y0 j
  5. /*----- standard C library functions -----------------------------------------*/+ {, {% ^9 O5 }: j* q) c( V
  6. ! p0 W, F/ ?" ^1 P% \) Q0 t
  7. #define LPDF_FOPEN                  f_open
    % \  V1 y0 Z9 c) m. b1 H
  8. #define LPDF_FCLOSE                 f_close2 M8 G& q  a0 [: j, T3 n4 P9 v, S
  9. #define LPDF_FREAD                  f_read
    4 i$ }. Y5 S3 p, Y1 D6 H# S  U
  10. #define LPDF_FWRITE                 f_write
    3 q# ]5 C9 ]( X( u  J
  11. #define LPDF_FFLUSH                 f_sync; a5 E4 ?) ~) R) l- Y
  12. #define LPDF_FSEEK                  f_seek
    ( X7 y9 P: u) ]( N2 Y% ]& u4 M: [
  13. #define LPDF_FTELL                  f_tell
    : ?) R" d  Z- e
  14. #define LPDF_FEOF                   f_eof2 J( w5 ^4 V! @! A" M: i& X) ~& R
  15. #define LPDF_FERROR                 f_error
    - U' n  m7 V2 U
  16. #define LPDF_RENAME                 f_rename6 f' }$ u" `, D. V
  17. #define LPDF_REMOVE                 f_unlink( n6 X5 v) V1 w$ b  O. A9 a* {
  18. #define LPDF_MALLOC                 malloc
    + I; m( r  H# y# D' A+ P( g, a2 k
  19. #define LPDF_FREE                   free  f0 M; A2 D% E+ P" z
  20. #define LPDF_FILE                   FIL
    ( x. |9 G) ^) Z! t4 b9 |" L
  21. #define LPDF_TIME                   time
    & ]4 s/ ]( s. h/ N+ @
  22. #define LPDF_PRINTF                 printf
    7 e  _3 X9 M# E
  23. #define LPDF_SPRINTF                sprintf
    ; z% V( S) k, q- N' d" Y
  24. #define LPDF_FPRINTF                f_printf
    + y: B7 U! T% o5 V9 `- a
  25. #define LPDF_VOID                   void
    8 F% X* K& r0 r2 f# a! }
  26. #define LPDF_SIN                    sin
    / s4 T4 p' J. z( q+ I9 c
  27. #define LPDF_COS                    cos. V( j; l4 j+ S; Z3 w5 r* `

  28. $ I+ A8 r2 M' e6 d6 b. K' t
  29. /*  native OS integer types */, B5 O3 d5 \  S) q; ^
  30. typedef  signed int          LPDF_INT;. H+ S5 V' W9 p: a8 B
  31. typedef  unsigned int        LPDF_UINT;
    5 }5 n  p2 I8 }/ e* `
  32. * h9 d3 F9 i1 d) c

  33. 0 c8 s5 ~. T5 J9 {/ S9 }% \* M' L3 {7 v
  34. /*  32bit integer types
    , j  j% s4 X/ u' F, b
  35. */
    ) x- u* |* m4 I. r4 C
  36. typedef  signed int          LPDF_INT32;: @  x; l, ~4 P1 s/ O2 j
  37. typedef  unsigned int        LPDF_UINT32;
    7 d5 B+ G" r+ }  [
  38. * J5 |* M" T# e! [5 u. D

  39. ' _' E: u. T: k
  40. /*  16bit integer types" D! L+ }* b* S5 i7 F' E& J1 Z
  41. */- n) B8 @( q" A5 k
  42. typedef  signed short        LPDF_INT16;
    1 @  u& ~# f1 t7 p: n. m
  43. typedef  unsigned short      LPDF_UINT16;
    0 C( o- D* a9 e; j/ \" R- V

  44.   E: e: P; J8 L/ w+ G( J$ V' x" g
  45. 3 C" _' R7 t& B* v+ g
  46. /*  8bit integer types
    ' G, u8 E$ i% |& ~3 p* ]
  47. */
    4 r8 w4 l2 \6 d; f5 b8 J0 }& I
  48. typedef  signed char         LPDF_INT8;
    ' E: N0 a" U* i7 X0 W
  49. typedef  unsigned char       LPDF_UINT8;
    & Q" B' B* {" u; _+ a! k
  50. % M$ p1 q% r0 u: B3 ?! L, Q% v4 v

  51. 1 j$ D9 g2 J7 t2 r% G7 T9 W
  52. /*  8bit binary types
    3 Z. }+ p6 Q; `: t. W0 Z
  53. */
    5 x$ H+ X' F2 S' F% d+ W4 H. U
  54. typedef  unsigned char       LPDF_BYTE;
    7 K; R, R$ A) e  E" X8 t0 s
  55. 9 O4 H  Q- ?( t# l) w9 u2 m
  56. ; ^) y8 q; l3 O) t* e/ M9 Q
  57. /*  float type (32bit IEEE754)% t5 f# x' F2 C; D5 h
  58. */0 O( s  L( Z/ |( H- W+ ~# a( Q  Y
  59. typedef  float               LPDF_REAL;
    1 _6 G  ~$ H0 [; y+ n
  60. 8 y$ t+ L5 Q" {* O$ P) {" u7 j. j
  61. # N# p: {& N8 ^* _
  62. /*  double type (64bit IEEE754)8 y5 A9 N! t$ Z% u
  63. */& z" U' q& D$ G! b( p) U6 O
  64. typedef  double              LPDF_DOUBLE;% s' d' z0 p4 t" {+ j$ f
  65. " [( g  x% E( y. P  y: q- `3 V

  66.   l- ?) t3 N' S) C5 t- G
  67. /*  boolean type (0: False, !0: True)2 Y+ W- T! h" S3 P3 \7 x
  68. */8 |( I  a3 v' k: r/ H4 G+ v
  69. typedef  signed int          LPDF_BOOL;
    ; \: S# Z8 ^& r/ O2 u

  70. 9 [$ L" V$ J2 K  _

  71. - m7 B  ]4 m# f; M& q8 _
  72. /*  error-no type (32bit unsigned integer)
    $ _* `% Z7 S9 U/ E
  73. */  u: A* z6 X) L
  74. typedef  unsigned long       LPDF_STATUS;
    8 o/ D1 W6 v/ g, W# _- S% s* w
  75. % N7 K* w* F- h' M3 U
  76. #define LPDF_OK                     0- p8 f# t% g7 z# o% e' K
  77. #define LPDF_FAILED                 14 [' o! C" T2 X( A# @2 b
  78. # y/ f8 E- R) b) r' X/ q1 [; G
  79. /*----- font state -----------------------------------------------------------*/3 b5 A$ Q: A, ~
  80. #define   LPDF_FONT_INVALID                 0x00FF6 }6 \; S$ H  t, W; C
  81. #define   LPDF_FONT_COURIER                 0x00001 a- a6 c# Z, n) r# Z- U
  82. #define   LPDF_FONT_COURIER_B               0x0001* A0 N$ Q/ g& j% ?' r" c
  83. #define   LPDF_FONT_COURIER_O               0x0002
    , {7 I9 y3 G% L, o, S, A6 U
  84. #define   LPDF_FONT_COURIER_OB              0x0003
    8 S4 x  Z' z3 O' W
  85. #define   LPDF_FONT_HELVETICA               0x0004) l7 Y2 i1 t! Z) B* |5 k
  86. #define   LPDF_FONT_HELVETICA_B             0x0005
    / b5 I9 R! o& o4 f4 p0 o- ]: W
  87. #define   LPDF_FONT_HELVETICA_O             0x0006- B( H% y' s9 t6 T7 r
  88. #define   LPDF_FONT_HELVETICA_BO            0x00075 t6 g4 ~, l- o8 `+ a  X. k
  89. #define   LPDF_FONT_TIMES_R                 0x0008
    & s7 C* o8 K- U4 `
  90. #define   LPDF_FONT_TIMES_B                 0x0009
      v8 a, `+ V4 U' }0 d2 b
  91. #define   LPDF_FONT_TIMES_I                 0x000A
    ! C0 L; x8 l8 r; @+ r5 W
  92. #define   LPDF_FONT_TIMES_BI                0x000B( e- G( G7 ?( W4 R
  93. #define   LPDF_FONT_SYMBOL                  0x000C' E2 X/ E% v* G" H# c7 A! x* v
  94. #define   LPDF_FONT_ZAP                     0x000D: l  M* p) t& H
  95. /*----- Graphis mode ---------------------------------------------------------*/
    ( F1 m- B& Z  k! P; @3 j& L
  96. #define   LPDF_GMODE_PAGE_DESCRIPTION       0x0001
    + T: C5 k& w$ s- f9 B  O- N
  97. #define   LPDF_GMODE_PATH_OBJECT            0x0002) g$ y* \7 y2 I* ^/ s7 x8 P2 m2 t
  98. #define   LPDF_GMODE_TEXT_OBJECT            0x0004, l' h; b/ @: Z8 l" l
  99. #define   LPDF_GMODE_CLIPPING_PATH          0x00084 _+ T) s% w8 W
  100. #define   LPDF_GMODE_SHADING                0x0010. J% s3 m2 [" W4 H# L5 X* i) ]$ w
  101. #define   LPDF_GMODE_INLINE_IMAGE           0x0020
    3 _* ?! p9 u7 _9 S, m
  102. #define   LPDF_GMODE_EXTERNAL_OBJECT        0x0040
    ' u6 d- i! z2 R* n2 R
  103. #define   LPDF_GMODE_INVALID                0x0080! F) _$ I/ H) U8 l* O
  104. #define   LPDF_GMODE_OVER                   0x0100! @! S0 A1 F2 S" {% A- u
  105. : V& W" D& g# {; F3 w  V
  106. #define OBJ_MAX_NUM     256
    ; c$ e0 f& ~* u& I: h4 N
  107. * ^2 U2 q. W( ?
  108. /* Page的结构信息是否需要树形结构 */) Z" Q2 c% Q0 f" h, n2 s) I- `
  109. typedef enum
    3 D/ \1 S: E2 K5 K& b
  110. {
    ; O, w- |4 z/ c0 u( E1 r: T% l% V- M
  111.     OBJ_info,
    : d% R2 y; e. j7 @5 @- l" O
  112.     OBJ_stream,
    $ ~* ?# Z9 m1 m, U6 b
  113.     OBJ_font,
    ' }$ ^, Z. `/ u" o, m
  114.     OBJ_page,
    % i5 ~" P: }. U/ Q4 I7 G, B) e
  115.     OBJ_catalog,- [: |2 @. j( e4 M3 f4 q
  116.     OBJ_pages,- L# I: ~- D2 U& N, h& W8 n( y8 ~
  117.     OBJ_image,: G# _) [; E! X3 A
  118. }LPDF_ObjType;
    + [2 {- e& s' a

  119. $ e: P* X: l& d3 K, U0 l
  120. typedef struct+ [& ?' M9 a. |! a1 R
  121. {- H6 a& v8 m" n0 B5 i% k/ }7 K
  122.     LPDF_ObjType objType;1 g7 w& D) J! q% Z( N
  123.     LPDF_UINT16 objIdx;
    5 ]; f" K% s' q
  124.     LPDF_UINT16 height;
    9 U2 b% I& D' ?7 ~6 c7 }4 F& h2 d
  125.     LPDF_UINT16 width;7 j' z) y8 w' o9 q' U3 e. U8 u
  126.     LPDF_UINT16 length;
      @8 C  F- W, s* h$ q" z0 G, u
  127.     LPDF_UINT gMode;. s/ d8 T; e8 A$ e* }  J
  128.     LPDF_BYTE fontType;
      h! F$ Y* }  l) s& ~% A  w$ i) ]
  129.     LPDF_BYTE fontSize;5 C5 T, ~+ G$ v9 F5 _. B5 ^$ `
  130.     LPDF_BYTE pState;
    8 q- k7 f8 W% `& _4 t
  131.     LPDF_VOID *doc;2 p5 N: w$ }3 S5 L3 J# w
  132. }LPDF_Obj;
    : i; e( \: i, A% O' C( l

  133. 2 ~# p; X# |# d) N
  134. typedef struct
    # u: U- k( k" J0 S  a& t
  135. {
    0 O& U- }# K5 @
  136.     LPDF_Obj obj[OBJ_MAX_NUM];
    ) B6 C' U) A1 g, Q' T) Z
  137.     LPDF_UINT32 offset;6 ?9 ^8 }8 E3 K! y+ ?: F
  138.     LPDF_UINT16 objNumber;$ u8 c+ o4 o1 J9 ]' {$ E
  139.     LPDF_FILE file;: S# v( Q9 z/ Y8 M% y0 Z! C
  140. }LPDF_Doc_Rec;' T3 i* v9 p* c& {. y, v
  141. : c0 g8 Z/ m; }0 O4 a: j" b
  142. typedef LPDF_Doc_Rec *LPDF_Doc;
    ! Y2 e( ?1 ~$ |! r
  143. typedef LPDF_Obj *LPDF_Page;
    ) D% n+ w" r$ r' T0 A; b
  144. typedef LPDF_Obj *LPDF_Image;4 W, s/ M1 }7 y. V8 B+ u: B
  145. extern const char *font_list[];' U3 v! A3 v. f+ m
  146. /*----- LPDF Interfaces-------------------------------------------------------*/7 k7 H# z; b  s+ I0 H: _4 `* p) l
  147. const char * LPDF_GetVersion(void);; J2 x: V4 E3 h, m. w: f
  148. LPDF_Doc LPDF_New(void);
      G2 q6 @$ ]. t+ [  c
  149. LPDF_Page LPDF_AddPage(LPDF_Doc pdf);$ z( U3 z$ i" k5 k
  150. LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name);! d. M/ Z6 _+ Z. b  N5 n5 t
  151. LPDF_STATUS LPDF_Free(LPDF_Doc pdf);
    3 c+ P) z+ z! H
  152. LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode);
    ( p0 J) h9 k1 n& U8 e$ O
  153. LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,3 D+ R4 T9 R; S7 ~$ u" E
  154.                            const char *font_name, LPDF_UINT8 size);9 B9 V3 Y2 H' ~( b2 Q5 Q
  155. LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page);
    # r" z8 |6 ?; \$ E' B! b6 f
  156. LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page);
    2 ?$ j" [3 H, M$ w
  157. LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page);  Y5 D' c% t8 y, O
  158. LPDF_STATUS LPDF_Page_EndText(LPDF_Page page);; i% ^6 m/ i6 W$ \( ]5 z
  159. LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page);/ s0 M8 s) T. u) J$ C, a% u
  160. LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page);  Q2 W  l8 t/ Z2 W  X
  161. LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value);
    . Z4 Y- C% \  z6 j
  162. LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value);
    : g0 B- W" l3 c6 f' I
  163. LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text);; ]( z: T' b% z7 D  ^
  164. LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,
    : U: Q3 z" a( S* }4 c
  165.                          LPDF_INT x, LPDF_INT y);
    ! \7 U- s1 \/ w% F4 c+ i
  166. LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,   n- j5 D% z/ r2 K' Q1 l5 z0 F" [
  167.                          LPDF_UINT16 x, LPDF_UINT16 y,
    " h8 X: l/ O: m( |" U
  168.                          const char *text);
    # p3 L: \+ O, W- l  {0 s0 I% G
  169. LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page," g  |# F& `; S) U6 F' t" ?8 }
  170.                          LPDF_REAL r,: N3 r" q+ u0 J  t- N  W
  171.                          LPDF_REAL g,& P" D7 H1 H; V( A5 M' O! V0 U( a
  172.                          LPDF_REAL b);0 ]9 b. ~# m4 A# A  {! ]$ `0 b, V
  173. LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,. v) Z8 C- Q* I! T
  174.                          LPDF_REAL r,
    0 ^) I/ V* y. B9 N
  175.                          LPDF_REAL g,  T% h: R, b: Z7 @% ?3 T
  176.                          LPDF_REAL b);
    6 X( w2 `$ j' M% ~4 g$ N$ I
  177. LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,
    2 K0 G) j1 B" V+ n5 d. q1 ^
  178.                          LPDF_UINT16 x,
    # a4 N. U( K  ~) H9 K. }; R
  179.                          LPDF_UINT16 y);
    ' J) I8 m. {8 E: |8 Y/ i5 a6 |
  180. LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,
    ! U1 P2 L. C* Q. D- K
  181.                          LPDF_UINT16 x,
    # R3 \5 H4 r; R
  182.                          LPDF_UINT16 y);
    4 h5 T2 r# ]- k6 M. \. ^# K5 k7 l" m
  183. LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page);" b9 i' @2 n9 Y# G# i3 [
  184. LPDF_STATUS LPDF_Page_ClosePathStroke(LPDF_Page page);
    / Y3 G1 K; H- K3 J9 x( J
  185. LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,, f5 H0 K! z, Z$ [4 N* d4 _1 y
  186.                       LPDF_Image image," F8 M6 @4 ^& I8 l1 b/ l
  187.                       LPDF_UINT16 x,: @) Q% @$ C2 X$ Z1 n
  188.                       LPDF_UINT16 y,! s8 {5 q5 X+ D3 n) c/ [
  189.                       LPDF_UINT16 width,
    9 I' r4 Z+ c( V) {; [( M, ]' ^) m
  190.                       LPDF_UINT16 height);% R8 Q+ e7 {: O) r( A/ R% \/ @
  191.                                                                                        
    7 J1 ?3 y# u  z  n1 f# h
  192. #endif
    ; Q* u9 y7 X3 w1 a
复制代码

源文件如下:

  1. #include <stdio.h>
    ) l3 G( [+ v7 G. K( f( g
  2. #include <stdlib.h>
    ' y6 j% S; P/ b. `6 y2 e
  3. #include <stdint.h>0 [/ V: f+ |0 O) b
  4. #include <string.h>- q& o; ?- d+ M: Z" o' y+ l
  5. #include "pdflib.h"( S9 @$ p/ ?- r. o: I
  6. % A8 V7 ^! V8 A, b& V* J
  7. #define LPDF_INVALID_OBJECT                       0x10335 D9 P& g! [/ C! F& G

  8. " Q* t6 j' s5 ^' Q8 {7 J1 x1 w
  9. static char pdf_buf[512];
    . i" ?3 O" C  C0 @% u* b! W

  10. 2 f  f8 W4 o6 H9 B- p
  11. #define LPDF_VERSIOIN_TEXT          "0.0.1"
    & Q6 v  G$ a; p* t% `, M; `
  12. #define LPDF_FILE_HEADER_LEN        15
    4 J. }- o/ H6 ^# p
  13. #define LPDF_BASEFONT_NUM           141 R! |& U3 G2 R8 t
  14. const char LPDF_FILE_HEADER[] = "%%PDF-1.4\n%%\xAA\xBB\xCC\xDD\n";% }2 F  l% H" Q3 m% x% x
  15. const char *font_list[] = {1 O- `/ x+ `' y( t. k7 n
  16.     "Courier",
    ! n4 C' @  b5 z" b5 X$ t
  17.     "Courier-Bold",# r  `$ z' {1 s2 T9 W( ?" w
  18.     "Courier-Oblique",  y9 p2 N' g1 n& I( m
  19.     "Courier-BoldOblique",5 g8 Z9 j: b) N" t' f. _5 j) ]3 d; J% d
  20.     "Helvetica",9 O. ~6 p; e( S4 ]8 ?! w; n/ a
  21.     "Helvetica-Bold",/ S& S: ^1 {: T/ u/ V
  22.     "Helvetica-Oblique",+ |% I4 M9 N8 E8 M: S& K" w
  23.     "Helvetica-BoldOblique",
    3 o# {1 u- w2 @
  24.     "Times-Roman",: M, v& t/ ?0 O
  25.     "Times-Bold",6 _+ M3 P* B; B: m9 f4 K0 A3 N
  26.     "Times-Italic",
    % t; J; K, e7 z% j' K
  27.     "Times-BoldItalic",
      T3 o* w; q7 `; I. B+ e1 b
  28.     "Symbol",9 Z2 G$ w  e$ L! t- Z5 G" I7 }( x
  29.     "ZapfDingbats",
    - q+ Y; e5 }3 d, w8 N0 _  G: \- a
  30.     NULL
    7 B3 ^# }1 {$ U
  31. };
    6 x9 k' k7 a& y1 m; v4 G* g" W& A
  32. ) [0 E, o' q9 |' _; k2 ~

  33. / q% l( X7 G. l6 M9 a
  34. const char * LPDF_GetVersion(void)
    % L3 h' u+ k. s
  35. {
    ! c" ]( V4 X0 B, K" l* A! I
  36.     return LPDF_VERSIOIN_TEXT;
    % e$ D: K& U- P5 s$ q3 L
  37. }
    + J2 I/ D( ?0 ]# D/ E* {/ b
  38. $ \1 S" Q9 e- Q% B5 R% W7 r: l5 g
  39. LPDF_Doc LPDF_New(void)
    6 L" t8 q: K& W) [% m8 U( d
  40. {
    0 o2 `, L# j9 [' n* _/ Y" N
  41.     static LPDF_Doc_Rec pdf;
    , K5 I1 h, d* e6 Y; H
  42.     LPDF_INT length = 0, i = 0;
    3 ~5 b9 O( g/ }  U2 q+ h; M( d
  43.         LPDF_UINT writeBytes = 0;
    - N$ Y3 t7 q% M( B, v2 F9 `* @
  44.         FRESULT fr;2 D. A( `4 P. m: J5 `
  45.     % ?  i- ]) X  l* R
  46.     fr = LPDF_FOPEN(&pdf.file,"/tmp.pdf",FA_CREATE_ALWAYS|FA_WRITE);! F/ `* m, |( Y  S) {, d  e
  47.         if(fr)* v- j; i! ?/ P( b3 S5 G, D
  48.         {. _8 Y( |! x3 [5 ^4 |0 M, q
  49.                 LPDF_PRINTF("create tmp.pdf failed!\r\n");4 u+ }. a8 R/ ?+ o- k
  50.                 return NULL;5 z5 s5 c% g* b3 B
  51.         }0 n1 }+ I9 N; e$ [# j4 \; C
  52.     LPDF_FPRINTF(&pdf.file,LPDF_FILE_HEADER);   /* 写入文件头 */8 w2 g6 q& ^, c( S7 g
  53.     pdf.offset = LPDF_FILE_HEADER_LEN;
    % N1 w8 a6 F) @4 e
  54.    9 _% Y  N( v- B5 z
  55.     pdf.obj[0].objIdx = pdf.offset;# K( [( ?. }) P& [/ m$ Z2 P
  56.     length = LPDF_SPRINTF(pdf_buf,"1 0 obj\n<<\n/Type /Catalog\n/Pages 17 0 R\n>>\nendobj\n\n");
    ' ]2 K. {9 w6 w0 N4 C$ r
  57.     LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
    4 {4 ~* W  H* P4 b5 H- h3 R
  58.     pdf.offset += length;( f3 s+ n/ Z& w
  59.     7 H0 v( ^' l. m0 z" t1 ~: x
  60.     pdf.obj[1].objIdx = pdf.offset;4 K- ?7 [9 ~; V5 k! U- W* f
  61.     length = LPDF_SPRINTF(pdf_buf,"2 0 obj\n<<\n/Creator (light pdf library 0.0.1)\n"# h( o. q( v$ v! s  c* p& A
  62.                     "/Auther (anobodykey)\n>>\nendobj\n\n");3 G/ m* G5 A9 e3 p
  63.     LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
    . ~1 K6 g, N, }8 r/ G2 c
  64.     pdf.offset += length;
    , x1 K' f. t4 |, I, F
  65.     ; ]* Q: T# s( ^
  66.     for(i = 0; i < LPDF_BASEFONT_NUM-2; i++)
    4 f7 {2 x; d. ?1 t
  67.     {7 ~! d" x4 a/ E# v) N
  68.         pdf.obj[2+i].objIdx = pdf.offset;# H/ y, d- P5 J& U) x: o" f
  69.         length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"1 q7 }: x- i0 e0 B( Y
  70.                         "/BaseFont /%s\n/Encoding /WinAnsiEncoding\n>>\n"
    / N" n  C1 ~) t) h2 \& H4 E
  71.                         "endobj\n\n",3+i,font_list[i]);
    ! F5 d! Z" L: \- [8 ?/ l
  72.         LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
    3 I; q# E" x: E8 t
  73.         pdf.offset += length;# W5 b' ?. b2 j. l4 j
  74.     }
    ' t! ], C0 i; ~7 c; D8 U9 W0 d$ Y5 n
  75.     for(; i < LPDF_BASEFONT_NUM; i++)" \$ P& u" W3 ~, z) D
  76.     {
    ) X8 H4 Z+ Y- M
  77.         pdf.obj[2+i].objIdx = pdf.offset;
    ; o& G0 H- r# W% O0 `
  78.         length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"- b" K3 M0 W8 H3 a! n5 z, G
  79.                         "/BaseFont /%s\n>>\nendobj\n\n",3+i,font_list[i]);. w+ A5 k/ l, {4 g; x/ w! b
  80.         LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);
    6 ~  |' ?, T% ]3 C6 l: a( w# V
  81.         pdf.offset += length;# V) W. \3 ]4 d# ~2 B1 V
  82.     }6 [2 w6 ]0 ]& A% O' v. Q  s. |. h
  83.     pdf.objNumber = 3+i;
    . ?3 Y! c! v' l) J$ H# ]
  84.   
    . A- }) T6 u0 @, O1 f. e  X* u, {
  85.     return (LPDF_Doc)&pdf;
    + K( g3 D# t6 d/ t+ I) A0 Y, {
  86. }
    ( g- F  ^0 }3 M% t

  87. 9 }* F& U1 v  _) Q4 |' [0 c
  88. LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name)
    * A6 B/ ^" m" E; M% o( U
  89. {
    # r4 B: `; O( D8 i, H+ u2 ^
  90.     LPDF_UINT16 i = 0, child_pages = 0;4 c; N) A! \6 }, _) i) ^
  91.     LPDF_INT length = 0;
    6 G! S3 m1 O0 e6 P: F2 m
  92.         LPDF_UINT writeBytes = 0;
    " b8 G. W5 o. W3 H: z" T7 f0 Q2 ~2 [
  93. , \( ]& E& ~0 z2 O; F
  94.     pdf->obj[16].objIdx = pdf->offset;( M9 g' T* \+ g
  95.     child_pages = (pdf->objNumber-2-LPDF_BASEFONT_NUM)/3 ;$ {; _: ?: J% s6 v3 {& I2 q6 m; ^8 P
  96.     length = LPDF_SPRINTF(pdf_buf,"17 0 obj\n<<\n/Types /Pages\n/Count %d\n/Kids [ ",child_pages);
    2 F" Q, F. N" u3 f3 o' ]& E/ x# s0 V
  97.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);% t( C4 m$ E. Q: q/ M* f
  98.     pdf->offset += length;
    7 }7 Z  f& p& j' ~" ]0 y, D: ]
  99.     for(i = 0; i < child_pages; i++)
    : c: p. h; ^+ x& s2 K3 h
  100.     {
    3 _- L* ~" E6 Z5 i! ?: `" d
  101.         length = LPDF_SPRINTF(pdf_buf,"%d 0 R\n",18+i*3);% t! V3 k4 s3 e1 A
  102.         LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);0 u; `# t# r" m& L
  103.         pdf->offset += length;
    ( e2 Y$ E* N# N& i& X
  104.     }
      M. F* f# T; F; ~6 e1 n; P
  105.     length = LPDF_SPRINTF(pdf_buf,"]\n>>\nendobj\n\n");/ T/ c0 ]/ K: _! n
  106.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);* P3 i' C9 S+ k- s
  107.     pdf->offset += length;: I  ^6 n% I$ e) \4 E
  108.    
    / [7 l: }" c# d
  109.     LPDF_FPRINTF(&pdf->file,"xref\n0 %d\n0000000000 65535 f\r\n",pdf->objNumber+1);
    3 C) e+ d8 y9 s8 X* ?3 q' O1 r0 K- b
  110.     for(i = 0 ; i < pdf->objNumber; i++)7 }' a1 f8 i2 d# `
  111.     {" V3 C+ T4 @) |. c
  112.         LPDF_FPRINTF(&pdf->file,"%10.10d 00000 n\r\n",pdf->obj[i].objIdx);
    4 @1 a' I6 L) V4 t1 S* }/ {" C
  113.     }/ a* y: H, O1 a) A* m
  114.     LPDF_FPRINTF(&pdf->file,"trailer\n<<\n/Size %d\n/Root 1 0 R\n/Info 2 0 R\n>>\nstartxref\n%d\n%%%%EOF",0 m. z9 Q: \) K& {# g/ d
  115.                 pdf->objNumber+1,pdf->offset);3 r% K* {' [. {% h) \+ ?
  116.     LPDF_FCLOSE(&pdf->file);  e: j. ?# A& M9 x* N  T0 `6 L: z
  117.     LPDF_REMOVE(file_name);4 L% [5 u% T" j1 w1 ?  B3 @
  118.     LPDF_RENAME("tmp.pdf",file_name);
      r6 g7 V0 ~8 T
  119.     return LPDF_OK;4 E9 B9 d% p7 i  S- ~9 L9 J5 H8 }
  120. }: z3 L& P: Y0 T" p

  121. & R+ w0 F3 d1 m
  122. LPDF_STATUS LPDF_Free(LPDF_Doc pdf)
    6 x9 i. X9 A* P# j; K9 [! ^/ D  D1 a9 ~
  123. {
    ' s" n# b! U8 b. L2 p- J0 i5 ?
  124.     memset(pdf,sizeof(LPDF_Doc_Rec),0);/ {  C# \" N  C! ^4 V, w
  125.     return LPDF_OK;2 G; ^( ^$ A  f0 m- l
  126. }
    3 l+ l3 \$ x% u

  127. 2 w! C4 W( i" @" x
  128. LPDF_Page LPDF_AddPage(LPDF_Doc pdf), M+ G8 F& E0 P: p* Y
  129. {* u* c' A; b4 t9 y& r
  130.     LPDF_INT length = 0,i = 0;) M6 s/ R; G; n, {' H) ]5 i
  131.     LPDF_Page page = NULL;
    2 o9 a/ A* C0 u3 q7 V
  132.         LPDF_UINT writeBytes = 0;
    % b+ J) N! v; ~. _/ g. i
  133.    
    , k* p3 x) a" s  ^) c9 c+ s  L
  134.     pdf->obj[pdf->objNumber].objIdx = pdf->offset;9 P% z, K, K, a0 A
  135.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Page\n/Parent 4 0 R\n/Contents %d 0 R\n"9 T7 ]9 l; ?: c( h+ G
  136.                     "/Resources <<\n/ProcSet [/PDF /TEXT /ImageB /ImageC /ImageI]\n"! q( g6 y  i. S. v# R9 I
  137.                     "/Font <<\n",pdf->objNumber+1,pdf->objNumber+2);
    ; ^% H% d: h  \7 w, R
  138.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    0 Y. U1 N& w5 @% S
  139.     pdf->offset += length;+ I) {0 L- i1 l$ \1 C. {+ N
  140.     while(font_list[i])
    ! l+ C0 s2 \4 W3 J; [
  141.     {
    & d2 w3 _  S3 n: Z4 J
  142.         length = LPDF_SPRINTF(pdf_buf,"/F%d %d 0 R\n",i+1,3+i);" P+ o0 O) R0 Q; p. m, R
  143.         LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    6 q( c1 Y" [- T
  144.         pdf->offset += length;
    6 U8 G6 \2 f7 U3 z4 ]
  145.         i+=1;
    / ^3 o* g8 p) n5 J0 T
  146.     }% B7 n" ^" |: L$ P% V) v
  147.     LPDF_FPRINTF(&pdf->file,">>\n>>\n");
    : C6 {- ?& L% Y* d
  148.     pdf->offset += 4;% E- J* E$ d* h$ B$ v. |0 c$ T! G
  149.     page = (LPDF_Page)&pdf->obj[pdf->objNumber];
    : k( x4 v6 e4 @" l7 w
  150.     page->width = 595;
    0 A) o2 g3 Z) p; X: Z# V
  151.     page->height = 842;
    1 i2 u" M' g' _" V- P( V
  152.     page->gMode = LPDF_GMODE_INVALID;1 l0 S0 H" M5 F8 [
  153.     page->fontType = LPDF_FONT_INVALID;
    # `1 }# Q3 P: S' m7 F
  154.     page->doc = pdf;' f* {& q/ @6 E) E: O0 f, W/ d3 U
  155.     return page;/ p2 o) A8 l8 Z! Y
  156. }* ^; X( d! H8 N' y8 {7 ?9 r

  157. 8 h" p/ ^9 R% i" n' b! G
  158. LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value)) a& h! O. I9 [! A! _) }/ A
  159. {
    ' S0 u. o8 Z; S3 O' F! v; [
  160.     page->height = value;5 g9 {. G% u6 n1 `8 b
  161.     return LPDF_OK;
    9 g, p% v1 A% K! C  J6 F: W/ r+ i# J) N
  162. }+ V0 g* L) ^1 o/ s* ?! ]4 a
  163. LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value)
    * Y! [/ M: q) \
  164. {) m7 I, q$ I) u, p  M. y+ o
  165.     page->width = value;
    , ]; B( z) l! t; b& D) {" a
  166.     return LPDF_OK;
    " U6 Y! I  ?# w
  167. }. w1 ]  }% p0 E

  168. & Y& c0 A" Y& a- M  T' C
  169. LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page)9 B! \" Z: ~- ^$ Q8 J
  170. {
    2 L* w# u9 p: T) |. T" s1 h1 D! h
  171.     if(page)
    5 W. J0 ]! U2 x. @8 q' o
  172.     {
    ; d" {9 z( X& L+ D
  173.         return page->height;- \) @! K& P& h  b' R5 k+ U7 ~
  174.     }
    ; ?& m" N. E; y6 o& N9 }  i& M
  175.     8 N. b3 |9 A! m% E- T: g' y
  176.     return LPDF_OK;
    9 h: X1 x. U1 b# A  Z  x! A
  177. }
    $ q9 L, s. B2 f' b" }/ K& |

  178. # Z4 n# I0 o/ ?
  179. LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page)% u; A  C7 X: W. C: {) y9 G5 e. V% e
  180. {
    ; V, e# D: g0 g* s
  181.     if(page)+ U: A) V3 D: f/ U
  182.     {. L8 k* B: v" r: c. Z
  183.         return page->width;" f- }3 Z3 D+ k2 w- ^' A* r
  184.     }% }& z, \$ `$ y, T
  185.     4 d8 k) M# W, J
  186.     return LPDF_OK;
    ' u0 t% ~$ e2 X( H+ \" `# V/ k
  187. }
    % C9 Q( g# j# u, u3 t" K9 f
  188. 7 g: h) `% U6 I, p
  189. LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode), @( ~7 e& j! W" ^
  190. {! @" L. v$ J# G
  191.     if(!page)
    9 l9 t2 ~5 u! y4 r9 K$ s( I+ i
  192.         return LPDF_INVALID_OBJECT;# C* \+ V# j8 _4 b' V- w* @  v
  193.     if(!(page->gMode&mode))
    ' `7 P3 c1 v$ J3 F1 c
  194.         return LPDF_FAILED;+ k# p: m9 w) u( C1 u

  195. 1 D5 t+ W5 [+ P% h' p
  196.     return LPDF_OK;# H- [8 }* ]0 T: w, \& K
  197. }, ]8 s) j" C+ J' l( r
  198. 1 b5 U. q8 N7 z4 e' p0 N% d! B) k
  199. LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,) K% U% y1 L& W- B0 \# [+ L2 E9 r
  200.                            const char *font_name, LPDF_UINT8 size)
    6 `7 c: z. `, e" E7 }* o4 T
  201. {
    " F. G3 X# |) T  m( P
  202.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    2 ^8 N5 I8 [" @; @% H
  203.     LPDF_INT i = 0,length = 0;- e3 z% Y$ H: y
  204.         LPDF_UINT writeBytes = 0;8 N- b' S$ A  N5 I$ D, D
  205.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
    6 Z- C$ u" v) k4 ]& B0 t3 v
  206.     if(LPDF_OK != ret)( q# J" y+ J$ n: D
  207.         return ret;! R" f2 s* I  y% I# {: H
  208. ! o% t3 ^$ {! r! T# e2 i
  209.     while(font_list[i])
    # h* Y4 K" S# b" ]' D4 }) t9 C! ?
  210.     {
    9 M  @# P+ x% q; S1 d
  211.         if(0 == strcmp(font_list[i],font_name)); Q* O3 S! r& y' g3 S
  212.         {9 y1 d4 x. j2 A" h# ]# ^
  213.             page->fontType = i;( h* a/ r. I& p" _7 R5 s5 M
  214.             page->fontSize = size;, E! B  N1 D/ p+ J( i
  215.             length = LPDF_SPRINTF(pdf_buf,"/F%d %d Tf\n",i+1,size);
    ) F& l$ y4 p3 `  B  X
  216.             LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);/ O9 g/ V) N% s; r2 I% i$ d" }2 v1 A
  217.             pdf->offset += length;' S  A( `* i+ _) }4 v: \, M
  218.             page->length += length;
    - a" ^3 ~; L0 ]' b: X; |5 w3 x8 L
  219.             return LPDF_OK;" [" H' n! Q7 Y
  220.         }& s1 Q3 l4 g& s  u' ?- w
  221.         i+=1;
    - e# B; ?# i$ `, Z3 n
  222.     }
    % n0 d+ U* V3 L7 _; J
  223.    
    ) q" a. N' S; m5 q: z* K* E+ m- h  P
  224.     return LPDF_OK;8 j" s: u. m& U: R# [
  225. }" B- e1 P" Q( v4 V
  226. # K) e7 Q8 P( a/ U
  227. LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page)
    & }* k2 D& R. i" ]* ~1 R/ d
  228. {) p. G/ `+ D% C7 M6 ^' J
  229.     LPDF_INT length;
    , w3 A2 f) o6 k4 K
  230.         LPDF_UINT writeBytes = 0;
    8 D! J$ e1 a. \0 m
  231.     LPDF_Doc pdf = (LPDF_Doc)page->doc;  j/ C4 ]: o) u! i
  232.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_INVALID);- E/ q/ j7 z7 L9 }
  233.     if(LPDF_OK != ret)
    ! \3 r' }2 h9 M3 O' ^& U6 z  {4 v
  234.         return ret;
    1 {" J* d0 Q( `
  235.     / Y; P  M! H; G; y& ^
  236.     /* 对于每个page来说该接口只能调用一次即在GMODE为INVALID的模式下 */
    ; u( r. i* i+ e' d. S
  237.     length = LPDF_SPRINTF(pdf_buf,"/MediaBox [ 0 0 %d %d ]\n>>\nendobj\n\n",
    3 w+ i3 Y# {3 y6 Z+ E
  238.                         page->width, page->height);1 [% G( C- f# {: w5 R7 G; C# z, C2 o
  239.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    1 z9 o7 w3 e8 m4 G1 {
  240.     pdf->offset += length;: h' S3 c) B$ A, f" R. o& E0 }! \
  241.     pdf->obj[pdf->objNumber+1].objIdx = pdf->offset;
    4 J$ g) o( k4 _1 U* z$ r# M, d
  242.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<</Length %d 0 R>>\nstream\n",
    4 G, w1 E1 G' b9 V  ^* c9 v  [
  243.                         pdf->objNumber+2, pdf->objNumber+3);
    7 a: X" S2 g# S! l' h% s- X
  244.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);; }' N! k+ A1 A' P; I! i
  245.     pdf->offset += length;- P, r* N/ t7 Z2 X5 p: Q2 F  f0 r
  246.     page->length = 0;
    ! x0 d. M: L" d
  247.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;! H9 U9 j9 }. U1 u/ t- X# [! B
  248.     return LPDF_OK;* j/ S* ~, [5 a; R4 y) S/ V
  249. }
    7 E1 ~# h8 q4 A) _! z

  250. / \/ i  c3 U& p- ^. p) m2 o3 r
  251. LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page)2 x7 H% c5 U' m$ o
  252. {: d5 y. r. K9 J6 A4 B4 q1 c6 s
  253.     LPDF_INT length;
    3 V) o+ m5 U4 U+ V& `1 K7 W
  254.         LPDF_UINT writeBytes = 0;
    3 j% E9 D- e' H/ y+ p
  255.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    - [- Z, b' i, h! `% `( B
  256.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);" `  g% B+ K5 g- b, w+ O9 o
  257.     if(LPDF_OK != ret)
    7 D  ^( g* \, U5 a: H" x. z* `
  258.         return ret;, b$ P) i8 F4 B
  259.      /* 对于每个page来说该接口只能调用一次即在GMODE为PAGE_DESCRIPTION的模式下 */0 v, m" N1 a. o: _, j& d- ~
  260.     length = LPDF_SPRINTF(pdf_buf,"endstream\nendobj\n\n");; p$ e5 {7 M+ M# u& ^" ~" y
  261.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    $ U5 C% t0 g: K1 }, O3 h6 u
  262.     pdf->offset += length;
    $ \, b; P; O9 p, g
  263.     pdf->obj[pdf->objNumber+2].objIdx = pdf->offset;
      O" h/ q7 u0 g- G1 J* L* I
  264.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n%d\nendobj\n\n",
    4 ^# m' i5 r: P0 i
  265.                         pdf->objNumber+3,page->length);! e- q& Y, X6 S5 Q
  266.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    4 F. ]0 m* A' M# l
  267.     pdf->offset += length;
    ( l) a5 Y- D6 g' D1 e' @: [3 f- Z
  268.     pdf->objNumber += 3;
    / b1 d+ g" m! z" z
  269.     page->gMode = LPDF_GMODE_OVER;
      w8 R: J0 t, _  r6 R( v4 q6 ~# |: e1 l
  270.     return LPDF_OK;
    & |4 N, x7 m* e% v7 h
  271. }
    7 A2 [: a% v9 j. R. p$ M
  272. & z9 A; H) [7 W# s
  273. LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page)  u2 M4 E/ ^' f. s+ V1 Y3 v
  274. {- ~- `) C- Q; F3 f: E3 {8 d; _6 v
  275.     LPDF_Doc pdf = (LPDF_Doc)page->doc;# R7 a" t% Z% r  s
  276.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
    9 |) }$ H8 D/ b' F% [7 D( t* ^
  277.     if(LPDF_OK != ret)' j( Q9 B0 v* `( D# x
  278.         return ret;4 x0 S9 p: E7 N) U9 \
  279.     LPDF_FPRINTF(&pdf->file,"BT\n");8 p( Q. N7 l1 ~& g: G9 v0 c
  280.     pdf->offset += 3;
    * }8 P+ t& a/ T" s( G
  281.     page->length += 3;; f2 A, R$ `4 ?+ m9 w$ i
  282.     page->gMode = LPDF_GMODE_TEXT_OBJECT;6 q* L( i- k; y. _8 Q- r  t
  283.     return LPDF_OK;
    ! H) `& r% {' w* z9 A
  284. }- ^- ^4 _% g- ~0 z; H
  285. LPDF_STATUS LPDF_Page_EndText(LPDF_Page page)+ J1 ]2 }2 F# [; V, Q) d" e
  286. {
    7 t8 \$ F& X) h3 r* [! P) m/ t
  287.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    3 Y, k0 o/ B) \
  288.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
    / p! m& i, r5 h, k+ V2 x
  289.     if(LPDF_OK != ret)
    & s  d2 Q6 Y2 `7 ]7 m
  290.         return ret;3 s6 r/ r, `( V& c5 ]0 {
  291.     LPDF_FPRINTF(&pdf->file,"ET\n");
    ) [: P  b+ }! d' ^& k0 f: S
  292.     pdf->offset += 3;
    : H* I2 ]' |* j0 B# F( r
  293.     page->length += 3;; y( U+ c5 w" B/ F1 h4 X4 z
  294.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;0 Z' l# L7 O( B( D. k4 k
  295.     return LPDF_OK;
    ' t1 Z, f, j/ @! e9 t  C
  296. }$ v8 G% ?/ V0 s  G3 S2 J+ N
  297. 4 l5 S/ g2 Q5 n  Q6 R: S3 v8 E
  298. LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text)3 Z  F* i% J" E% X) E6 w' N& r
  299. {
    8 L; T+ p; r  j0 ?" t" U) c: I
  300.     LPDF_INT length = 0;
    & m2 U& Y4 {, S! T3 F
  301.         LPDF_UINT writeBytes = 0;) f8 Y, G5 Q4 h5 v
  302.     LPDF_Doc pdf = (LPDF_Doc)page->doc;3 a; m. K$ n/ i8 K
  303.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);. g0 M9 X0 t% ~
  304.     if(LPDF_OK != ret)
    ' ?  u( m' H  ^8 Q) H3 Z4 x: N
  305.         return ret;4 H- E- D* g' ]
  306.     if(LPDF_FONT_INVALID == page->fontType)% Z# g  a( [! H* [8 e
  307.         return LPDF_OK;
    2 i% p7 \2 f: j; s
  308.     length = LPDF_SPRINTF(pdf_buf,"(%s) Tj\n",text);
    ! T) ]* G' b7 X  G
  309.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    7 |' q. Z. p  k& U5 R: p
  310.     pdf->offset += length;
    . W3 T) N5 p! ~% ~
  311.     page->length += length;
      r" X. s; Z' U8 i; w* s* l/ a
  312.     return LPDF_OK;) y$ s" Z6 ?, m
  313.     9 y# v1 e; Y6 F" {" o* J1 N3 F# _
  314. }$ ?' R* Z# R. A9 N
  315. LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,
    3 @; D2 B: m" ?6 ?, y
  316.                         LPDF_INT x, LPDF_INT y)# g2 t$ x6 G* Z, [
  317. {
    & {* Q) e0 \7 `
  318.     LPDF_INT length = 0;
    3 j- j: U+ K& d, E( m" X
  319.         LPDF_UINT writeBytes = 0;
    + g* t! d9 [3 Z3 r+ n, ^; x9 {
  320.     LPDF_Doc pdf = (LPDF_Doc)page->doc;  a- @2 z- C$ n7 J
  321.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);' b- D2 K; N- @5 o
  322.     if(LPDF_OK != ret)
    " M. F! _; h$ _: o! [
  323.         return ret;
    5 \' X; i  I6 [! s1 T) D8 _
  324.     length = LPDF_SPRINTF(pdf_buf,"%d %d Td\n",x,y);3 E' p8 x3 K7 O( y8 j1 G1 ]9 a- f
  325.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);, `# Z: q; [* A" F/ }# T: N
  326.     pdf->offset += length;  t+ f5 ]) t4 `) m7 Z
  327.     page->length += length;$ x- c0 B# S) u5 u
  328. $ H. ^+ s& d2 N
  329.     return LPDF_OK;
    / o1 L- w, d1 o- c% F( Z
  330. }
    4 r5 q# h. ?5 ~1 p! k4 u1 I! ]
  331. LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,   R4 U6 N/ s3 [1 s: z
  332.                         LPDF_UINT16 x, LPDF_UINT16 y,
    % N/ W' n. S+ h+ o. T5 Q+ S" g& P
  333.                         const char *text)2 F, K( _) W6 i/ b7 [- y% i
  334. {
    : N- {. w9 {* j  A' u2 w
  335.     return LPDF_OK;
    # P! J" O, c. ^3 C" }- G& m
  336. }
    ; ~6 _/ L7 i- q  {, B2 Y
  337. $ a9 M5 j" `* [' i/ t
  338. LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page,6 R6 a  }! K3 A/ N
  339.                          LPDF_REAL r,
    ! b+ x% E9 m7 Y" F" |
  340.                          LPDF_REAL g,$ I, @: V' d# |
  341.                          LPDF_REAL b)! M: _5 b0 j# y8 E; b. i
  342. {7 c; M8 h5 ~3 n/ m( r8 x) }
  343.     LPDF_INT length = 0;! _' g8 r& n( G" g1 [2 R
  344.         LPDF_UINT writeBytes = 0;& X4 K* C6 j& W( J
  345.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    ; O. k' c; r' l- N, N6 x7 c2 b* H
  346.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
    ( Z, e8 s# _5 Z, p8 u
  347.     if(LPDF_OK != ret)
    # L( k! J& L" r' U" K; _2 Q
  348.         return ret;/ \, b( m  r) X5 b: F* q4 u1 X& u

  349. / f2 i& z" O1 @
  350.     length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f RG\n",r,g,b);; O0 }) @& g/ ~7 Y- \
  351.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    # i. m: n' F+ ^6 D$ P5 ^
  352.     pdf->offset += length;
    $ l- A! ~2 N  X  ~0 T
  353.     page->length += length;
    $ ~% X9 Y7 z0 R4 `9 _) U: a8 h
  354.     return LPDF_OK;/ c" [- i" J$ Q0 i3 T3 x) d$ s
  355. }$ ?7 y+ _/ O- h/ D. D% E( |: K& `
  356. 2 |: M2 ~4 L; z+ c% l4 g
  357. LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,# G0 j0 E7 c) _8 _7 P. w
  358.                          LPDF_REAL r,8 o% {# F1 h! b/ U; I* Q
  359.                          LPDF_REAL g,0 X* m- R. E( u- f4 ^
  360.                          LPDF_REAL b)
    ' U6 }2 {7 a; h7 f6 _% ~
  361. {; U, v, h; S% _; e' ]8 ]
  362.     LPDF_INT length = 0;/ A- Z$ P* @5 Z: H# V- b. }
  363.         LPDF_UINT writeBytes = 0;# {/ Q( i$ k2 W
  364.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    & \% `3 v9 z' _2 V( z9 R, c
  365.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
    , H. G( o1 Z0 g9 w8 A) U
  366.     if(LPDF_OK != ret)
    3 ]: x, g+ K3 q# E
  367.         return ret;% C7 ^" A0 S) h" o9 {, _
  368. ( m1 j; Q1 J( K; x6 }
  369.     length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f rg\n",r,g,b);  t, Q9 m4 F; p; P& r1 S
  370.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    6 D& k/ L- A+ V7 A- \( s8 V" I( S1 D
  371.     pdf->offset += length;
    - m! H* V, P# {) X
  372.     page->length += length;, G6 z; Z$ a3 c- `' k8 b4 a
  373.     return LPDF_OK;
    7 T0 D- e  m8 W+ p' }8 ]/ t* m
  374. }6 k# A+ q# z8 y3 F- e# F9 X+ j
  375. LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,
    . I& I! R' {5 V# A8 n) h
  376.                          LPDF_UINT16 x,
    $ `9 L- [! H" _! j: U+ n0 F
  377.                          LPDF_UINT16 y)
    / T+ F- t0 ?( @2 K& U  Q+ x! S
  378. {
    $ K/ t# B% o4 T1 R* x8 V( Z8 W
  379.     LPDF_INT length = 0;
    5 `- C4 x2 Y. G$ o, e3 Y* q
  380.         LPDF_UINT writeBytes = 0;
    - y; U" u4 \3 W$ l6 ]2 s6 J
  381.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    # E4 s& w5 a/ c% i. N; }
  382.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION|LPDF_GMODE_PATH_OBJECT);8 i5 V5 H0 @2 L) R
  383.     if(LPDF_OK != ret), e" B$ C  p3 `4 `" L1 _* z
  384.         return ret;' ?( y9 \& ]" I2 n/ M& w3 p0 v5 V+ O
  385.     length = LPDF_SPRINTF(pdf_buf,"%d %d m\n",x,y);
    - F/ d/ [6 G1 S; F( @
  386.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    4 D$ o; b) `3 G: S3 T' b
  387.     pdf->offset += length;7 S3 m! n1 X) L4 c+ k" U
  388.     page->length += length;
    1 |( T" _" T; c- a; \7 v, ]
  389.     page->gMode = LPDF_GMODE_PATH_OBJECT;. L. A! t( }1 g3 i" r
  390.     return LPDF_OK;
    : @5 D0 t+ x4 b5 v2 U2 u: v
  391. }
    0 ]( Z/ I3 V4 d. p# Z
  392. LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,# Y' E/ d8 n1 r8 f9 \; e
  393.                          LPDF_UINT16 x,( d7 I7 J( H- J% r
  394.                          LPDF_UINT16 y)
    6 a0 B( _# E0 {7 a& _5 h
  395. {
    1 g. G% _- o5 @, x- x) g# Z1 }
  396.     LPDF_INT length = 0;
    0 U5 p# k: E1 J* R
  397.         LPDF_UINT writeBytes = 0;
    & i2 N. c( Q  T: b
  398.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    ( F/ i2 m( T7 r
  399.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);
    2 L2 j# x! I2 a5 u, ?; g
  400.     if(LPDF_OK != ret)
    8 f$ ^- O( p5 g' Y
  401.         return ret;
    6 p* G1 B' C  n# q5 V: `  ]
  402.     length = LPDF_SPRINTF(pdf_buf,"%d %d l\n",x,y);7 y2 O3 z3 Q7 @
  403.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    4 _2 L4 t  @6 C* K8 z/ t: P
  404.     pdf->offset += length;
    , Z: b. w" Y7 t4 p/ J0 q
  405.     page->length += length;
    : C; e' O% P! N8 }
  406.     return LPDF_OK;
    0 k- H  B2 v+ V  d* V
  407. }& l* [  D( }* o5 |! d
  408. LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page)1 f7 h! ?8 D+ j% t
  409. {
    3 ~6 b7 f# S- A3 ]+ k/ J
  410.     LPDF_Doc pdf = (LPDF_Doc)page->doc;: E" ]- S. ^) m2 O2 I
  411.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);
    : @( @* z; Z# f5 k6 ]# A0 I8 a
  412.     if(LPDF_OK != ret)
    ! J# N1 F- c( h" t* K
  413.         return ret;; R9 ]/ _% o7 z
  414.     LPDF_FPRINTF(&pdf->file,"S\n");
    8 s: v, [' `5 c4 b, a4 Q
  415.     pdf->offset += 2;' K  P- ]" v: q  v' M$ i+ L
  416.     page->length += 2;
    1 m  M6 ^( U/ U
  417.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;
    . @+ i; |# P" A- F' V/ F
  418.     return LPDF_OK;
    + J! M' }: D. Z& @
  419. }5 w! h. |. O: Q( @# A" ]9 a" ]1 D+ |
  420. LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,
    % C" ^3 J% d$ X) R* H, `! e
  421.                       LPDF_Image image,: l9 d; J: H$ Q) [/ ?
  422.                       LPDF_UINT16 x,8 e* Y3 L3 s( d- t
  423.                       LPDF_UINT16 y,
    4 M) i/ m* w. y1 `: b0 R
  424.                       LPDF_UINT16 width,
      n, F; j# F2 r5 w& |) j# I
  425.                       LPDF_UINT16 height)
    1 p& m6 ]% V) p+ t! k) b, S
  426. {
    + z. O% n) R% Q( E  v! ~3 ?$ E
  427.         return LPDF_OK;
    ' u0 G, O% F4 x
  428. }
    % }# [4 U% W8 v8 I2 S7 V7 g
复制代码

对于pdf文件结构可以去查看pdf参考手册,这里我看的是pdf-1.4参考手册,该库的测试代码我是在基于LPC54608库中的sdcard_fatfs示例改编的,同样适用于STM32,关键代码如下:

  1. pdf = LPDF_New();
    ; T" T) E+ Q5 C
  2.     page[0] = LPDF_AddPage(pdf);% `& P2 J5 v' C0 m" H' E
  3.     LPDF_Page_SaveParams(page[0]);
    ; p* f/ h+ [; B5 D& M1 }
  4.     width = LPDF_Page_GetWidth(page[0]);# h, n" L! T0 j1 p$ E4 r
  5.     height = LPDF_Page_GetHeight(page[0]);
    ( d: y  A3 O7 y: ~( N4 H3 I; m- O
  6.     LPDF_Page_SetRGBFill(page[0], 1.0, 0.0, 0.0);
    . n- E+ R5 R( ~: s8 j9 c6 _& l
  7.     LPDF_Page_BeginText(page[0]);1 I) K3 \8 r9 t3 P- ?1 ~
  8.     LPDF_Page_MoveTextPos(page[0], 50, height-20);
    , G- c# o& p( H0 {  e
  9.     while(font_list[i])0 T4 c- x. O" e
  10.     {
    . L+ E6 f4 u8 ]
  11.         LPDF_Page_SetFontAndSize(page[0], font_list[i], 24);
    7 q) y- T$ v  B
  12.         LPDF_Page_ShowText(page[0], "abcdefgABCDEFG12345!\043$\045&+-@?");7 f' q6 m) a2 ]: f7 S% @
  13.         LPDF_Page_MoveTextPos(page[0], 0, -30);
    0 o* _+ q( x8 T4 x" C" h
  14.         i++;3 \+ f* |( M0 u, R- k' Z/ S. h0 i+ z
  15.     }7 [4 H6 T% g# D; r# k# Q
  16.         LPDF_Page_SetFontAndSize(page[0], font_list[0], 24);
    7 }9 B- W. ?/ j6 U* M5 _: x4 g
  17.     LPDF_Page_ShowText(page[0], LPDF_GetVersion());
    4 o0 X6 e  R5 v+ [) J* `( g& l' D. x' X
  18.     LPDF_Page_EndText(page[0]);
    ' U% m$ S1 {1 E' u
  19.     LPDF_Page_SaveContext(page[0]);
    % o: r: e1 i7 e* G) b' s/ M4 ^/ j
  20.     page[1] = LPDF_AddPage(pdf);# W8 F9 c( r* z6 N. o
  21.     LPDF_Page_SaveParams(page[1]);8 _7 w9 i1 p6 ?: ^6 }9 B
  22.     LPDF_Page_MoveTo(page[1], width/2-50, height-200);
    3 F/ G7 ]% w0 @# u' \$ V' G( E. P. h
  23.     LPDF_Page_LineTo(page[1], width/2-50, height-300);0 L" X0 D, n, J, Z2 T3 Q, n6 A% P
  24.     LPDF_Page_LineTo(page[1], width/2-50+100, height-300);! }! w' v2 \4 G% N* H8 G7 R$ t
  25.     LPDF_Page_LineTo(page[1], width/2-50+100, height-200);
    : D. e: c+ @* @# i7 q7 V% D
  26.     LPDF_Page_LineTo(page[1], width/2-50, height-200);
    ' U* s* V( N( o# w2 _1 X
  27.     LPDF_Page_LineTo(page[1], width/2-50+40, height-140);
      J, x: s8 j% C# u- g! n+ h. d# b5 _
  28.     LPDF_Page_LineTo(page[1], width/2-50+40+100, height-140);
    , q" y- v( \1 c& f" h
  29.     LPDF_Page_LineTo(page[1], width/2-50+100, height-200);
    4 q. p( r: C, Z5 O/ e* A
  30.     LPDF_Page_Stroke(page[1]);
    # N2 v: ?3 e5 N
  31.     LPDF_Page_MoveTo(page[1], width/2-50+40+100, height-140);
    + D. W$ b; c0 m4 N0 d" Y8 C- B
  32.     LPDF_Page_LineTo(page[1], width/2-50+40+100, height-240);8 T! B0 R6 D3 p, e, m
  33.     LPDF_Page_LineTo(page[1], width/2-50+100, height-300);( S  K2 R0 W6 B# s% R6 y
  34.     LPDF_Page_Stroke(page[1]);
      n  g5 A  G4 W6 [
  35.     LPDF_Page_SaveContext(page[1]);) ^- H) v2 u% _) A1 `
  36.     LPDF_SaveToFile(pdf, "/red.pdf");
    + F2 @: z- r  x3 U
  37.         PRINTF("\r\nCreate pdf file success!\r\n");
    0 e0 i- S; x3 m7 t- u) j" ~* N" u
  38.   
复制代码

代码很简单,生成了一个含有两个page的pdf文件,在第一页中用了不同的字体来显示同一个字符串,可以参考libHaru中的font_demo示例,第二页中是画了一个立方体图,下载代码到目标板,并运行该示例,效果如下:

无标题.png

pdflib库目前来说还是比较简单的,需慢慢完善,pdflib库代码放在下面

pdfgen链接:http://github.com/AndreRenaud/PDFGen

PS:更新为V0.04版本了# f/ a% I, I$ x# `: m" q+ a

更新说明: V0.04

  • 增加了SimSun中文字体
  • 修复了LPDF_Page_SetLineWidth接口中内容长度错误的问题
  • pdflib源文件以及测试文件均需使用ANSI编码,否则无法正确显示中文字体2 A3 F* V3 y. F6 @
7 s! n5 A/ i; I+ i; r' S3 u* N$ e1 ~

pdflib_V0.04.rar

下载

6.1 KB, 下载次数: 424

pdflib库

评分

参与人数 4 ST金币 +24 收起 理由
tanganrong-1584 + 5
g921002 + 8 很给力!
lemonjohn + 1 很给力!
wofei1314 + 10 很给力!

查看全部评分

4 收藏 22 评论149 发布时间:2017-6-17 23:03

举报

149个回答
kiki.zhang 回答时间:2018-2-27 10:19:19
anobodykey 发表于 2018-2-26 22:55; q# D: t- D$ V6 q
只研究了一点,现在这个版本可以添加图片的,你可以看下,添加图片也有好几种方式,弄了个最简单的 ...

3 D* S& z/ _, J9 o$ w- j' ELZ,我怎么没看到有添加image的接口,您的pdflib.c中LPDF_LoadRawImageFromFile也没有实现哇,您说的可以添加image,是哪里~LPDF_LoadRawImageFromMem这个是直接传入读到图片的buf么?有什么办法可以直接拿别的pdf中通过编辑软件看到pdf语法格式,拷贝图片的那段buf,直接添加到我自己的pdf中呢?
anobodykey 回答时间:2017-11-20 13:35:19
醉宇a 发表于 2017-11-20 09:33
/ b; @6 Q# O9 }' M首先谢谢你的回复和帮助。。。还有你那个更新的dflib_v0.04(可以输出中文)里面没有HPDF_UseCNSFonts(), ...

  o) @5 u; ]) Q6 b66楼附件有的
anobodykey 回答时间:2017-6-17 23:04:09
自己顶一下,
深谷幽泉 回答时间:2017-6-18 11:45:33
看起来很高端的样子,居然没人顶。不过,请问楼主,用MCU生成PDF文件这种操作会在哪种应用场景下出现?求分享~
weigr 回答时间:2017-6-18 15:47:15
有意思
6 G. Y5 z" r1 w. S
anobodykey 回答时间:2017-6-18 15:55:19
深谷幽泉 发表于 2017-6-18 11:45# m/ R8 w6 b4 p5 Y, z0 D* L
看起来很高端的样子,居然没人顶。不过,请问楼主,用MCU生成PDF文件这种操作会在哪种应用场景下出现?求分 ...

1 e/ C( Q2 d! @+ ?; ]& c这个我也还没遇到过,只是之前看到有人问这个,所以看看
pwdzsj 回答时间:2017-6-18 17:04:27
不错还挺好的
好吃好好吃 回答时间:2017-6-18 19:07:12
高手啊
netlhx 回答时间:2017-6-18 20:27:00
赞,楼主功力深厚
graycker 回答时间:2017-6-19 08:44:11
厉害啊,前几个月朋友让做个单片机生成pdf的工具我都没接
anobodykey 回答时间:2017-6-19 10:41:48
graycker 发表于 2017-6-19 08:44
* S  v2 b3 _1 v: X' K: d) o4 l9 |厉害啊,前几个月朋友让做个单片机生成pdf的工具我都没接

! |6 c! n+ p4 Y这个还只是一个简单的库,实用性还是差一些的
zero99 回答时间:2017-6-26 13:17:46
厉害了楼主~
我为电狂 回答时间:2017-6-27 16:27:22
ff.h在哪里呀,我的是keil4.73版本,需要手动添加吗
epochal 回答时间:2017-6-27 18:30:17
不错,学习了!
anobodykey 回答时间:2017-6-28 09:22:13
我为电狂 发表于 2017-6-27 16:27# |2 I3 s% V7 e) [# V+ l! Z0 q
ff.h在哪里呀,我的是keil4.73版本,需要手动添加吗
# u! c: F4 n& ]7 W5 o
ff.h是FATfs中的文件
我为电狂 回答时间:2017-7-10 10:00:04
anobodykey 发表于 2017-6-28 09:228 C) W. |7 a0 |+ j+ v5 \' L; Q
ff.h是FATfs中的文件

: `* T2 f1 U" L+ [0 y" I1 t嗯,这个画线能改变线宽吗

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版