请选择 进入手机版 | 继续访问电脑版

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

MCU生成简单PDF文档  

[复制链接]
anobodykey 发布时间:2017-6-17 23:03
本帖最后由 anobodykey 于 2017-9-24 14:09 编辑   {2 m. h, x, B8 T2 o8 S& G
, ]4 {5 Q5 F' R7 ]; c

主机环境: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__
    0 q# ?. u  v1 ?- ?  K
  2. #define __PDFLIB_H__! b) b" O/ ~2 f( I2 p* k4 b( ^
  3. - `! t: k& v. o7 T" I" g* z
  4. #include "ff.h"
    $ v: i- S, G& v% i: h
  5. /*----- standard C library functions -----------------------------------------*/
    ; U  V) k3 _3 I  a/ Z9 h! O9 y

  6. ; |( w. E) ~  J. m- ?3 Z
  7. #define LPDF_FOPEN                  f_open
    ; M6 d) c8 n$ V9 w, p: Y
  8. #define LPDF_FCLOSE                 f_close" S2 w6 a' p: B  u
  9. #define LPDF_FREAD                  f_read
    * V5 z" Y4 s3 e4 v* o& {+ ~
  10. #define LPDF_FWRITE                 f_write
    , J( M( H' u3 m# Y) ?- @
  11. #define LPDF_FFLUSH                 f_sync! i3 n- @( M- t
  12. #define LPDF_FSEEK                  f_seek: m- r. T) ]& ]# b
  13. #define LPDF_FTELL                  f_tell' x: H" H, l: f: C
  14. #define LPDF_FEOF                   f_eof
    ) D6 B* Y. e% g8 C# _
  15. #define LPDF_FERROR                 f_error- R# |# B& l+ o3 e. Y) v' b
  16. #define LPDF_RENAME                 f_rename
    3 v7 I- l9 P7 Y: B" L; P# w
  17. #define LPDF_REMOVE                 f_unlink: b% ^" V. K5 x- X2 y% W
  18. #define LPDF_MALLOC                 malloc% w( K  U) X! k; l9 R2 N
  19. #define LPDF_FREE                   free+ e7 R2 P! ~- K
  20. #define LPDF_FILE                   FIL
    % Z! O' k6 g) S$ A4 |7 m& \& [2 x
  21. #define LPDF_TIME                   time% f, ]# J2 Q# |, `* i; n
  22. #define LPDF_PRINTF                 printf( J% n" ?$ J, E" X3 g; @, O5 r
  23. #define LPDF_SPRINTF                sprintf
    7 Q' k% P, V& _/ y6 z& C
  24. #define LPDF_FPRINTF                f_printf. d2 M: S0 N7 Q( A' W1 W( }- |
  25. #define LPDF_VOID                   void2 G+ i" g2 N8 t2 w" M2 Q+ C
  26. #define LPDF_SIN                    sin: h) [' n6 {2 c! j, r1 G
  27. #define LPDF_COS                    cos
    ( Z5 X8 T. z( b0 E0 V) p
  28. ) p* [( [% Z2 M. v- ~* C$ m5 M
  29. /*  native OS integer types */
    ; Q/ r, K; r* U5 L
  30. typedef  signed int          LPDF_INT;/ |' F8 Z( l% t+ ^9 R! C
  31. typedef  unsigned int        LPDF_UINT;, }& g8 c2 E4 ^
  32.   F3 b+ Z- U0 v9 S: O- T+ k

  33. + \1 x% F- x) J+ X
  34. /*  32bit integer types: l+ i' {6 O5 _# h( J; u' n
  35. */
    ' ]- `7 e0 |8 K
  36. typedef  signed int          LPDF_INT32;
    ' ^# F% E, {8 w/ ^
  37. typedef  unsigned int        LPDF_UINT32;
    % `0 @% A! u% ^0 u' a
  38. & |1 K( ^7 j3 [% x1 Y* t( G; a% P

  39. ) J; d6 y+ u; [3 T- S! `7 ~# N+ }
  40. /*  16bit integer types  m/ @" q. ]% V/ |% A0 e
  41. */
    5 E0 J, V  A7 d3 T. i
  42. typedef  signed short        LPDF_INT16;/ @% V1 S/ Q5 g9 P% c+ I
  43. typedef  unsigned short      LPDF_UINT16;
    / \" u5 a2 v. g% a. [
  44. 9 C1 l5 i! O; S/ D/ X7 E/ n. O3 ~
  45. 5 c6 C  v! R! O' E, N
  46. /*  8bit integer types
    + A. T/ z' G' J' Z, ^
  47. */7 i& F, w; e& B( `
  48. typedef  signed char         LPDF_INT8;
    : X* @1 g! v0 X/ T/ }# j/ i
  49. typedef  unsigned char       LPDF_UINT8;) O4 I' S, g/ C& a& e8 i2 d; z
  50. ) R: a% _& l- c5 J) e2 m! \  R
  51. % p) C( C* D: \' m
  52. /*  8bit binary types
    3 S* _9 W2 s8 ~0 ^! N2 Q& L4 c2 h
  53. */- c& F. x/ E4 {8 I) l% J7 \3 w) n
  54. typedef  unsigned char       LPDF_BYTE;
    5 V/ M4 E# |. Q, T
  55. 0 c# G- l# F& ?2 [' P2 D" W, P, a8 w
  56. 8 H! D% E4 `1 H
  57. /*  float type (32bit IEEE754)
    , D2 a8 Q0 \) B
  58. */* b! c3 W: d3 W0 l4 k
  59. typedef  float               LPDF_REAL;; B; }! K0 T% L, p# T! z
  60. " u) K5 D, R; H! D1 I- ?4 S& M
  61. ; C# r* n! K* X4 D' y& N
  62. /*  double type (64bit IEEE754)9 B( L7 `5 I( e
  63. */8 W* K  X) q( B9 s! \4 J
  64. typedef  double              LPDF_DOUBLE;
    ) E  P0 S$ f/ x+ V, H; n1 r

  65. - q3 ]/ [7 S* b' q  Q

  66. * w1 ]& b+ t3 |9 [( o1 J
  67. /*  boolean type (0: False, !0: True)1 }/ \; Y1 P. N- X" e) H
  68. */
    $ r  R, h7 l# {5 f. {5 [. b
  69. typedef  signed int          LPDF_BOOL;
    / |" e, |2 h& g; [! K6 d

  70. / b6 Z8 t) S# F' G& t. {8 d: a
  71. ) R4 {" X$ e, y2 b; a
  72. /*  error-no type (32bit unsigned integer)" M' o% q% y/ ~4 F' S
  73. */: r1 V0 H" J1 T0 d
  74. typedef  unsigned long       LPDF_STATUS;
    4 a/ G" t4 q) k# R& i* d

  75. 6 t9 \; \  y: {% G0 ]& m
  76. #define LPDF_OK                     0
    & B" G. a% e; d9 W- ?8 k9 m
  77. #define LPDF_FAILED                 1. ]3 P% N, _) k# B0 `
  78. : G' n1 Z: W0 h7 g+ o* ~( U
  79. /*----- font state -----------------------------------------------------------*/+ L5 E6 H. Q2 p" g* `8 A; x8 _5 x0 e
  80. #define   LPDF_FONT_INVALID                 0x00FF7 n& _8 S. _+ r0 \
  81. #define   LPDF_FONT_COURIER                 0x0000
    6 f* }0 l( O: U; s; M
  82. #define   LPDF_FONT_COURIER_B               0x00017 |5 k4 ?% Q2 X$ e8 e  H2 q
  83. #define   LPDF_FONT_COURIER_O               0x0002
    8 s' C- E" v4 h2 F
  84. #define   LPDF_FONT_COURIER_OB              0x0003
    * n) Q  N+ F; T' x: g8 J4 {
  85. #define   LPDF_FONT_HELVETICA               0x0004
    , h  \( M3 j6 O1 h/ {4 ~' O
  86. #define   LPDF_FONT_HELVETICA_B             0x0005( x) O3 l: A8 Z! Y4 J' t. ?( W: K
  87. #define   LPDF_FONT_HELVETICA_O             0x0006
      J5 W; \: ?3 |& X6 y5 a  W8 B0 q; X
  88. #define   LPDF_FONT_HELVETICA_BO            0x0007& Q/ Y% I0 A) O% Q/ e: v- H6 J' P
  89. #define   LPDF_FONT_TIMES_R                 0x0008
    0 X0 B  w6 F8 e, g7 V% J6 n8 ?0 o
  90. #define   LPDF_FONT_TIMES_B                 0x0009& u$ r; i4 @/ E
  91. #define   LPDF_FONT_TIMES_I                 0x000A4 B8 O$ B9 A* u+ H* |' `' o
  92. #define   LPDF_FONT_TIMES_BI                0x000B$ u# |7 O+ m5 H8 |3 E
  93. #define   LPDF_FONT_SYMBOL                  0x000C
    ; T9 {0 H+ f0 D$ f$ V
  94. #define   LPDF_FONT_ZAP                     0x000D4 e1 h1 [5 H7 t! p5 X& x* y
  95. /*----- Graphis mode ---------------------------------------------------------*/
    ! K0 ?- c7 \: N+ l& u& i5 t' a
  96. #define   LPDF_GMODE_PAGE_DESCRIPTION       0x0001
    ) C! f( \' w. m" i. S
  97. #define   LPDF_GMODE_PATH_OBJECT            0x00020 C5 B% @- P* S) ]6 \' o4 h
  98. #define   LPDF_GMODE_TEXT_OBJECT            0x00044 \* X0 ~; G8 t# L: p
  99. #define   LPDF_GMODE_CLIPPING_PATH          0x0008! v. ^% \6 g) I  t) l3 m# q; _
  100. #define   LPDF_GMODE_SHADING                0x0010
    9 G2 o4 L1 i- z7 l) l, s
  101. #define   LPDF_GMODE_INLINE_IMAGE           0x00205 |, l1 @. d; l
  102. #define   LPDF_GMODE_EXTERNAL_OBJECT        0x0040
    & a/ i; h  L0 ^9 W2 X
  103. #define   LPDF_GMODE_INVALID                0x0080" L5 ^3 y$ I; i3 g. |8 b+ C6 u
  104. #define   LPDF_GMODE_OVER                   0x01004 b1 U0 r9 Q4 E4 A
  105. & E4 x4 k$ \3 e3 x
  106. #define OBJ_MAX_NUM     256# I4 ]: ^+ V$ G8 |

  107. ; i2 _; U* G- u3 S
  108. /* Page的结构信息是否需要树形结构 */1 J1 i6 ?& F2 G- i( B1 d9 a: x
  109. typedef enum
    6 z* k' c) A% L# ^4 N
  110. {
    5 l0 k# W$ g0 R
  111.     OBJ_info,. x. A- V2 _0 K. D
  112.     OBJ_stream,+ w8 _9 Q! N- O# Z" j* p
  113.     OBJ_font,
    8 b, N/ N6 _: |1 o" q: }0 l0 {
  114.     OBJ_page,
    2 d) n) j& i6 [
  115.     OBJ_catalog,
    + k  B" ?2 S, ^: J  g5 r2 D
  116.     OBJ_pages,
    * K' n8 x/ k9 M% N+ f- p
  117.     OBJ_image,  I# g/ V& y4 p4 D  P+ p
  118. }LPDF_ObjType;
      [: h8 |3 l* E7 Z4 J

  119. 1 t7 Z: {3 J; o( \
  120. typedef struct
    5 G+ A3 Y, H' o( M8 k; t
  121. {1 {5 s. l" A$ e
  122.     LPDF_ObjType objType;2 q  `& a; c  G  M# t# B: c
  123.     LPDF_UINT16 objIdx;" D& V4 \  ]+ m: a5 f; A* @8 c+ J
  124.     LPDF_UINT16 height;
    & X# @" c; K5 _& n& F3 c. Y! u) G
  125.     LPDF_UINT16 width;) k; b* l# n# m# N: y4 n
  126.     LPDF_UINT16 length;# N; Q" R0 j# C3 m
  127.     LPDF_UINT gMode;
    . w, O7 }& h" j1 `3 Y/ X2 x
  128.     LPDF_BYTE fontType;
    $ V' H4 L8 }: a# @/ c. W$ T
  129.     LPDF_BYTE fontSize;
    1 |' q5 I& @! V2 O: m. u4 f- Z: {
  130.     LPDF_BYTE pState;
    " s3 _* [+ E# x) s0 P- t
  131.     LPDF_VOID *doc;
      j& F0 z, h1 {& w7 c
  132. }LPDF_Obj;1 i  J* s3 c/ b8 @
  133. ) @2 x3 [) i- i& p: C3 z6 {5 Z; \
  134. typedef struct0 a; K7 r# [- J
  135. {  C( |( x( D' G: S6 `
  136.     LPDF_Obj obj[OBJ_MAX_NUM];
    , ^1 t* o- Z6 i, V7 p
  137.     LPDF_UINT32 offset;: [1 S9 R; V; s1 v  k
  138.     LPDF_UINT16 objNumber;) H' z) P% g. ]- v- X& ^1 p- T
  139.     LPDF_FILE file;% \- u. |) Q1 d3 \$ G
  140. }LPDF_Doc_Rec;( b- J& y" V% U; M. M/ f2 k8 F

  141. $ c+ k3 H6 b  k
  142. typedef LPDF_Doc_Rec *LPDF_Doc;9 X: b- ?: v+ S0 o( C1 ^; n0 c2 Y
  143. typedef LPDF_Obj *LPDF_Page;
    4 P* B$ A2 S8 R+ r
  144. typedef LPDF_Obj *LPDF_Image;
    ; s  X( X9 W5 `0 l& q& q
  145. extern const char *font_list[];; a1 `5 w5 w2 P0 a; L( y- n* N  A
  146. /*----- LPDF Interfaces-------------------------------------------------------*/
    2 ^) F, l0 h/ W: r: w
  147. const char * LPDF_GetVersion(void);; Z5 o( n) `) N% K3 ~
  148. LPDF_Doc LPDF_New(void);* r& G# G* l; w  Y. g1 A
  149. LPDF_Page LPDF_AddPage(LPDF_Doc pdf);5 N8 c* H) @& E& B# k1 \
  150. LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name);
    ) ~9 s7 k- |2 g* v# d9 c' J/ ?/ i) Q
  151. LPDF_STATUS LPDF_Free(LPDF_Doc pdf);) A+ \: s. h6 R( E% L2 C9 A" l
  152. LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode);
    * \+ f: t" J* C6 G) h# a; U9 Q1 @5 f- i
  153. LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,3 _: C$ e9 `9 \' ~0 W
  154.                            const char *font_name, LPDF_UINT8 size);  F9 Q4 |' }* O& Q# e7 S" P/ a
  155. LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page);
    9 p& R/ I# }$ a1 C
  156. LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page);
    4 W0 @. h3 G( \8 w+ U% I/ ^! i( x+ [
  157. LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page);
    ; x5 f3 Z+ `  a- ?2 J
  158. LPDF_STATUS LPDF_Page_EndText(LPDF_Page page);
    . ]6 L7 G3 ]& S
  159. LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page);& G4 q1 T% b: `7 ~, ~
  160. LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page);2 X* B1 V) I9 L! X& Z
  161. LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value);. u8 |) @2 B) P" T8 h+ p
  162. LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value);
    7 {3 \3 I# K7 v# N
  163. LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text);
    8 |& m3 |: }/ i/ H4 O* i8 E# q( z$ k# z
  164. LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,8 L  y& s# R8 R
  165.                          LPDF_INT x, LPDF_INT y);# P4 ~; R9 ?- z4 Q6 a+ ]' I" F
  166. LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,
    " F+ w  j9 P# N" q- y6 W
  167.                          LPDF_UINT16 x, LPDF_UINT16 y,
    , g# h+ Y3 g6 j8 X7 I1 K0 X
  168.                          const char *text);
    + u2 J3 l4 {  \! e: f
  169. LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page,
    : Z4 @* @3 x. k$ y" T0 F' F
  170.                          LPDF_REAL r,
    2 z: v5 s* L5 E& _
  171.                          LPDF_REAL g,
    $ z& U+ m: x/ V, b$ |
  172.                          LPDF_REAL b);
    . f; J# }; |8 P9 Q: f% l% Z
  173. LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,: G+ i5 z% ?7 Z/ x) X, r
  174.                          LPDF_REAL r,7 t% s$ V! ]: o# |3 J9 Z* z
  175.                          LPDF_REAL g," w7 o! z/ T4 B! t8 u/ C5 g
  176.                          LPDF_REAL b);
    ( }) U6 H* ]1 G+ S# R
  177. LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,5 w5 V, Q, j- `5 A" d: u5 |
  178.                          LPDF_UINT16 x,
    4 X/ S2 H5 s7 j+ V) z; m
  179.                          LPDF_UINT16 y);7 T1 }6 ^2 b  G1 S: f
  180. LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,, o8 T1 S$ n( u* v7 x
  181.                          LPDF_UINT16 x,+ I7 b/ s# M$ a0 ]0 D' q# t* c' c
  182.                          LPDF_UINT16 y);& [' U6 ?: w& R3 u1 c6 n0 ?) A
  183. LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page);
    9 B/ S1 f( x9 Q+ l7 q: U8 I
  184. LPDF_STATUS LPDF_Page_ClosePathStroke(LPDF_Page page);
    ; C/ M, ]6 I$ T! k; r
  185. LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,* M" `$ }4 G2 ?0 v) p
  186.                       LPDF_Image image,
    , L1 Z" Z7 s# d* G
  187.                       LPDF_UINT16 x,
    0 B- U2 x; x' _$ R5 W1 {' d; n
  188.                       LPDF_UINT16 y,3 H. _8 @' a) B8 p3 V: |. v
  189.                       LPDF_UINT16 width,( j5 h" P" \5 T) G0 B7 V
  190.                       LPDF_UINT16 height);
    9 r$ z0 L" m% ?' D# S
  191.                                                                                        
    ) y+ t: X; ~; c& O+ h0 @
  192. #endif
    & o0 ?4 X. }& z7 n! F8 D* r
复制代码

源文件如下:

  1. #include <stdio.h>( c# u( V# J5 }; y6 I
  2. #include <stdlib.h>
    + T' ~! I% [8 V6 h, W& h
  3. #include <stdint.h>
    9 N7 V3 J, u% }
  4. #include <string.h>5 l9 E$ h  [  \$ e
  5. #include "pdflib.h"
    . p" y& i8 `# D5 e

  6. % W" x7 H5 g- v
  7. #define LPDF_INVALID_OBJECT                       0x1033
    % F& [' U% F* X

  8. & u6 M: e0 g5 ~  v, t3 C( x
  9. static char pdf_buf[512];8 R4 [9 n& R! W4 M3 r& _) z/ ]

  10. 9 [8 d9 C; T/ d
  11. #define LPDF_VERSIOIN_TEXT          "0.0.1"
    7 X" O/ J! L$ D- A
  12. #define LPDF_FILE_HEADER_LEN        15, E9 S7 i# o/ J0 J5 Y
  13. #define LPDF_BASEFONT_NUM           14
    9 t: @1 A2 _; `! z, L7 R( g
  14. const char LPDF_FILE_HEADER[] = "%%PDF-1.4\n%%\xAA\xBB\xCC\xDD\n";
    # x+ I' T2 x8 v) v! B
  15. const char *font_list[] = {
    7 W- \' H% j6 K9 S
  16.     "Courier",
    6 a6 J6 A3 ]6 o/ P. O
  17.     "Courier-Bold",
    % o2 `1 q+ v/ f5 {6 e7 r0 @! F
  18.     "Courier-Oblique",
    # j% ?; t6 L4 v# A. t+ [& `3 v) j
  19.     "Courier-BoldOblique",5 o8 H, t# P* \& F2 t- T
  20.     "Helvetica",) ?# g" p$ [) J: G
  21.     "Helvetica-Bold",
    % P/ k( U2 D& f3 t6 s$ f
  22.     "Helvetica-Oblique",% O3 \) B; ^8 y6 V
  23.     "Helvetica-BoldOblique",& N2 m8 T' N) N1 Q7 `( T3 M6 a
  24.     "Times-Roman",3 H! ]* N/ F0 v9 \! ~8 X
  25.     "Times-Bold",! Y3 @* ?6 I; D$ ~  ]; E7 M4 `
  26.     "Times-Italic",% w$ n! A6 Q3 E0 E' l
  27.     "Times-BoldItalic",9 z; J! U+ q5 J0 R2 A
  28.     "Symbol",8 s  j/ t2 S, I6 S* c4 ^# p9 ]3 r
  29.     "ZapfDingbats",
    $ [. l' ?3 c6 j$ M
  30.     NULL# r+ q! c; R8 i, h
  31. };0 u( m% Y- [1 i* E0 M5 B6 P# r) E8 x

  32. . u3 X# R: P5 w1 t& M$ E9 V) o1 P" f

  33. " A$ t6 f" A$ C& @
  34. const char * LPDF_GetVersion(void)$ }) y( ^4 h" U. Y1 P) i0 K/ J0 M
  35. {2 {1 z2 v" L; w% E
  36.     return LPDF_VERSIOIN_TEXT;8 V" S3 L4 Y3 o( z" D3 I9 W4 B
  37. }9 _8 ]$ w1 f9 w3 R

  38. 4 T1 Q6 X1 J2 \# j% T
  39. LPDF_Doc LPDF_New(void)# _1 P0 e( B9 \) ?  Z9 x
  40. {4 v0 @3 H( c% F9 g6 J3 r. Y
  41.     static LPDF_Doc_Rec pdf;
    # o: t; k4 A( B' s  e5 S
  42.     LPDF_INT length = 0, i = 0;
    $ e8 y6 l4 N; @; c! k; K
  43.         LPDF_UINT writeBytes = 0;
    ; J" L' r! n6 i* d" K
  44.         FRESULT fr;
    ; \- q+ z4 S4 r, }8 f
  45.     % t9 o7 ^( n2 X. t; |2 U% v
  46.     fr = LPDF_FOPEN(&pdf.file,"/tmp.pdf",FA_CREATE_ALWAYS|FA_WRITE);
    ! U# K9 H1 b& B. ~  v9 Z
  47.         if(fr)
    1 }$ V$ E$ d  _  @
  48.         {
    + O5 y# d$ [! |4 n$ k
  49.                 LPDF_PRINTF("create tmp.pdf failed!\r\n");
    + s( ?/ O. R% @3 j
  50.                 return NULL;
    . k( G3 h$ S1 |5 y9 H: b: t
  51.         }
    $ Q4 M/ {2 I5 d+ k4 m: [
  52.     LPDF_FPRINTF(&pdf.file,LPDF_FILE_HEADER);   /* 写入文件头 */
    * ]$ Q0 \* T8 G( ]
  53.     pdf.offset = LPDF_FILE_HEADER_LEN;9 A% J  Z# g' a+ X4 C+ g) ?
  54.    
    2 u! A' E+ t0 l
  55.     pdf.obj[0].objIdx = pdf.offset;
    0 s2 T: D' ~8 E) Q
  56.     length = LPDF_SPRINTF(pdf_buf,"1 0 obj\n<<\n/Type /Catalog\n/Pages 17 0 R\n>>\nendobj\n\n");
    ) o* |7 `1 D) ^/ ^6 F  }+ r
  57.     LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);+ i* w) l6 c: w7 M6 J3 L
  58.     pdf.offset += length;' ~. k: ~# k, l2 |# y
  59.     . L. q6 A! s! s+ N0 Q  X3 D# K# R
  60.     pdf.obj[1].objIdx = pdf.offset;( {* j' m/ v, h' _3 U  I
  61.     length = LPDF_SPRINTF(pdf_buf,"2 0 obj\n<<\n/Creator (light pdf library 0.0.1)\n"
    / T5 C' j9 w6 v: C
  62.                     "/Auther (anobodykey)\n>>\nendobj\n\n");
    5 ^% l$ I' T+ v3 n, I0 V
  63.     LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);: m7 _7 x8 j) i: _
  64.     pdf.offset += length;
    - ]: @$ @8 X0 W, Z0 \' u
  65.    
    8 y9 r1 F1 \- L" |2 P* w, u
  66.     for(i = 0; i < LPDF_BASEFONT_NUM-2; i++)
    1 `/ g( p" k5 r( }9 N! `* @* @
  67.     {
    ' i4 c5 b5 J* _5 r1 p, _
  68.         pdf.obj[2+i].objIdx = pdf.offset;( Y. [  [) C; {0 G' X# B/ }
  69.         length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"
    & t, A" H. b  ~: v7 `# ]5 F
  70.                         "/BaseFont /%s\n/Encoding /WinAnsiEncoding\n>>\n"5 H' p& r0 _4 z5 z6 M
  71.                         "endobj\n\n",3+i,font_list[i]);$ ]/ Z" {, I$ _' E9 N
  72.         LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);4 n1 o: v- H9 R9 T: i/ g6 j
  73.         pdf.offset += length;$ }) `- p: O  T8 I2 h; m$ D
  74.     }
    ( N6 n0 ]( ^- L
  75.     for(; i < LPDF_BASEFONT_NUM; i++)
    * x$ f) F* n8 z, G
  76.     {
    $ o/ C9 R9 U- _9 u3 M6 E# r- P
  77.         pdf.obj[2+i].objIdx = pdf.offset;
    ' Y1 {1 g' e* X: Y7 [3 U. H; p5 L
  78.         length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"/ Y/ @2 ?6 }" |5 J
  79.                         "/BaseFont /%s\n>>\nendobj\n\n",3+i,font_list[i]);" G: ?' }: G* H
  80.         LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);2 F8 I) C, k5 o6 _7 K$ D" g# O2 B
  81.         pdf.offset += length;
    / |$ o" F$ ^2 g
  82.     }
    , f% E" i3 d8 y& ~4 I' C% ^: P
  83.     pdf.objNumber = 3+i;4 G3 k0 y( u; u2 s* }
  84.   
    : `2 B( {; e( x; G+ s, {
  85.     return (LPDF_Doc)&pdf;
    0 I+ f+ X8 ]% \, a+ ]7 d) K- ?
  86. }) `; Y3 ?5 e% L; n: f3 p5 J8 x3 ?
  87. ! N/ Y* `0 X* [+ i! ]% O
  88. LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name)9 ^4 H# m# b. z3 z, }* h& K( J
  89. {8 j6 E% F; |/ s
  90.     LPDF_UINT16 i = 0, child_pages = 0;0 e! I' Z( q  I8 C5 V8 B9 f
  91.     LPDF_INT length = 0;) Y/ _$ A1 K  V9 |! J+ e$ e4 f
  92.         LPDF_UINT writeBytes = 0;" T6 {0 ]' t& n) R: t- B$ y

  93. / h! w" n6 I" P" L
  94.     pdf->obj[16].objIdx = pdf->offset;
    # x( {5 W( _. g4 Y: }# M* q. _
  95.     child_pages = (pdf->objNumber-2-LPDF_BASEFONT_NUM)/3 ;
    & O- T1 H0 c; T$ e1 N
  96.     length = LPDF_SPRINTF(pdf_buf,"17 0 obj\n<<\n/Types /Pages\n/Count %d\n/Kids [ ",child_pages);
    8 q1 Q4 ?# W) v; h3 v
  97.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    ! `& u' G; {/ K& b. P* f, l
  98.     pdf->offset += length;) t  l! U: }; f! x& F
  99.     for(i = 0; i < child_pages; i++)' N3 a* M+ e7 B' ~
  100.     {) O8 C3 K, d! i: i& A
  101.         length = LPDF_SPRINTF(pdf_buf,"%d 0 R\n",18+i*3);  e0 G2 |* ^' F- h
  102.         LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    , Q" J. Z- y" M) d' R( t( m
  103.         pdf->offset += length;3 h7 R; z7 k- q: t4 `, J
  104.     }% Q" ^" j' X5 U" q! z& N3 E# d  u' p
  105.     length = LPDF_SPRINTF(pdf_buf,"]\n>>\nendobj\n\n");
    # q) o0 h( Y. b, b, W
  106.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);% V) I" {! Z, e4 b& w. d# _% M
  107.     pdf->offset += length;2 p0 Q- j/ ?! @  [0 n2 B
  108.     7 a$ L: b# Y. A) @9 T
  109.     LPDF_FPRINTF(&pdf->file,"xref\n0 %d\n0000000000 65535 f\r\n",pdf->objNumber+1);( q2 u# X; O3 q
  110.     for(i = 0 ; i < pdf->objNumber; i++)
    / C  p/ l& t8 f  \! d) s% h# m
  111.     {
    6 {  ^0 T9 b+ _1 f
  112.         LPDF_FPRINTF(&pdf->file,"%10.10d 00000 n\r\n",pdf->obj[i].objIdx);1 m: _6 t! a# _; S! P& P
  113.     }
    , ?& G* _6 q6 N8 M# @# v6 R5 U4 n
  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",
    7 Q3 ^8 x7 y" J) K# Y  @
  115.                 pdf->objNumber+1,pdf->offset);
    . |2 W8 X5 K8 a4 r
  116.     LPDF_FCLOSE(&pdf->file);
    ! m* Y* A) s' R$ x8 c& h/ o) D
  117.     LPDF_REMOVE(file_name);7 T4 u* f+ G% A( E9 F) D
  118.     LPDF_RENAME("tmp.pdf",file_name);! V/ v% C( B1 m" I3 j* A* M- w
  119.     return LPDF_OK;
    / k( i* c4 ^+ O8 N% V$ I
  120. }
    # ]1 X  ~" y) m2 i; U+ d
  121. 2 w' b  A, z! {5 P: z
  122. LPDF_STATUS LPDF_Free(LPDF_Doc pdf)
    / g% `  `& e6 s: d
  123. {) V( ^" D. w& Y: j
  124.     memset(pdf,sizeof(LPDF_Doc_Rec),0);) |. i! D& d. ], w8 b
  125.     return LPDF_OK;! k# l) H* X. v% K* A
  126. }
    * v% u# |: m6 y6 [7 b* ?  |

  127. 5 ~$ D0 N' G8 z- V1 I* r
  128. LPDF_Page LPDF_AddPage(LPDF_Doc pdf)
    ; X+ x6 |( g& K0 Z* S
  129. {4 l0 i  y  H7 |$ _
  130.     LPDF_INT length = 0,i = 0;
    " N) B# q! H$ s" X
  131.     LPDF_Page page = NULL;
    ! T0 \% _8 g! q5 @6 w4 o
  132.         LPDF_UINT writeBytes = 0;
    $ [' X9 p+ c( h# A( f& e
  133.     / S+ H5 J1 W5 H% h! M
  134.     pdf->obj[pdf->objNumber].objIdx = pdf->offset;
    - S2 N3 u; A2 p# H
  135.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Page\n/Parent 4 0 R\n/Contents %d 0 R\n"4 f+ ~; `; ^3 ~2 W8 q
  136.                     "/Resources <<\n/ProcSet [/PDF /TEXT /ImageB /ImageC /ImageI]\n"( h7 _  F1 W* F
  137.                     "/Font <<\n",pdf->objNumber+1,pdf->objNumber+2);' Z* ~  s0 D. w5 n: s5 Q
  138.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);2 T1 c6 z- q- E
  139.     pdf->offset += length;
    $ y2 E% U4 ]- \6 U
  140.     while(font_list[i])6 i4 N' N( o; E/ ^0 I9 ^7 {
  141.     {2 `8 g- k2 y2 d: o
  142.         length = LPDF_SPRINTF(pdf_buf,"/F%d %d 0 R\n",i+1,3+i);9 k( \+ e; _( |$ H/ m
  143.         LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    7 [+ g' m5 ?7 ^! `
  144.         pdf->offset += length;4 ?2 p! ?' r3 g; ^$ b: B
  145.         i+=1;8 H+ V% J- m/ v( Z  ]% |
  146.     }
    % v4 @& n8 V. T  ?  U) h
  147.     LPDF_FPRINTF(&pdf->file,">>\n>>\n");! m4 o& o# f) P/ v. l+ I
  148.     pdf->offset += 4;
    + u- T( M( V3 Z9 O8 {6 X
  149.     page = (LPDF_Page)&pdf->obj[pdf->objNumber];, ?3 w! ^8 W7 |
  150.     page->width = 595;
    ; a# O  [8 }# r4 l& O
  151.     page->height = 842;
    9 T5 f9 e' Z( [8 r; k# N
  152.     page->gMode = LPDF_GMODE_INVALID;: w. d# s% v; B( {6 Q' N* L6 z" u2 n
  153.     page->fontType = LPDF_FONT_INVALID;& r! U& o5 o& ~* m
  154.     page->doc = pdf;0 h# [" o0 ^+ G
  155.     return page;) j/ O- a0 Q7 b- L" m" Y4 p
  156. }
    4 ?! p" B# @' r4 w7 p& p; R
  157. / `8 w2 ~* O  X3 u# k3 G
  158. LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value)
    . a5 z& Q( c' ?, f2 G. h6 J
  159. {5 Y6 b1 y; i2 g* ]4 r! l
  160.     page->height = value;
    2 e# @, H3 N  U; C& |& V& \1 g# _4 l
  161.     return LPDF_OK;
    9 W# Z. t6 S* H, N; Z) v4 Z
  162. }
    4 E1 S+ w0 z2 T  R5 g/ L1 _
  163. LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value)
    6 a: g5 R$ F3 \# l" p# |7 m) \
  164. {8 ~" I4 W5 X" k% ?4 O
  165.     page->width = value;8 k" g; s2 a& @( b3 W1 r
  166.     return LPDF_OK;3 n' l$ \3 O6 l6 c0 P
  167. }
    7 s; B9 |  m- {7 o( o" [

  168. ) `4 J8 P- b/ e9 F% }- a" y1 Z+ ~$ x
  169. LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page)
    $ u; U6 _4 Z, g% M# A, ^
  170. {
    + K! L$ r3 l9 M7 a0 Q
  171.     if(page), n& t2 [6 e1 z4 ^# O7 D: D* `
  172.     {& @# ^) ]: \& T. {& _  g# E
  173.         return page->height;9 w9 g7 \6 Y8 H; K$ T
  174.     }; c" f9 s; A9 }7 d
  175.    
    1 h: i" h; l0 c, m! H
  176.     return LPDF_OK;. F( ^# S" I$ {* n% u8 ]: i9 K
  177. }6 t/ v. u' V! ^
  178. " U3 x' H; Q* Z0 J
  179. LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page)
    / o8 M/ t5 ?. {- v5 T
  180. {) M% Z1 u' U8 ~- T# o" r7 O3 X$ G
  181.     if(page)
    2 Z& E; S& \: X" B/ D
  182.     {4 M; J- `4 z% L
  183.         return page->width;" ]2 G1 S: Q% y4 W2 d
  184.     }
    " L( Z) l; m+ G# ^6 h
  185.     6 u) P( k0 p* V1 O# b& S5 t7 H. u0 C
  186.     return LPDF_OK;
    2 }: w2 _9 T1 e  q" K9 k
  187. }
    $ H. ]8 p0 X9 U9 e$ f' g; w, y3 W

  188. % T" P! I. D/ |) ]
  189. LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode)! l# D8 e" T  e
  190. {
    # f5 K* X! q' J2 ]. L3 x1 W4 b
  191.     if(!page)
    # [9 m/ m* l1 h$ x; m% C
  192.         return LPDF_INVALID_OBJECT;0 }; G/ F4 t/ P* Z1 L& U
  193.     if(!(page->gMode&mode))7 Y" U5 `/ r0 @& C. ]1 J4 s
  194.         return LPDF_FAILED;+ B" e& d$ {/ N4 I& F

  195. . s$ _0 T6 J7 C) G% N+ F: {
  196.     return LPDF_OK;, |, ^4 A1 l7 f% t" j& W
  197. }7 ^' J5 I- X) e$ y

  198. , [2 F+ K# @3 L7 D0 x
  199. LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,
    2 R4 W: d7 v" b  V
  200.                            const char *font_name, LPDF_UINT8 size)3 d0 w# ?4 U4 x& {: x0 a: B! r
  201. {
    8 l4 D( B& ?, Q# u& u2 v3 x$ c5 ^
  202.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    $ j( c3 p/ h8 q  H& w; k* x
  203.     LPDF_INT i = 0,length = 0;0 a  W  K( |( d" |: [/ M9 f5 s2 _
  204.         LPDF_UINT writeBytes = 0;2 `: ]6 R  O: b6 i! W
  205.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
    * w8 C- S' A- V0 N
  206.     if(LPDF_OK != ret)- x' n+ u. |! U0 y/ W' A
  207.         return ret;) Z  _4 g6 d: \: [! G& O# ^' f

  208. ' y( Q+ v6 V7 ^4 t
  209.     while(font_list[i])& M  `9 \/ ], A* L  T
  210.     {
    7 `" t$ k" r: K6 g+ h) @
  211.         if(0 == strcmp(font_list[i],font_name))" x, ^# v) [4 R  d! p7 ^: D
  212.         {
    7 V5 U0 b4 F6 N( j: y
  213.             page->fontType = i;
    2 H% ?3 F  p3 V& w5 t% k- |  g
  214.             page->fontSize = size;
    8 M% X! u& z. Z; u* ~2 f' |3 S
  215.             length = LPDF_SPRINTF(pdf_buf,"/F%d %d Tf\n",i+1,size);
    / U/ Y* D4 B/ ?
  216.             LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    $ b5 v$ ^% Z7 ?2 e
  217.             pdf->offset += length;
    4 O: ?, T6 p. o, u9 E1 o, G
  218.             page->length += length;" G' S; ^( a2 S6 |. V8 J
  219.             return LPDF_OK;
    % a' s2 X' D& w+ W
  220.         }
    ( i7 F# K4 D! F( o& @
  221.         i+=1;6 a5 r% I; e, s. h, @
  222.     }
    ) t, A3 o3 \3 c, f4 i. K
  223.     ! m! m5 p% H2 @
  224.     return LPDF_OK;2 D4 ^6 ?; e4 k; Z0 c
  225. }  B6 G, q+ B4 j7 Y# y- R$ \& s

  226. ; I( Q& m9 h; ?+ N, ]. O7 R- L1 r) y
  227. LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page)5 E$ a* K% A: `) w9 M% f6 q
  228. {
    , E7 V9 E! M2 x6 ]9 G4 E+ |& Z
  229.     LPDF_INT length;5 B7 |8 C- B, D% J! l
  230.         LPDF_UINT writeBytes = 0;
    & n( v+ L$ Z4 i7 t9 {7 {, ?; I
  231.     LPDF_Doc pdf = (LPDF_Doc)page->doc;) s/ H# @5 B" Z% o6 Z
  232.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_INVALID);
    ) i. o2 Z* `- C# j7 D
  233.     if(LPDF_OK != ret)6 V- b+ j, l; o9 s* ?% r
  234.         return ret;; M4 |5 R! a7 p2 U' r
  235.    
    ) P+ @. q4 @* n' B7 W
  236.     /* 对于每个page来说该接口只能调用一次即在GMODE为INVALID的模式下 */9 \& i" ]- `! d  m# b
  237.     length = LPDF_SPRINTF(pdf_buf,"/MediaBox [ 0 0 %d %d ]\n>>\nendobj\n\n",
    - Y7 A7 u  g, u
  238.                         page->width, page->height);5 t4 H' r8 h2 i1 W$ E
  239.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    ; Y) O, S9 B/ Q# O6 j
  240.     pdf->offset += length;5 t6 \1 c: ]! I" e" h
  241.     pdf->obj[pdf->objNumber+1].objIdx = pdf->offset;3 j4 m5 p0 Y" P' W/ |3 A& H( l+ e0 O
  242.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<</Length %d 0 R>>\nstream\n",$ g* L" w, ~4 Q  v* V
  243.                         pdf->objNumber+2, pdf->objNumber+3);
    3 j: e! g4 w$ P; f
  244.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    ; b/ ?, u. F7 I2 P0 B; l
  245.     pdf->offset += length;
    $ w' I( g, p( |* l& c# ^! G1 P4 G. O# {
  246.     page->length = 0;
    : [$ u0 A0 `) h# q9 m3 r  K! V
  247.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;0 B+ N$ H. F( G: z" R- C7 @
  248.     return LPDF_OK;$ R" z% `0 H3 w# x* r, @
  249. }
    1 \8 V* I1 ?$ x7 {/ \3 _

  250. : |$ e( O% M! `- ]" x; U
  251. LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page)
    . d) @- R! v, `- X* w
  252. {
    - S; O! @. o& }, T5 q. C% ?
  253.     LPDF_INT length;
    ! f$ x; T( B; F& E
  254.         LPDF_UINT writeBytes = 0;) O+ @' f1 C. b2 H
  255.     LPDF_Doc pdf = (LPDF_Doc)page->doc;$ n2 m$ S3 }5 e  E# M" g
  256.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
    7 M$ Q5 }: M' w, z) f! r7 u) {
  257.     if(LPDF_OK != ret)
    * N' S/ b% Y5 a
  258.         return ret;3 y! F; X0 q# `( K
  259.      /* 对于每个page来说该接口只能调用一次即在GMODE为PAGE_DESCRIPTION的模式下 */9 V/ e% S! d) D' T) y; _9 ^8 o" m9 D
  260.     length = LPDF_SPRINTF(pdf_buf,"endstream\nendobj\n\n");6 O, @- a8 ]9 P  I! r4 W
  261.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    0 t  T2 w( W/ O6 Z. F/ u! ]* q2 t
  262.     pdf->offset += length;5 f3 a! o; A8 X1 v! t' \
  263.     pdf->obj[pdf->objNumber+2].objIdx = pdf->offset;! @6 c& P# {/ J, }# G0 [! X
  264.     length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n%d\nendobj\n\n",6 L" o- z; B# o6 j7 ^2 T
  265.                         pdf->objNumber+3,page->length);  `3 N+ R) c( j$ a
  266.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    9 Y' w5 F) D: K1 U
  267.     pdf->offset += length;' A' s+ _/ T2 x" O3 Q8 L
  268.     pdf->objNumber += 3;# C7 c& m) ^1 G4 a, t8 X( D8 V
  269.     page->gMode = LPDF_GMODE_OVER;
    * `9 q! |# n( S& q
  270.     return LPDF_OK;5 l0 Q- |. C% i) j5 g
  271. }
    8 Q5 B/ b8 t1 Z( g( ~+ M4 y8 I, e$ H

  272. 4 K  [: o# _) J  _) w' Q6 u2 J
  273. LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page)# \. S6 R; T3 H& J
  274. {
    ; j) w6 k0 f* r1 Z, c7 N$ H
  275.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    2 c& s# m4 P: Y$ z: I
  276.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
    2 N4 v+ g/ j7 z9 a; u; }
  277.     if(LPDF_OK != ret). R- D6 c& l  y8 c  D. P8 f# z1 c
  278.         return ret;2 g# b& u+ z- x& _. \1 }
  279.     LPDF_FPRINTF(&pdf->file,"BT\n");
    , s; p) i+ t: W$ q% i
  280.     pdf->offset += 3;
      S% w6 J, G! _
  281.     page->length += 3;
    / z6 Q/ q# p1 @) n3 b8 }
  282.     page->gMode = LPDF_GMODE_TEXT_OBJECT;
      O3 L; ^! _) e4 G8 B, _/ J
  283.     return LPDF_OK;4 v: R- i4 ~% l& t' r' g
  284. }
    / i% |# D& Y2 o: u0 v
  285. LPDF_STATUS LPDF_Page_EndText(LPDF_Page page)& v4 w2 Q2 T- t4 h
  286. {  n! |" q0 n+ g9 d
  287.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    ) |* R; Q7 q* k! G: Y, c
  288.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
    3 G3 ]6 x- G: ]6 z( q' ]
  289.     if(LPDF_OK != ret)
    5 \: H; y) y1 s% H1 ?6 |# o- j
  290.         return ret;
    - k( x; G9 P6 v! T  J) O( k
  291.     LPDF_FPRINTF(&pdf->file,"ET\n");: T. X( ]6 P1 x4 {* B# v  d
  292.     pdf->offset += 3;
    # S& P3 q" |) O/ \% W. F
  293.     page->length += 3;# R0 J, Z5 g* _
  294.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;. F; N: ]2 z) ^' l3 y# Y0 a& u4 }
  295.     return LPDF_OK;
    1 G" z7 @4 Q" Z, K- Z
  296. }. ?) [' k# U3 v6 Y8 }$ \( K2 p% u9 q

  297. - M1 W% n  q2 M4 @0 E/ m  |
  298. LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text)
    * M3 j' W9 \7 O; q' F6 u# H+ ~
  299. {& I" w) u& r, e2 o0 Z
  300.     LPDF_INT length = 0;
    9 `8 l* C6 T( d+ y: c% @
  301.         LPDF_UINT writeBytes = 0;; r$ O" s* B  e, O
  302.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    ) o% r( R1 p/ P- ~5 x" o6 ^' T
  303.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
    % E% \4 ~4 o( w1 \5 F
  304.     if(LPDF_OK != ret)
    2 m! n* ~1 D8 e4 h. ^
  305.         return ret;
    ; @4 W- s0 Z2 [
  306.     if(LPDF_FONT_INVALID == page->fontType)/ |8 k) s' B& S9 x  S. S$ d
  307.         return LPDF_OK;
    , s- {. T# @5 c0 y
  308.     length = LPDF_SPRINTF(pdf_buf,"(%s) Tj\n",text);, z1 X, i) [- y# `' W
  309.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    # z5 q& H4 A6 @7 o, ]3 v) K
  310.     pdf->offset += length;
    3 M$ W! b2 r5 W
  311.     page->length += length;
    / t0 _) y) t# C1 b( V9 g, F0 ^
  312.     return LPDF_OK;4 U& x, I0 ]" f
  313.     ' e9 \' b) ]" [7 k: Q) `  k
  314. }- j& l" [2 ]/ Q( `# ~
  315. LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,& T0 T/ u1 \7 }$ p7 u
  316.                         LPDF_INT x, LPDF_INT y)
    0 ^; A" U( _: K5 G6 O! x9 Q5 E
  317. {
    5 u0 i( _3 t1 E5 S2 I7 v
  318.     LPDF_INT length = 0;
    1 K4 v2 d! @5 ]1 S# N  ?
  319.         LPDF_UINT writeBytes = 0;2 n- L3 L! N" T% H
  320.     LPDF_Doc pdf = (LPDF_Doc)page->doc;; Y$ j. t3 j6 I: S, K. J9 q
  321.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
    4 R: P+ ?9 V) ?. Y/ ^
  322.     if(LPDF_OK != ret)
    4 ~* C, x% ?/ D% ?
  323.         return ret;
    ( O4 j3 }& c" q' ~
  324.     length = LPDF_SPRINTF(pdf_buf,"%d %d Td\n",x,y);
    ! O8 b+ ]1 E0 m: c
  325.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);, }  Y+ V, R! Q7 b
  326.     pdf->offset += length;
    * a% A' G  u) [2 }2 Y6 F
  327.     page->length += length;6 h- }6 |6 o0 Y+ J' a# v* p
  328. * B' s& M$ |# K6 {& }- [
  329.     return LPDF_OK;3 S! m. u% J0 ?3 b( B+ ^. c( K
  330. }
    ' M" U8 M/ c4 |
  331. LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,
    8 a& w. M' Q7 H* w' W
  332.                         LPDF_UINT16 x, LPDF_UINT16 y,( g, Q# v' Z! k, I( O
  333.                         const char *text)# s# O$ @7 N0 N, a! F  d
  334. {6 V' |+ Y; E" `4 {# r6 V/ `
  335.     return LPDF_OK;
    + n0 y" x. W  h, i. i9 I
  336. }8 O/ C1 O4 w4 P/ `( H4 O9 G* a, E+ t
  337. 8 E8 {7 ?! d" v% f7 [
  338. LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page,: l" i0 J) b, E# ]8 O/ T
  339.                          LPDF_REAL r," d/ F) Z; n2 y- v
  340.                          LPDF_REAL g,
    * N# l9 O# P; k9 m
  341.                          LPDF_REAL b)
    ( K/ N) i: a4 d4 E  N5 V
  342. {
    ( v) X5 \* l% ^9 i( V9 y
  343.     LPDF_INT length = 0;
      E& ~. _; ]& f$ H6 ^) ?
  344.         LPDF_UINT writeBytes = 0;
    % \  ~* c! n# F9 n
  345.     LPDF_Doc pdf = (LPDF_Doc)page->doc;* \. K7 V3 B& [+ y! k
  346.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
      }) U/ C; r2 A: k7 ?+ B+ `, r
  347.     if(LPDF_OK != ret)0 e- c, B6 o2 G2 t) w7 J$ \. ?7 y
  348.         return ret;' L- @% y( A) s/ ?( r* H( w

  349. * X4 d# W* a8 p  A( Y
  350.     length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f RG\n",r,g,b);
    " V# I' S. I" _- y& }
  351.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);# m6 s8 p2 K0 u' N& j
  352.     pdf->offset += length;5 ^% U9 x7 h5 }5 w# z+ Y
  353.     page->length += length;4 V2 M( S* s( Z3 F
  354.     return LPDF_OK;
    3 e+ w: v+ l2 @) f
  355. }, @# S) M5 ^1 Z

  356. 2 F" {6 X& y7 D) x3 p$ W; M& C
  357. LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,
    1 ~: g, I- R- b( ]6 S6 k
  358.                          LPDF_REAL r,
    0 A2 w+ @; {+ ]' Z, C0 x* d
  359.                          LPDF_REAL g,0 m  _5 j4 E9 e- a6 e" R
  360.                          LPDF_REAL b)3 e. F2 q0 s, p: k6 Z
  361. {
    - D. k( K# A" u% l
  362.     LPDF_INT length = 0;4 v) \, n$ @. q: L2 X
  363.         LPDF_UINT writeBytes = 0;
      E  d6 ~) y' x9 ?& p
  364.     LPDF_Doc pdf = (LPDF_Doc)page->doc;- s+ R3 W% J3 X
  365.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);  D  ~0 Z' S& c, ]6 z; q, V4 T) r$ T
  366.     if(LPDF_OK != ret)
    % y& l: j1 F7 G* c1 x" M  L) d
  367.         return ret;
    7 y; ^! u2 R+ v* f6 w

  368. . d4 v) H8 j2 [$ G* o
  369.     length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f rg\n",r,g,b);
    ! r/ u% @9 Q0 G/ S
  370.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    " S$ y& V! h9 J3 l
  371.     pdf->offset += length;
    $ `* Y3 Z4 c0 f8 H9 {
  372.     page->length += length;
    2 A; h+ `( M# X% O
  373.     return LPDF_OK;0 o$ B& j7 X7 R# S$ r1 m
  374. }
    1 F- {3 t; z9 F& d
  375. LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,
    7 p% T, O5 k& y; K3 U# _
  376.                          LPDF_UINT16 x,# V8 w( e$ Z6 V) Z* D6 Y. U
  377.                          LPDF_UINT16 y)# M, J% g' Y/ i" F' y0 y
  378. {* l: {: R7 }" s: j& ]' e
  379.     LPDF_INT length = 0;% o# a0 K8 H( ?) J8 ?
  380.         LPDF_UINT writeBytes = 0;. q! c- k, H/ i2 R( ^5 J5 ~
  381.     LPDF_Doc pdf = (LPDF_Doc)page->doc;  C: ?+ f, t8 Q
  382.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION|LPDF_GMODE_PATH_OBJECT);
    / |0 O6 o- v7 N6 }$ Z
  383.     if(LPDF_OK != ret), n1 P8 m$ H8 Y/ J; c  m: `% b! a8 P
  384.         return ret;" \7 k8 `2 F/ Y9 I* E! P
  385.     length = LPDF_SPRINTF(pdf_buf,"%d %d m\n",x,y);2 ^# c% |: t# L0 y/ P  A0 P; y
  386.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
    ) J  B, y1 u0 P
  387.     pdf->offset += length;8 ?7 p  I' ~  K, Q
  388.     page->length += length;
    1 |; d) \  b1 m7 P& p
  389.     page->gMode = LPDF_GMODE_PATH_OBJECT;
      F* h6 I$ k& f  n6 f9 a
  390.     return LPDF_OK;
    ) `- W  n4 ^" j! f6 {3 F, i* F' G% T
  391. }
    4 Y" T4 Z/ g+ u0 w; @# \% w  a; V! ]
  392. LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,% h5 |! T: e& v8 I& c
  393.                          LPDF_UINT16 x,
    9 }4 L0 z! z" C
  394.                          LPDF_UINT16 y)+ ^6 F, v; ~- k7 n4 N& E( o
  395. {
    3 U1 }( K: L  R% A9 T& u
  396.     LPDF_INT length = 0;
    / X% O% d" O4 Z$ ~
  397.         LPDF_UINT writeBytes = 0;" O2 X$ H9 S1 Z4 `  F
  398.     LPDF_Doc pdf = (LPDF_Doc)page->doc;+ T$ D4 l) O$ `: @. x
  399.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);
    * I: I" s) y1 E
  400.     if(LPDF_OK != ret)
    , `  W! z' S3 M0 u; t- z
  401.         return ret;8 q2 }& X; A7 N: f" d) V$ f
  402.     length = LPDF_SPRINTF(pdf_buf,"%d %d l\n",x,y);* N' A7 H# E9 Q8 C. E3 U
  403.     LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);; o+ ~5 H" Z9 `& ^* H) ]  b
  404.     pdf->offset += length;
    , D4 T% {( Z' D
  405.     page->length += length;/ \- g4 W- h5 ^; Z/ z
  406.     return LPDF_OK;; c  g0 ^5 j, S% W. O4 s
  407. }' a  s1 z# W& C9 k' ^
  408. LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page)
    $ Y7 Q* Q' i0 Q2 P  u5 W
  409. {
    1 t+ h& v  v- H  ~! W  s  G
  410.     LPDF_Doc pdf = (LPDF_Doc)page->doc;
    $ G* p! x2 D0 P: L% g
  411.     LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);6 s) x, {7 @6 J
  412.     if(LPDF_OK != ret)- u+ l% w) n! P7 Z: B
  413.         return ret;, \; J1 F; u- |! R
  414.     LPDF_FPRINTF(&pdf->file,"S\n");* E; X" g% Q2 K/ ^# X. v2 Z, L( N
  415.     pdf->offset += 2;
    $ S; F% P0 H* v6 O- I
  416.     page->length += 2;& D& ?/ ?9 f1 [4 D) d6 ?
  417.     page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;
      N* l  E3 R& j8 z
  418.     return LPDF_OK;# a# a- y. ~$ T; y
  419. }
      v3 l2 p5 y  _  n5 O
  420. LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,
    6 g' v% N$ X! v5 |( }- V
  421.                       LPDF_Image image,
    ; x* S: V) S. i( U
  422.                       LPDF_UINT16 x,. h2 e2 O. N0 d1 O
  423.                       LPDF_UINT16 y,
    6 o0 O4 F  P3 P. n1 P/ ?8 x* g
  424.                       LPDF_UINT16 width,
    5 Q2 |1 `( e) ^: v
  425.                       LPDF_UINT16 height)( \1 a# F: e% c8 d! c
  426. {
    * E  P/ p, o; k+ ^4 J  X
  427.         return LPDF_OK;
    6 \9 @, |2 H- c$ _
  428. }
    ) z6 W& _* \5 q
复制代码

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

  1. pdf = LPDF_New();
      R3 \# W  d" a! ~
  2.     page[0] = LPDF_AddPage(pdf);
    3 @+ g8 H* e' C2 l; s" ?# o9 b
  3.     LPDF_Page_SaveParams(page[0]);3 \1 _' K& f( d& G5 |; z" c4 h
  4.     width = LPDF_Page_GetWidth(page[0]);" |* O# C+ k4 y7 Y4 G
  5.     height = LPDF_Page_GetHeight(page[0]);- s0 s0 G% E: k* X7 o. ^
  6.     LPDF_Page_SetRGBFill(page[0], 1.0, 0.0, 0.0);$ ?" T% a( T. j8 h* e2 n
  7.     LPDF_Page_BeginText(page[0]);
    $ u. F7 T  {" W  T4 n  N
  8.     LPDF_Page_MoveTextPos(page[0], 50, height-20);
    - N+ @$ K% I- U1 \" e6 |% s
  9.     while(font_list[i])8 N1 _# t" n; z, F8 U+ A) b: H7 k
  10.     {' j0 u6 n* l  e7 |  i- Z
  11.         LPDF_Page_SetFontAndSize(page[0], font_list[i], 24);
    ! t# x0 W+ ^: |) K& ?
  12.         LPDF_Page_ShowText(page[0], "abcdefgABCDEFG12345!\043$\045&+-@?");
    2 i$ M& ]+ {, U
  13.         LPDF_Page_MoveTextPos(page[0], 0, -30);: o1 C# [  n6 r3 D
  14.         i++;# j: x7 w# F4 D
  15.     }
    + C9 m+ @' z4 u2 P. J1 k- Q. ~6 O7 l
  16.         LPDF_Page_SetFontAndSize(page[0], font_list[0], 24);
    ) x& }$ A+ ~: q" Y5 I' g
  17.     LPDF_Page_ShowText(page[0], LPDF_GetVersion());1 ?1 ]0 z* U, u( i! f  _7 i
  18.     LPDF_Page_EndText(page[0]);
    1 C: Z+ n9 `8 U4 z5 j, |
  19.     LPDF_Page_SaveContext(page[0]);
    8 h1 m8 I; w# R& m& b
  20.     page[1] = LPDF_AddPage(pdf);
    # j4 s5 A# V2 \; ?5 f% g
  21.     LPDF_Page_SaveParams(page[1]);
      j" Y4 p  }2 Q9 N3 K' E" n9 r
  22.     LPDF_Page_MoveTo(page[1], width/2-50, height-200);: @5 J, r4 l0 u
  23.     LPDF_Page_LineTo(page[1], width/2-50, height-300);
    / B4 d9 j1 D7 M" |; |$ [+ S/ K
  24.     LPDF_Page_LineTo(page[1], width/2-50+100, height-300);! C4 d4 ^; j2 F4 B6 X7 v
  25.     LPDF_Page_LineTo(page[1], width/2-50+100, height-200);  t2 c" u) x+ G. g, [& q3 `. c
  26.     LPDF_Page_LineTo(page[1], width/2-50, height-200);
    " v) X, N% C0 }  P0 M
  27.     LPDF_Page_LineTo(page[1], width/2-50+40, height-140);
    : e+ c% e5 i! b; Y0 |# A
  28.     LPDF_Page_LineTo(page[1], width/2-50+40+100, height-140);
    1 D+ l7 l: h9 T# h$ g
  29.     LPDF_Page_LineTo(page[1], width/2-50+100, height-200);# L3 v: I' Q7 n4 E
  30.     LPDF_Page_Stroke(page[1]);6 E" h, j% n! R  E6 g& D! l. h
  31.     LPDF_Page_MoveTo(page[1], width/2-50+40+100, height-140);
    # w4 ^) p0 W7 K5 s$ d
  32.     LPDF_Page_LineTo(page[1], width/2-50+40+100, height-240);7 A  X$ ^: c  g: p* W
  33.     LPDF_Page_LineTo(page[1], width/2-50+100, height-300);/ ~( q( n) |+ u) R% s9 J
  34.     LPDF_Page_Stroke(page[1]);
    ! V: Y1 t' ~6 R$ I2 A8 \# R9 X  _/ O
  35.     LPDF_Page_SaveContext(page[1]);
    ; |5 {1 q* Z* }/ i
  36.     LPDF_SaveToFile(pdf, "/red.pdf");) r: C& o. r2 A7 }0 s
  37.         PRINTF("\r\nCreate pdf file success!\r\n");) S, B8 G; f; o
  38.   
复制代码

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

无标题.png

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

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

PS:更新为V0.04版本了1 F% Y$ L, R: e

更新说明: V0.04

  • 增加了SimSun中文字体
  • 修复了LPDF_Page_SetLineWidth接口中内容长度错误的问题
  • pdflib源文件以及测试文件均需使用ANSI编码,否则无法正确显示中文字体8 g* a: ~; a! \, @2 `$ A* N

# U/ C" Q& |0 w& T1 E  C5 D

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:553 W/ M; J2 ]' C- j
只研究了一点,现在这个版本可以添加图片的,你可以看下,添加图片也有好几种方式,弄了个最简单的 ...
$ Q7 o: c7 d0 p* G% N/ o' a
LZ,我怎么没看到有添加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
+ t; @" P& F6 I$ G: D( J( u: K9 C1 T首先谢谢你的回复和帮助。。。还有你那个更新的dflib_v0.04(可以输出中文)里面没有HPDF_UseCNSFonts(), ...
; J* C! C1 a2 a; n5 b: Z( N" M: X5 c
66楼附件有的
anobodykey 回答时间:2017-6-17 23:04:09
自己顶一下,
深谷幽泉 回答时间:2017-6-18 11:45:33
看起来很高端的样子,居然没人顶。不过,请问楼主,用MCU生成PDF文件这种操作会在哪种应用场景下出现?求分享~
weigr 回答时间:2017-6-18 15:47:15
有意思
4 o1 D% ]; ?: j& P& k
anobodykey 回答时间:2017-6-18 15:55:19
深谷幽泉 发表于 2017-6-18 11:45/ s. X7 j3 {6 i/ T$ {1 c
看起来很高端的样子,居然没人顶。不过,请问楼主,用MCU生成PDF文件这种操作会在哪种应用场景下出现?求分 ...
$ H1 p6 [' E( _) U8 |3 N, K7 g5 Q
这个我也还没遇到过,只是之前看到有人问这个,所以看看
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
$ f) x# l) l: |' c/ O厉害啊,前几个月朋友让做个单片机生成pdf的工具我都没接
4 r: |6 v, i* M+ 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
7 y, m$ P/ u, ~ff.h在哪里呀,我的是keil4.73版本,需要手动添加吗

7 B- s$ a1 A; x2 W: N+ @( D9 f# Fff.h是FATfs中的文件
我为电狂 回答时间:2017-7-10 10:00:04
anobodykey 发表于 2017-6-28 09:22( z' ^8 D/ ], V
ff.h是FATfs中的文件

/ T- i  ]7 F+ y3 w& l, c3 o嗯,这个画线能改变线宽吗

所属标签

相似分享

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