本帖最后由 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,如下所示:
当然有些接口还没有实现,但基本的操作还是可以的,等以后再逐渐完善吧,pdflib是生成pdf文件的,因此要基于Fatfs来实现文件的操作,pdflib库只有两个文件,也相应的参考了pdfgen库,该库在后面有链接, 头文件如下: - #ifndef __PDFLIB_H__
0 q# ?. u v1 ?- ? K - #define __PDFLIB_H__! b) b" O/ ~2 f( I2 p* k4 b( ^
- - `! t: k& v. o7 T" I" g* z
- #include "ff.h"
$ v: i- S, G& v% i: h - /*----- standard C library functions -----------------------------------------*/
; U V) k3 _3 I a/ Z9 h! O9 y
; |( w. E) ~ J. m- ?3 Z- #define LPDF_FOPEN f_open
; M6 d) c8 n$ V9 w, p: Y - #define LPDF_FCLOSE f_close" S2 w6 a' p: B u
- #define LPDF_FREAD f_read
* V5 z" Y4 s3 e4 v* o& {+ ~ - #define LPDF_FWRITE f_write
, J( M( H' u3 m# Y) ?- @ - #define LPDF_FFLUSH f_sync! i3 n- @( M- t
- #define LPDF_FSEEK f_seek: m- r. T) ]& ]# b
- #define LPDF_FTELL f_tell' x: H" H, l: f: C
- #define LPDF_FEOF f_eof
) D6 B* Y. e% g8 C# _ - #define LPDF_FERROR f_error- R# |# B& l+ o3 e. Y) v' b
- #define LPDF_RENAME f_rename
3 v7 I- l9 P7 Y: B" L; P# w - #define LPDF_REMOVE f_unlink: b% ^" V. K5 x- X2 y% W
- #define LPDF_MALLOC malloc% w( K U) X! k; l9 R2 N
- #define LPDF_FREE free+ e7 R2 P! ~- K
- #define LPDF_FILE FIL
% Z! O' k6 g) S$ A4 |7 m& \& [2 x - #define LPDF_TIME time% f, ]# J2 Q# |, `* i; n
- #define LPDF_PRINTF printf( J% n" ?$ J, E" X3 g; @, O5 r
- #define LPDF_SPRINTF sprintf
7 Q' k% P, V& _/ y6 z& C - #define LPDF_FPRINTF f_printf. d2 M: S0 N7 Q( A' W1 W( }- |
- #define LPDF_VOID void2 G+ i" g2 N8 t2 w" M2 Q+ C
- #define LPDF_SIN sin: h) [' n6 {2 c! j, r1 G
- #define LPDF_COS cos
( Z5 X8 T. z( b0 E0 V) p - ) p* [( [% Z2 M. v- ~* C$ m5 M
- /* native OS integer types */
; Q/ r, K; r* U5 L - typedef signed int LPDF_INT;/ |' F8 Z( l% t+ ^9 R! C
- typedef unsigned int LPDF_UINT;, }& g8 c2 E4 ^
- F3 b+ Z- U0 v9 S: O- T+ k
+ \1 x% F- x) J+ X- /* 32bit integer types: l+ i' {6 O5 _# h( J; u' n
- */
' ]- `7 e0 |8 K - typedef signed int LPDF_INT32;
' ^# F% E, {8 w/ ^ - typedef unsigned int LPDF_UINT32;
% `0 @% A! u% ^0 u' a - & |1 K( ^7 j3 [% x1 Y* t( G; a% P
) J; d6 y+ u; [3 T- S! `7 ~# N+ }- /* 16bit integer types m/ @" q. ]% V/ |% A0 e
- */
5 E0 J, V A7 d3 T. i - typedef signed short LPDF_INT16;/ @% V1 S/ Q5 g9 P% c+ I
- typedef unsigned short LPDF_UINT16;
/ \" u5 a2 v. g% a. [ - 9 C1 l5 i! O; S/ D/ X7 E/ n. O3 ~
- 5 c6 C v! R! O' E, N
- /* 8bit integer types
+ A. T/ z' G' J' Z, ^ - */7 i& F, w; e& B( `
- typedef signed char LPDF_INT8;
: X* @1 g! v0 X/ T/ }# j/ i - typedef unsigned char LPDF_UINT8;) O4 I' S, g/ C& a& e8 i2 d; z
- ) R: a% _& l- c5 J) e2 m! \ R
- % p) C( C* D: \' m
- /* 8bit binary types
3 S* _9 W2 s8 ~0 ^! N2 Q& L4 c2 h - */- c& F. x/ E4 {8 I) l% J7 \3 w) n
- typedef unsigned char LPDF_BYTE;
5 V/ M4 E# |. Q, T - 0 c# G- l# F& ?2 [' P2 D" W, P, a8 w
- 8 H! D% E4 `1 H
- /* float type (32bit IEEE754)
, D2 a8 Q0 \) B - */* b! c3 W: d3 W0 l4 k
- typedef float LPDF_REAL;; B; }! K0 T% L, p# T! z
- " u) K5 D, R; H! D1 I- ?4 S& M
- ; C# r* n! K* X4 D' y& N
- /* double type (64bit IEEE754)9 B( L7 `5 I( e
- */8 W* K X) q( B9 s! \4 J
- typedef double LPDF_DOUBLE;
) E P0 S$ f/ x+ V, H; n1 r
- q3 ]/ [7 S* b' q Q
* w1 ]& b+ t3 |9 [( o1 J- /* boolean type (0: False, !0: True)1 }/ \; Y1 P. N- X" e) H
- */
$ r R, h7 l# {5 f. {5 [. b - typedef signed int LPDF_BOOL;
/ |" e, |2 h& g; [! K6 d
/ b6 Z8 t) S# F' G& t. {8 d: a- ) R4 {" X$ e, y2 b; a
- /* error-no type (32bit unsigned integer)" M' o% q% y/ ~4 F' S
- */: r1 V0 H" J1 T0 d
- typedef unsigned long LPDF_STATUS;
4 a/ G" t4 q) k# R& i* d
6 t9 \; \ y: {% G0 ]& m- #define LPDF_OK 0
& B" G. a% e; d9 W- ?8 k9 m - #define LPDF_FAILED 1. ]3 P% N, _) k# B0 `
- : G' n1 Z: W0 h7 g+ o* ~( U
- /*----- font state -----------------------------------------------------------*/+ L5 E6 H. Q2 p" g* `8 A; x8 _5 x0 e
- #define LPDF_FONT_INVALID 0x00FF7 n& _8 S. _+ r0 \
- #define LPDF_FONT_COURIER 0x0000
6 f* }0 l( O: U; s; M - #define LPDF_FONT_COURIER_B 0x00017 |5 k4 ?% Q2 X$ e8 e H2 q
- #define LPDF_FONT_COURIER_O 0x0002
8 s' C- E" v4 h2 F - #define LPDF_FONT_COURIER_OB 0x0003
* n) Q N+ F; T' x: g8 J4 { - #define LPDF_FONT_HELVETICA 0x0004
, h \( M3 j6 O1 h/ {4 ~' O - #define LPDF_FONT_HELVETICA_B 0x0005( x) O3 l: A8 Z! Y4 J' t. ?( W: K
- #define LPDF_FONT_HELVETICA_O 0x0006
J5 W; \: ?3 |& X6 y5 a W8 B0 q; X - #define LPDF_FONT_HELVETICA_BO 0x0007& Q/ Y% I0 A) O% Q/ e: v- H6 J' P
- #define LPDF_FONT_TIMES_R 0x0008
0 X0 B w6 F8 e, g7 V% J6 n8 ?0 o - #define LPDF_FONT_TIMES_B 0x0009& u$ r; i4 @/ E
- #define LPDF_FONT_TIMES_I 0x000A4 B8 O$ B9 A* u+ H* |' `' o
- #define LPDF_FONT_TIMES_BI 0x000B$ u# |7 O+ m5 H8 |3 E
- #define LPDF_FONT_SYMBOL 0x000C
; T9 {0 H+ f0 D$ f$ V - #define LPDF_FONT_ZAP 0x000D4 e1 h1 [5 H7 t! p5 X& x* y
- /*----- Graphis mode ---------------------------------------------------------*/
! K0 ?- c7 \: N+ l& u& i5 t' a - #define LPDF_GMODE_PAGE_DESCRIPTION 0x0001
) C! f( \' w. m" i. S - #define LPDF_GMODE_PATH_OBJECT 0x00020 C5 B% @- P* S) ]6 \' o4 h
- #define LPDF_GMODE_TEXT_OBJECT 0x00044 \* X0 ~; G8 t# L: p
- #define LPDF_GMODE_CLIPPING_PATH 0x0008! v. ^% \6 g) I t) l3 m# q; _
- #define LPDF_GMODE_SHADING 0x0010
9 G2 o4 L1 i- z7 l) l, s - #define LPDF_GMODE_INLINE_IMAGE 0x00205 |, l1 @. d; l
- #define LPDF_GMODE_EXTERNAL_OBJECT 0x0040
& a/ i; h L0 ^9 W2 X - #define LPDF_GMODE_INVALID 0x0080" L5 ^3 y$ I; i3 g. |8 b+ C6 u
- #define LPDF_GMODE_OVER 0x01004 b1 U0 r9 Q4 E4 A
- & E4 x4 k$ \3 e3 x
- #define OBJ_MAX_NUM 256# I4 ]: ^+ V$ G8 |
; i2 _; U* G- u3 S- /* Page的结构信息是否需要树形结构 */1 J1 i6 ?& F2 G- i( B1 d9 a: x
- typedef enum
6 z* k' c) A% L# ^4 N - {
5 l0 k# W$ g0 R - OBJ_info,. x. A- V2 _0 K. D
- OBJ_stream,+ w8 _9 Q! N- O# Z" j* p
- OBJ_font,
8 b, N/ N6 _: |1 o" q: }0 l0 { - OBJ_page,
2 d) n) j& i6 [ - OBJ_catalog,
+ k B" ?2 S, ^: J g5 r2 D - OBJ_pages,
* K' n8 x/ k9 M% N+ f- p - OBJ_image, I# g/ V& y4 p4 D P+ p
- }LPDF_ObjType;
[: h8 |3 l* E7 Z4 J
1 t7 Z: {3 J; o( \- typedef struct
5 G+ A3 Y, H' o( M8 k; t - {1 {5 s. l" A$ e
- LPDF_ObjType objType;2 q `& a; c G M# t# B: c
- LPDF_UINT16 objIdx;" D& V4 \ ]+ m: a5 f; A* @8 c+ J
- LPDF_UINT16 height;
& X# @" c; K5 _& n& F3 c. Y! u) G - LPDF_UINT16 width;) k; b* l# n# m# N: y4 n
- LPDF_UINT16 length;# N; Q" R0 j# C3 m
- LPDF_UINT gMode;
. w, O7 }& h" j1 `3 Y/ X2 x - LPDF_BYTE fontType;
$ V' H4 L8 }: a# @/ c. W$ T - LPDF_BYTE fontSize;
1 |' q5 I& @! V2 O: m. u4 f- Z: { - LPDF_BYTE pState;
" s3 _* [+ E# x) s0 P- t - LPDF_VOID *doc;
j& F0 z, h1 {& w7 c - }LPDF_Obj;1 i J* s3 c/ b8 @
- ) @2 x3 [) i- i& p: C3 z6 {5 Z; \
- typedef struct0 a; K7 r# [- J
- { C( |( x( D' G: S6 `
- LPDF_Obj obj[OBJ_MAX_NUM];
, ^1 t* o- Z6 i, V7 p - LPDF_UINT32 offset;: [1 S9 R; V; s1 v k
- LPDF_UINT16 objNumber;) H' z) P% g. ]- v- X& ^1 p- T
- LPDF_FILE file;% \- u. |) Q1 d3 \$ G
- }LPDF_Doc_Rec;( b- J& y" V% U; M. M/ f2 k8 F
$ c+ k3 H6 b k- typedef LPDF_Doc_Rec *LPDF_Doc;9 X: b- ?: v+ S0 o( C1 ^; n0 c2 Y
- typedef LPDF_Obj *LPDF_Page;
4 P* B$ A2 S8 R+ r - typedef LPDF_Obj *LPDF_Image;
; s X( X9 W5 `0 l& q& q - extern const char *font_list[];; a1 `5 w5 w2 P0 a; L( y- n* N A
- /*----- LPDF Interfaces-------------------------------------------------------*/
2 ^) F, l0 h/ W: r: w - const char * LPDF_GetVersion(void);; Z5 o( n) `) N% K3 ~
- LPDF_Doc LPDF_New(void);* r& G# G* l; w Y. g1 A
- LPDF_Page LPDF_AddPage(LPDF_Doc pdf);5 N8 c* H) @& E& B# k1 \
- LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name);
) ~9 s7 k- |2 g* v# d9 c' J/ ?/ i) Q - LPDF_STATUS LPDF_Free(LPDF_Doc pdf);) A+ \: s. h6 R( E% L2 C9 A" l
- LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode);
* \+ f: t" J* C6 G) h# a; U9 Q1 @5 f- i - LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,3 _: C$ e9 `9 \' ~0 W
- const char *font_name, LPDF_UINT8 size); F9 Q4 |' }* O& Q# e7 S" P/ a
- LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page);
9 p& R/ I# }$ a1 C - LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page);
4 W0 @. h3 G( \8 w+ U% I/ ^! i( x+ [ - LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page);
; x5 f3 Z+ ` a- ?2 J - LPDF_STATUS LPDF_Page_EndText(LPDF_Page page);
. ]6 L7 G3 ]& S - LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page);& G4 q1 T% b: `7 ~, ~
- LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page);2 X* B1 V) I9 L! X& Z
- LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value);. u8 |) @2 B) P" T8 h+ p
- LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value);
7 {3 \3 I# K7 v# N - LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text);
8 |& m3 |: }/ i/ H4 O* i8 E# q( z$ k# z - LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,8 L y& s# R8 R
- LPDF_INT x, LPDF_INT y);# P4 ~; R9 ?- z4 Q6 a+ ]' I" F
- LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,
" F+ w j9 P# N" q- y6 W - LPDF_UINT16 x, LPDF_UINT16 y,
, g# h+ Y3 g6 j8 X7 I1 K0 X - const char *text);
+ u2 J3 l4 { \! e: f - LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page,
: Z4 @* @3 x. k$ y" T0 F' F - LPDF_REAL r,
2 z: v5 s* L5 E& _ - LPDF_REAL g,
$ z& U+ m: x/ V, b$ | - LPDF_REAL b);
. f; J# }; |8 P9 Q: f% l% Z - LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,: G+ i5 z% ?7 Z/ x) X, r
- LPDF_REAL r,7 t% s$ V! ]: o# |3 J9 Z* z
- LPDF_REAL g," w7 o! z/ T4 B! t8 u/ C5 g
- LPDF_REAL b);
( }) U6 H* ]1 G+ S# R - LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,5 w5 V, Q, j- `5 A" d: u5 |
- LPDF_UINT16 x,
4 X/ S2 H5 s7 j+ V) z; m - LPDF_UINT16 y);7 T1 }6 ^2 b G1 S: f
- LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,, o8 T1 S$ n( u* v7 x
- LPDF_UINT16 x,+ I7 b/ s# M$ a0 ]0 D' q# t* c' c
- LPDF_UINT16 y);& [' U6 ?: w& R3 u1 c6 n0 ?) A
- LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page);
9 B/ S1 f( x9 Q+ l7 q: U8 I - LPDF_STATUS LPDF_Page_ClosePathStroke(LPDF_Page page);
; C/ M, ]6 I$ T! k; r - LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,* M" `$ }4 G2 ?0 v) p
- LPDF_Image image,
, L1 Z" Z7 s# d* G - LPDF_UINT16 x,
0 B- U2 x; x' _$ R5 W1 {' d; n - LPDF_UINT16 y,3 H. _8 @' a) B8 p3 V: |. v
- LPDF_UINT16 width,( j5 h" P" \5 T) G0 B7 V
- LPDF_UINT16 height);
9 r$ z0 L" m% ?' D# S -
) y+ t: X; ~; c& O+ h0 @ - #endif
& o0 ?4 X. }& z7 n! F8 D* r
复制代码源文件如下: - #include <stdio.h>( c# u( V# J5 }; y6 I
- #include <stdlib.h>
+ T' ~! I% [8 V6 h, W& h - #include <stdint.h>
9 N7 V3 J, u% } - #include <string.h>5 l9 E$ h [ \$ e
- #include "pdflib.h"
. p" y& i8 `# D5 e
% W" x7 H5 g- v- #define LPDF_INVALID_OBJECT 0x1033
% F& [' U% F* X
& u6 M: e0 g5 ~ v, t3 C( x- static char pdf_buf[512];8 R4 [9 n& R! W4 M3 r& _) z/ ]
9 [8 d9 C; T/ d- #define LPDF_VERSIOIN_TEXT "0.0.1"
7 X" O/ J! L$ D- A - #define LPDF_FILE_HEADER_LEN 15, E9 S7 i# o/ J0 J5 Y
- #define LPDF_BASEFONT_NUM 14
9 t: @1 A2 _; `! z, L7 R( g - const char LPDF_FILE_HEADER[] = "%%PDF-1.4\n%%\xAA\xBB\xCC\xDD\n";
# x+ I' T2 x8 v) v! B - const char *font_list[] = {
7 W- \' H% j6 K9 S - "Courier",
6 a6 J6 A3 ]6 o/ P. O - "Courier-Bold",
% o2 `1 q+ v/ f5 {6 e7 r0 @! F - "Courier-Oblique",
# j% ?; t6 L4 v# A. t+ [& `3 v) j - "Courier-BoldOblique",5 o8 H, t# P* \& F2 t- T
- "Helvetica",) ?# g" p$ [) J: G
- "Helvetica-Bold",
% P/ k( U2 D& f3 t6 s$ f - "Helvetica-Oblique",% O3 \) B; ^8 y6 V
- "Helvetica-BoldOblique",& N2 m8 T' N) N1 Q7 `( T3 M6 a
- "Times-Roman",3 H! ]* N/ F0 v9 \! ~8 X
- "Times-Bold",! Y3 @* ?6 I; D$ ~ ]; E7 M4 `
- "Times-Italic",% w$ n! A6 Q3 E0 E' l
- "Times-BoldItalic",9 z; J! U+ q5 J0 R2 A
- "Symbol",8 s j/ t2 S, I6 S* c4 ^# p9 ]3 r
- "ZapfDingbats",
$ [. l' ?3 c6 j$ M - NULL# r+ q! c; R8 i, h
- };0 u( m% Y- [1 i* E0 M5 B6 P# r) E8 x
. u3 X# R: P5 w1 t& M$ E9 V) o1 P" f
" A$ t6 f" A$ C& @- const char * LPDF_GetVersion(void)$ }) y( ^4 h" U. Y1 P) i0 K/ J0 M
- {2 {1 z2 v" L; w% E
- return LPDF_VERSIOIN_TEXT;8 V" S3 L4 Y3 o( z" D3 I9 W4 B
- }9 _8 ]$ w1 f9 w3 R
4 T1 Q6 X1 J2 \# j% T- LPDF_Doc LPDF_New(void)# _1 P0 e( B9 \) ? Z9 x
- {4 v0 @3 H( c% F9 g6 J3 r. Y
- static LPDF_Doc_Rec pdf;
# o: t; k4 A( B' s e5 S - LPDF_INT length = 0, i = 0;
$ e8 y6 l4 N; @; c! k; K - LPDF_UINT writeBytes = 0;
; J" L' r! n6 i* d" K - FRESULT fr;
; \- q+ z4 S4 r, }8 f - % t9 o7 ^( n2 X. t; |2 U% v
- fr = LPDF_FOPEN(&pdf.file,"/tmp.pdf",FA_CREATE_ALWAYS|FA_WRITE);
! U# K9 H1 b& B. ~ v9 Z - if(fr)
1 }$ V$ E$ d _ @ - {
+ O5 y# d$ [! |4 n$ k - LPDF_PRINTF("create tmp.pdf failed!\r\n");
+ s( ?/ O. R% @3 j - return NULL;
. k( G3 h$ S1 |5 y9 H: b: t - }
$ Q4 M/ {2 I5 d+ k4 m: [ - LPDF_FPRINTF(&pdf.file,LPDF_FILE_HEADER); /* 写入文件头 */
* ]$ Q0 \* T8 G( ] - pdf.offset = LPDF_FILE_HEADER_LEN;9 A% J Z# g' a+ X4 C+ g) ?
-
2 u! A' E+ t0 l - pdf.obj[0].objIdx = pdf.offset;
0 s2 T: D' ~8 E) Q - 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 - LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);+ i* w) l6 c: w7 M6 J3 L
- pdf.offset += length;' ~. k: ~# k, l2 |# y
- . L. q6 A! s! s+ N0 Q X3 D# K# R
- pdf.obj[1].objIdx = pdf.offset;( {* j' m/ v, h' _3 U I
- length = LPDF_SPRINTF(pdf_buf,"2 0 obj\n<<\n/Creator (light pdf library 0.0.1)\n"
/ T5 C' j9 w6 v: C - "/Auther (anobodykey)\n>>\nendobj\n\n");
5 ^% l$ I' T+ v3 n, I0 V - LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);: m7 _7 x8 j) i: _
- pdf.offset += length;
- ]: @$ @8 X0 W, Z0 \' u -
8 y9 r1 F1 \- L" |2 P* w, u - for(i = 0; i < LPDF_BASEFONT_NUM-2; i++)
1 `/ g( p" k5 r( }9 N! `* @* @ - {
' i4 c5 b5 J* _5 r1 p, _ - pdf.obj[2+i].objIdx = pdf.offset;( Y. [ [) C; {0 G' X# B/ }
- length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"
& t, A" H. b ~: v7 `# ]5 F - "/BaseFont /%s\n/Encoding /WinAnsiEncoding\n>>\n"5 H' p& r0 _4 z5 z6 M
- "endobj\n\n",3+i,font_list[i]);$ ]/ Z" {, I$ _' E9 N
- LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);4 n1 o: v- H9 R9 T: i/ g6 j
- pdf.offset += length;$ }) `- p: O T8 I2 h; m$ D
- }
( N6 n0 ]( ^- L - for(; i < LPDF_BASEFONT_NUM; i++)
* x$ f) F* n8 z, G - {
$ o/ C9 R9 U- _9 u3 M6 E# r- P - pdf.obj[2+i].objIdx = pdf.offset;
' Y1 {1 g' e* X: Y7 [3 U. H; p5 L - length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n"/ Y/ @2 ?6 }" |5 J
- "/BaseFont /%s\n>>\nendobj\n\n",3+i,font_list[i]);" G: ?' }: G* H
- LPDF_FWRITE(&pdf.file,pdf_buf,length,&writeBytes);2 F8 I) C, k5 o6 _7 K$ D" g# O2 B
- pdf.offset += length;
/ |$ o" F$ ^2 g - }
, f% E" i3 d8 y& ~4 I' C% ^: P - pdf.objNumber = 3+i;4 G3 k0 y( u; u2 s* }
-
: `2 B( {; e( x; G+ s, { - return (LPDF_Doc)&pdf;
0 I+ f+ X8 ]% \, a+ ]7 d) K- ? - }) `; Y3 ?5 e% L; n: f3 p5 J8 x3 ?
- ! N/ Y* `0 X* [+ i! ]% O
- LPDF_STATUS LPDF_SaveToFile(LPDF_Doc pdf,const char *file_name)9 ^4 H# m# b. z3 z, }* h& K( J
- {8 j6 E% F; |/ s
- LPDF_UINT16 i = 0, child_pages = 0;0 e! I' Z( q I8 C5 V8 B9 f
- LPDF_INT length = 0;) Y/ _$ A1 K V9 |! J+ e$ e4 f
- LPDF_UINT writeBytes = 0;" T6 {0 ]' t& n) R: t- B$ y
/ h! w" n6 I" P" L- pdf->obj[16].objIdx = pdf->offset;
# x( {5 W( _. g4 Y: }# M* q. _ - child_pages = (pdf->objNumber-2-LPDF_BASEFONT_NUM)/3 ;
& O- T1 H0 c; T$ e1 N - 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 - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
! `& u' G; {/ K& b. P* f, l - pdf->offset += length;) t l! U: }; f! x& F
- for(i = 0; i < child_pages; i++)' N3 a* M+ e7 B' ~
- {) O8 C3 K, d! i: i& A
- length = LPDF_SPRINTF(pdf_buf,"%d 0 R\n",18+i*3); e0 G2 |* ^' F- h
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
, Q" J. Z- y" M) d' R( t( m - pdf->offset += length;3 h7 R; z7 k- q: t4 `, J
- }% Q" ^" j' X5 U" q! z& N3 E# d u' p
- length = LPDF_SPRINTF(pdf_buf,"]\n>>\nendobj\n\n");
# q) o0 h( Y. b, b, W - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);% V) I" {! Z, e4 b& w. d# _% M
- pdf->offset += length;2 p0 Q- j/ ?! @ [0 n2 B
- 7 a$ L: b# Y. A) @9 T
- LPDF_FPRINTF(&pdf->file,"xref\n0 %d\n0000000000 65535 f\r\n",pdf->objNumber+1);( q2 u# X; O3 q
- for(i = 0 ; i < pdf->objNumber; i++)
/ C p/ l& t8 f \! d) s% h# m - {
6 { ^0 T9 b+ _1 f - LPDF_FPRINTF(&pdf->file,"%10.10d 00000 n\r\n",pdf->obj[i].objIdx);1 m: _6 t! a# _; S! P& P
- }
, ?& G* _6 q6 N8 M# @# v6 R5 U4 n - 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 @ - pdf->objNumber+1,pdf->offset);
. |2 W8 X5 K8 a4 r - LPDF_FCLOSE(&pdf->file);
! m* Y* A) s' R$ x8 c& h/ o) D - LPDF_REMOVE(file_name);7 T4 u* f+ G% A( E9 F) D
- LPDF_RENAME("tmp.pdf",file_name);! V/ v% C( B1 m" I3 j* A* M- w
- return LPDF_OK;
/ k( i* c4 ^+ O8 N% V$ I - }
# ]1 X ~" y) m2 i; U+ d - 2 w' b A, z! {5 P: z
- LPDF_STATUS LPDF_Free(LPDF_Doc pdf)
/ g% ` `& e6 s: d - {) V( ^" D. w& Y: j
- memset(pdf,sizeof(LPDF_Doc_Rec),0);) |. i! D& d. ], w8 b
- return LPDF_OK;! k# l) H* X. v% K* A
- }
* v% u# |: m6 y6 [7 b* ? |
5 ~$ D0 N' G8 z- V1 I* r- LPDF_Page LPDF_AddPage(LPDF_Doc pdf)
; X+ x6 |( g& K0 Z* S - {4 l0 i y H7 |$ _
- LPDF_INT length = 0,i = 0;
" N) B# q! H$ s" X - LPDF_Page page = NULL;
! T0 \% _8 g! q5 @6 w4 o - LPDF_UINT writeBytes = 0;
$ [' X9 p+ c( h# A( f& e - / S+ H5 J1 W5 H% h! M
- pdf->obj[pdf->objNumber].objIdx = pdf->offset;
- S2 N3 u; A2 p# H - 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
- "/Resources <<\n/ProcSet [/PDF /TEXT /ImageB /ImageC /ImageI]\n"( h7 _ F1 W* F
- "/Font <<\n",pdf->objNumber+1,pdf->objNumber+2);' Z* ~ s0 D. w5 n: s5 Q
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);2 T1 c6 z- q- E
- pdf->offset += length;
$ y2 E% U4 ]- \6 U - while(font_list[i])6 i4 N' N( o; E/ ^0 I9 ^7 {
- {2 `8 g- k2 y2 d: o
- length = LPDF_SPRINTF(pdf_buf,"/F%d %d 0 R\n",i+1,3+i);9 k( \+ e; _( |$ H/ m
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
7 [+ g' m5 ?7 ^! ` - pdf->offset += length;4 ?2 p! ?' r3 g; ^$ b: B
- i+=1;8 H+ V% J- m/ v( Z ]% |
- }
% v4 @& n8 V. T ? U) h - LPDF_FPRINTF(&pdf->file,">>\n>>\n");! m4 o& o# f) P/ v. l+ I
- pdf->offset += 4;
+ u- T( M( V3 Z9 O8 {6 X - page = (LPDF_Page)&pdf->obj[pdf->objNumber];, ?3 w! ^8 W7 |
- page->width = 595;
; a# O [8 }# r4 l& O - page->height = 842;
9 T5 f9 e' Z( [8 r; k# N - page->gMode = LPDF_GMODE_INVALID;: w. d# s% v; B( {6 Q' N* L6 z" u2 n
- page->fontType = LPDF_FONT_INVALID;& r! U& o5 o& ~* m
- page->doc = pdf;0 h# [" o0 ^+ G
- return page;) j/ O- a0 Q7 b- L" m" Y4 p
- }
4 ?! p" B# @' r4 w7 p& p; R - / `8 w2 ~* O X3 u# k3 G
- LPDF_STATUS LPDF_Page_SetHeight(LPDF_Page page, LPDF_UINT16 value)
. a5 z& Q( c' ?, f2 G. h6 J - {5 Y6 b1 y; i2 g* ]4 r! l
- page->height = value;
2 e# @, H3 N U; C& |& V& \1 g# _4 l - return LPDF_OK;
9 W# Z. t6 S* H, N; Z) v4 Z - }
4 E1 S+ w0 z2 T R5 g/ L1 _ - LPDF_STATUS LPDF_Page_SetWidth(LPDF_Page page, LPDF_UINT16 value)
6 a: g5 R$ F3 \# l" p# |7 m) \ - {8 ~" I4 W5 X" k% ?4 O
- page->width = value;8 k" g; s2 a& @( b3 W1 r
- return LPDF_OK;3 n' l$ \3 O6 l6 c0 P
- }
7 s; B9 | m- {7 o( o" [
) `4 J8 P- b/ e9 F% }- a" y1 Z+ ~$ x- LPDF_UINT16 LPDF_Page_GetHeight(LPDF_Page page)
$ u; U6 _4 Z, g% M# A, ^ - {
+ K! L$ r3 l9 M7 a0 Q - if(page), n& t2 [6 e1 z4 ^# O7 D: D* `
- {& @# ^) ]: \& T. {& _ g# E
- return page->height;9 w9 g7 \6 Y8 H; K$ T
- }; c" f9 s; A9 }7 d
-
1 h: i" h; l0 c, m! H - return LPDF_OK;. F( ^# S" I$ {* n% u8 ]: i9 K
- }6 t/ v. u' V! ^
- " U3 x' H; Q* Z0 J
- LPDF_UINT16 LPDF_Page_GetWidth(LPDF_Page page)
/ o8 M/ t5 ?. {- v5 T - {) M% Z1 u' U8 ~- T# o" r7 O3 X$ G
- if(page)
2 Z& E; S& \: X" B/ D - {4 M; J- `4 z% L
- return page->width;" ]2 G1 S: Q% y4 W2 d
- }
" L( Z) l; m+ G# ^6 h - 6 u) P( k0 p* V1 O# b& S5 t7 H. u0 C
- return LPDF_OK;
2 }: w2 _9 T1 e q" K9 k - }
$ H. ]8 p0 X9 U9 e$ f' g; w, y3 W
% T" P! I. D/ |) ]- LPDF_STATUS LPDF_Page_CheckState(LPDF_Page page, LPDF_UINT mode)! l# D8 e" T e
- {
# f5 K* X! q' J2 ]. L3 x1 W4 b - if(!page)
# [9 m/ m* l1 h$ x; m% C - return LPDF_INVALID_OBJECT;0 }; G/ F4 t/ P* Z1 L& U
- if(!(page->gMode&mode))7 Y" U5 `/ r0 @& C. ]1 J4 s
- return LPDF_FAILED;+ B" e& d$ {/ N4 I& F
. s$ _0 T6 J7 C) G% N+ F: {- return LPDF_OK;, |, ^4 A1 l7 f% t" j& W
- }7 ^' J5 I- X) e$ y
, [2 F+ K# @3 L7 D0 x- LPDF_STATUS LPDF_Page_SetFontAndSize(LPDF_Page page,
2 R4 W: d7 v" b V - const char *font_name, LPDF_UINT8 size)3 d0 w# ?4 U4 x& {: x0 a: B! r
- {
8 l4 D( B& ?, Q# u& u2 v3 x$ c5 ^ - LPDF_Doc pdf = (LPDF_Doc)page->doc;
$ j( c3 p/ h8 q H& w; k* x - LPDF_INT i = 0,length = 0;0 a W K( |( d" |: [/ M9 f5 s2 _
- LPDF_UINT writeBytes = 0;2 `: ]6 R O: b6 i! W
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
* w8 C- S' A- V0 N - if(LPDF_OK != ret)- x' n+ u. |! U0 y/ W' A
- return ret;) Z _4 g6 d: \: [! G& O# ^' f
-
' y( Q+ v6 V7 ^4 t - while(font_list[i])& M `9 \/ ], A* L T
- {
7 `" t$ k" r: K6 g+ h) @ - if(0 == strcmp(font_list[i],font_name))" x, ^# v) [4 R d! p7 ^: D
- {
7 V5 U0 b4 F6 N( j: y - page->fontType = i;
2 H% ?3 F p3 V& w5 t% k- | g - page->fontSize = size;
8 M% X! u& z. Z; u* ~2 f' |3 S - length = LPDF_SPRINTF(pdf_buf,"/F%d %d Tf\n",i+1,size);
/ U/ Y* D4 B/ ? - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
$ b5 v$ ^% Z7 ?2 e - pdf->offset += length;
4 O: ?, T6 p. o, u9 E1 o, G - page->length += length;" G' S; ^( a2 S6 |. V8 J
- return LPDF_OK;
% a' s2 X' D& w+ W - }
( i7 F# K4 D! F( o& @ - i+=1;6 a5 r% I; e, s. h, @
- }
) t, A3 o3 \3 c, f4 i. K - ! m! m5 p% H2 @
- return LPDF_OK;2 D4 ^6 ?; e4 k; Z0 c
- } B6 G, q+ B4 j7 Y# y- R$ \& s
; I( Q& m9 h; ?+ N, ]. O7 R- L1 r) y- LPDF_STATUS LPDF_Page_SaveParams(LPDF_Page page)5 E$ a* K% A: `) w9 M% f6 q
- {
, E7 V9 E! M2 x6 ]9 G4 E+ |& Z - LPDF_INT length;5 B7 |8 C- B, D% J! l
- LPDF_UINT writeBytes = 0;
& n( v+ L$ Z4 i7 t9 {7 {, ?; I - LPDF_Doc pdf = (LPDF_Doc)page->doc;) s/ H# @5 B" Z% o6 Z
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_INVALID);
) i. o2 Z* `- C# j7 D - if(LPDF_OK != ret)6 V- b+ j, l; o9 s* ?% r
- return ret;; M4 |5 R! a7 p2 U' r
-
) P+ @. q4 @* n' B7 W - /* 对于每个page来说该接口只能调用一次即在GMODE为INVALID的模式下 */9 \& i" ]- `! d m# b
- length = LPDF_SPRINTF(pdf_buf,"/MediaBox [ 0 0 %d %d ]\n>>\nendobj\n\n",
- Y7 A7 u g, u - page->width, page->height);5 t4 H' r8 h2 i1 W$ E
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
; Y) O, S9 B/ Q# O6 j - pdf->offset += length;5 t6 \1 c: ]! I" e" h
- pdf->obj[pdf->objNumber+1].objIdx = pdf->offset;3 j4 m5 p0 Y" P' W/ |3 A& H( l+ e0 O
- length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n<</Length %d 0 R>>\nstream\n",$ g* L" w, ~4 Q v* V
- pdf->objNumber+2, pdf->objNumber+3);
3 j: e! g4 w$ P; f - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
; b/ ?, u. F7 I2 P0 B; l - pdf->offset += length;
$ w' I( g, p( |* l& c# ^! G1 P4 G. O# { - page->length = 0;
: [$ u0 A0 `) h# q9 m3 r K! V - page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;0 B+ N$ H. F( G: z" R- C7 @
- return LPDF_OK;$ R" z% `0 H3 w# x* r, @
- }
1 \8 V* I1 ?$ x7 {/ \3 _
: |$ e( O% M! `- ]" x; U- LPDF_STATUS LPDF_Page_SaveContext(LPDF_Page page)
. d) @- R! v, `- X* w - {
- S; O! @. o& }, T5 q. C% ? - LPDF_INT length;
! f$ x; T( B; F& E - LPDF_UINT writeBytes = 0;) O+ @' f1 C. b2 H
- LPDF_Doc pdf = (LPDF_Doc)page->doc;$ n2 m$ S3 }5 e E# M" g
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
7 M$ Q5 }: M' w, z) f! r7 u) { - if(LPDF_OK != ret)
* N' S/ b% Y5 a - return ret;3 y! F; X0 q# `( K
- /* 对于每个page来说该接口只能调用一次即在GMODE为PAGE_DESCRIPTION的模式下 */9 V/ e% S! d) D' T) y; _9 ^8 o" m9 D
- length = LPDF_SPRINTF(pdf_buf,"endstream\nendobj\n\n");6 O, @- a8 ]9 P I! r4 W
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
0 t T2 w( W/ O6 Z. F/ u! ]* q2 t - pdf->offset += length;5 f3 a! o; A8 X1 v! t' \
- pdf->obj[pdf->objNumber+2].objIdx = pdf->offset;! @6 c& P# {/ J, }# G0 [! X
- length = LPDF_SPRINTF(pdf_buf,"%d 0 obj\n%d\nendobj\n\n",6 L" o- z; B# o6 j7 ^2 T
- pdf->objNumber+3,page->length); `3 N+ R) c( j$ a
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
9 Y' w5 F) D: K1 U - pdf->offset += length;' A' s+ _/ T2 x" O3 Q8 L
- pdf->objNumber += 3;# C7 c& m) ^1 G4 a, t8 X( D8 V
- page->gMode = LPDF_GMODE_OVER;
* `9 q! |# n( S& q - return LPDF_OK;5 l0 Q- |. C% i) j5 g
- }
8 Q5 B/ b8 t1 Z( g( ~+ M4 y8 I, e$ H
4 K [: o# _) J _) w' Q6 u2 J- LPDF_STATUS LPDF_Page_BeginText(LPDF_Page page)# \. S6 R; T3 H& J
- {
; j) w6 k0 f* r1 Z, c7 N$ H - LPDF_Doc pdf = (LPDF_Doc)page->doc;
2 c& s# m4 P: Y$ z: I - LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION);
2 N4 v+ g/ j7 z9 a; u; } - if(LPDF_OK != ret). R- D6 c& l y8 c D. P8 f# z1 c
- return ret;2 g# b& u+ z- x& _. \1 }
- LPDF_FPRINTF(&pdf->file,"BT\n");
, s; p) i+ t: W$ q% i - pdf->offset += 3;
S% w6 J, G! _ - page->length += 3;
/ z6 Q/ q# p1 @) n3 b8 } - page->gMode = LPDF_GMODE_TEXT_OBJECT;
O3 L; ^! _) e4 G8 B, _/ J - return LPDF_OK;4 v: R- i4 ~% l& t' r' g
- }
/ i% |# D& Y2 o: u0 v - LPDF_STATUS LPDF_Page_EndText(LPDF_Page page)& v4 w2 Q2 T- t4 h
- { n! |" q0 n+ g9 d
- LPDF_Doc pdf = (LPDF_Doc)page->doc;
) |* R; Q7 q* k! G: Y, c - LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
3 G3 ]6 x- G: ]6 z( q' ] - if(LPDF_OK != ret)
5 \: H; y) y1 s% H1 ?6 |# o- j - return ret;
- k( x; G9 P6 v! T J) O( k - LPDF_FPRINTF(&pdf->file,"ET\n");: T. X( ]6 P1 x4 {* B# v d
- pdf->offset += 3;
# S& P3 q" |) O/ \% W. F - page->length += 3;# R0 J, Z5 g* _
- page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;. F; N: ]2 z) ^' l3 y# Y0 a& u4 }
- return LPDF_OK;
1 G" z7 @4 Q" Z, K- Z - }. ?) [' k# U3 v6 Y8 }$ \( K2 p% u9 q
- M1 W% n q2 M4 @0 E/ m |- LPDF_STATUS LPDF_Page_ShowText(LPDF_Page page, const char *text)
* M3 j' W9 \7 O; q' F6 u# H+ ~ - {& I" w) u& r, e2 o0 Z
- LPDF_INT length = 0;
9 `8 l* C6 T( d+ y: c% @ - LPDF_UINT writeBytes = 0;; r$ O" s* B e, O
- LPDF_Doc pdf = (LPDF_Doc)page->doc;
) o% r( R1 p/ P- ~5 x" o6 ^' T - LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
% E% \4 ~4 o( w1 \5 F - if(LPDF_OK != ret)
2 m! n* ~1 D8 e4 h. ^ - return ret;
; @4 W- s0 Z2 [ - if(LPDF_FONT_INVALID == page->fontType)/ |8 k) s' B& S9 x S. S$ d
- return LPDF_OK;
, s- {. T# @5 c0 y - length = LPDF_SPRINTF(pdf_buf,"(%s) Tj\n",text);, z1 X, i) [- y# `' W
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
# z5 q& H4 A6 @7 o, ]3 v) K - pdf->offset += length;
3 M$ W! b2 r5 W - page->length += length;
/ t0 _) y) t# C1 b( V9 g, F0 ^ - return LPDF_OK;4 U& x, I0 ]" f
- ' e9 \' b) ]" [7 k: Q) ` k
- }- j& l" [2 ]/ Q( `# ~
- LPDF_STATUS LPDF_Page_MoveTextPos(LPDF_Page page,& T0 T/ u1 \7 }$ p7 u
- LPDF_INT x, LPDF_INT y)
0 ^; A" U( _: K5 G6 O! x9 Q5 E - {
5 u0 i( _3 t1 E5 S2 I7 v - LPDF_INT length = 0;
1 K4 v2 d! @5 ]1 S# N ? - LPDF_UINT writeBytes = 0;2 n- L3 L! N" T% H
- LPDF_Doc pdf = (LPDF_Doc)page->doc;; Y$ j. t3 j6 I: S, K. J9 q
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT);
4 R: P+ ?9 V) ?. Y/ ^ - if(LPDF_OK != ret)
4 ~* C, x% ?/ D% ? - return ret;
( O4 j3 }& c" q' ~ - length = LPDF_SPRINTF(pdf_buf,"%d %d Td\n",x,y);
! O8 b+ ]1 E0 m: c - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);, } Y+ V, R! Q7 b
- pdf->offset += length;
* a% A' G u) [2 }2 Y6 F - page->length += length;6 h- }6 |6 o0 Y+ J' a# v* p
- * B' s& M$ |# K6 {& }- [
- return LPDF_OK;3 S! m. u% J0 ?3 b( B+ ^. c( K
- }
' M" U8 M/ c4 | - LPDF_STATUS LPDF_Page_TextOut(LPDF_Page page,
8 a& w. M' Q7 H* w' W - LPDF_UINT16 x, LPDF_UINT16 y,( g, Q# v' Z! k, I( O
- const char *text)# s# O$ @7 N0 N, a! F d
- {6 V' |+ Y; E" `4 {# r6 V/ `
- return LPDF_OK;
+ n0 y" x. W h, i. i9 I - }8 O/ C1 O4 w4 P/ `( H4 O9 G* a, E+ t
- 8 E8 {7 ?! d" v% f7 [
- LPDF_STATUS LPDF_Page_SetRGBStroke(LPDF_Page page,: l" i0 J) b, E# ]8 O/ T
- LPDF_REAL r," d/ F) Z; n2 y- v
- LPDF_REAL g,
* N# l9 O# P; k9 m - LPDF_REAL b)
( K/ N) i: a4 d4 E N5 V - {
( v) X5 \* l% ^9 i( V9 y - LPDF_INT length = 0;
E& ~. _; ]& f$ H6 ^) ? - LPDF_UINT writeBytes = 0;
% \ ~* c! n# F9 n - LPDF_Doc pdf = (LPDF_Doc)page->doc;* \. K7 V3 B& [+ y! k
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_TEXT_OBJECT|LPDF_GMODE_PAGE_DESCRIPTION);
}) U/ C; r2 A: k7 ?+ B+ `, r - if(LPDF_OK != ret)0 e- c, B6 o2 G2 t) w7 J$ \. ?7 y
- return ret;' L- @% y( A) s/ ?( r* H( w
* X4 d# W* a8 p A( Y- length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f RG\n",r,g,b);
" V# I' S. I" _- y& } - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);# m6 s8 p2 K0 u' N& j
- pdf->offset += length;5 ^% U9 x7 h5 }5 w# z+ Y
- page->length += length;4 V2 M( S* s( Z3 F
- return LPDF_OK;
3 e+ w: v+ l2 @) f - }, @# S) M5 ^1 Z
2 F" {6 X& y7 D) x3 p$ W; M& C- LPDF_STATUS LPDF_Page_SetRGBFill(LPDF_Page page,
1 ~: g, I- R- b( ]6 S6 k - LPDF_REAL r,
0 A2 w+ @; {+ ]' Z, C0 x* d - LPDF_REAL g,0 m _5 j4 E9 e- a6 e" R
- LPDF_REAL b)3 e. F2 q0 s, p: k6 Z
- {
- D. k( K# A" u% l - LPDF_INT length = 0;4 v) \, n$ @. q: L2 X
- LPDF_UINT writeBytes = 0;
E d6 ~) y' x9 ?& p - LPDF_Doc pdf = (LPDF_Doc)page->doc;- s+ R3 W% J3 X
- 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
- if(LPDF_OK != ret)
% y& l: j1 F7 G* c1 x" M L) d - return ret;
7 y; ^! u2 R+ v* f6 w
. d4 v) H8 j2 [$ G* o- length = LPDF_SPRINTF(pdf_buf,"%.1f %.1f %.1f rg\n",r,g,b);
! r/ u% @9 Q0 G/ S - LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
" S$ y& V! h9 J3 l - pdf->offset += length;
$ `* Y3 Z4 c0 f8 H9 { - page->length += length;
2 A; h+ `( M# X% O - return LPDF_OK;0 o$ B& j7 X7 R# S$ r1 m
- }
1 F- {3 t; z9 F& d - LPDF_STATUS LPDF_Page_MoveTo (LPDF_Page page,
7 p% T, O5 k& y; K3 U# _ - LPDF_UINT16 x,# V8 w( e$ Z6 V) Z* D6 Y. U
- LPDF_UINT16 y)# M, J% g' Y/ i" F' y0 y
- {* l: {: R7 }" s: j& ]' e
- LPDF_INT length = 0;% o# a0 K8 H( ?) J8 ?
- LPDF_UINT writeBytes = 0;. q! c- k, H/ i2 R( ^5 J5 ~
- LPDF_Doc pdf = (LPDF_Doc)page->doc; C: ?+ f, t8 Q
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PAGE_DESCRIPTION|LPDF_GMODE_PATH_OBJECT);
/ |0 O6 o- v7 N6 }$ Z - if(LPDF_OK != ret), n1 P8 m$ H8 Y/ J; c m: `% b! a8 P
- return ret;" \7 k8 `2 F/ Y9 I* E! P
- length = LPDF_SPRINTF(pdf_buf,"%d %d m\n",x,y);2 ^# c% |: t# L0 y/ P A0 P; y
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);
) J B, y1 u0 P - pdf->offset += length;8 ?7 p I' ~ K, Q
- page->length += length;
1 |; d) \ b1 m7 P& p - page->gMode = LPDF_GMODE_PATH_OBJECT;
F* h6 I$ k& f n6 f9 a - return LPDF_OK;
) `- W n4 ^" j! f6 {3 F, i* F' G% T - }
4 Y" T4 Z/ g+ u0 w; @# \% w a; V! ] - LPDF_STATUS LPDF_Page_LineTo (LPDF_Page page,% h5 |! T: e& v8 I& c
- LPDF_UINT16 x,
9 }4 L0 z! z" C - LPDF_UINT16 y)+ ^6 F, v; ~- k7 n4 N& E( o
- {
3 U1 }( K: L R% A9 T& u - LPDF_INT length = 0;
/ X% O% d" O4 Z$ ~ - LPDF_UINT writeBytes = 0;" O2 X$ H9 S1 Z4 ` F
- LPDF_Doc pdf = (LPDF_Doc)page->doc;+ T$ D4 l) O$ `: @. x
- LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);
* I: I" s) y1 E - if(LPDF_OK != ret)
, ` W! z' S3 M0 u; t- z - return ret;8 q2 }& X; A7 N: f" d) V$ f
- length = LPDF_SPRINTF(pdf_buf,"%d %d l\n",x,y);* N' A7 H# E9 Q8 C. E3 U
- LPDF_FWRITE(&pdf->file,pdf_buf,length,&writeBytes);; o+ ~5 H" Z9 `& ^* H) ] b
- pdf->offset += length;
, D4 T% {( Z' D - page->length += length;/ \- g4 W- h5 ^; Z/ z
- return LPDF_OK;; c g0 ^5 j, S% W. O4 s
- }' a s1 z# W& C9 k' ^
- LPDF_STATUS LPDF_Page_Stroke(LPDF_Page page)
$ Y7 Q* Q' i0 Q2 P u5 W - {
1 t+ h& v v- H ~! W s G - LPDF_Doc pdf = (LPDF_Doc)page->doc;
$ G* p! x2 D0 P: L% g - LPDF_STATUS ret = LPDF_Page_CheckState(page,LPDF_GMODE_PATH_OBJECT);6 s) x, {7 @6 J
- if(LPDF_OK != ret)- u+ l% w) n! P7 Z: B
- return ret;, \; J1 F; u- |! R
- LPDF_FPRINTF(&pdf->file,"S\n");* E; X" g% Q2 K/ ^# X. v2 Z, L( N
- pdf->offset += 2;
$ S; F% P0 H* v6 O- I - page->length += 2;& D& ?/ ?9 f1 [4 D) d6 ?
- page->gMode = LPDF_GMODE_PAGE_DESCRIPTION;
N* l E3 R& j8 z - return LPDF_OK;# a# a- y. ~$ T; y
- }
v3 l2 p5 y _ n5 O - LPDF_STATUS LPDF_Page_DrawImage(LPDF_Page page,
6 g' v% N$ X! v5 |( }- V - LPDF_Image image,
; x* S: V) S. i( U - LPDF_UINT16 x,. h2 e2 O. N0 d1 O
- LPDF_UINT16 y,
6 o0 O4 F P3 P. n1 P/ ?8 x* g - LPDF_UINT16 width,
5 Q2 |1 `( e) ^: v - LPDF_UINT16 height)( \1 a# F: e% c8 d! c
- {
* E P/ p, o; k+ ^4 J X - return LPDF_OK;
6 \9 @, |2 H- c$ _ - }
) z6 W& _* \5 q
复制代码对于pdf文件结构可以去查看pdf参考手册,这里我看的是pdf-1.4参考手册,该库的测试代码我是在基于LPC54608库中的sdcard_fatfs示例改编的,同样适用于STM32,关键代码如下: - pdf = LPDF_New();
R3 \# W d" a! ~ - page[0] = LPDF_AddPage(pdf);
3 @+ g8 H* e' C2 l; s" ?# o9 b - LPDF_Page_SaveParams(page[0]);3 \1 _' K& f( d& G5 |; z" c4 h
- width = LPDF_Page_GetWidth(page[0]);" |* O# C+ k4 y7 Y4 G
- height = LPDF_Page_GetHeight(page[0]);- s0 s0 G% E: k* X7 o. ^
- LPDF_Page_SetRGBFill(page[0], 1.0, 0.0, 0.0);$ ?" T% a( T. j8 h* e2 n
- LPDF_Page_BeginText(page[0]);
$ u. F7 T {" W T4 n N - LPDF_Page_MoveTextPos(page[0], 50, height-20);
- N+ @$ K% I- U1 \" e6 |% s - while(font_list[i])8 N1 _# t" n; z, F8 U+ A) b: H7 k
- {' j0 u6 n* l e7 | i- Z
- LPDF_Page_SetFontAndSize(page[0], font_list[i], 24);
! t# x0 W+ ^: |) K& ? - LPDF_Page_ShowText(page[0], "abcdefgABCDEFG12345!\043$\045&+-@?");
2 i$ M& ]+ {, U - LPDF_Page_MoveTextPos(page[0], 0, -30);: o1 C# [ n6 r3 D
- i++;# j: x7 w# F4 D
- }
+ C9 m+ @' z4 u2 P. J1 k- Q. ~6 O7 l - LPDF_Page_SetFontAndSize(page[0], font_list[0], 24);
) x& }$ A+ ~: q" Y5 I' g - LPDF_Page_ShowText(page[0], LPDF_GetVersion());1 ?1 ]0 z* U, u( i! f _7 i
- LPDF_Page_EndText(page[0]);
1 C: Z+ n9 `8 U4 z5 j, | - LPDF_Page_SaveContext(page[0]);
8 h1 m8 I; w# R& m& b - page[1] = LPDF_AddPage(pdf);
# j4 s5 A# V2 \; ?5 f% g - LPDF_Page_SaveParams(page[1]);
j" Y4 p }2 Q9 N3 K' E" n9 r - LPDF_Page_MoveTo(page[1], width/2-50, height-200);: @5 J, r4 l0 u
- LPDF_Page_LineTo(page[1], width/2-50, height-300);
/ B4 d9 j1 D7 M" |; |$ [+ S/ K - LPDF_Page_LineTo(page[1], width/2-50+100, height-300);! C4 d4 ^; j2 F4 B6 X7 v
- LPDF_Page_LineTo(page[1], width/2-50+100, height-200); t2 c" u) x+ G. g, [& q3 `. c
- LPDF_Page_LineTo(page[1], width/2-50, height-200);
" v) X, N% C0 } P0 M - LPDF_Page_LineTo(page[1], width/2-50+40, height-140);
: e+ c% e5 i! b; Y0 |# A - LPDF_Page_LineTo(page[1], width/2-50+40+100, height-140);
1 D+ l7 l: h9 T# h$ g - LPDF_Page_LineTo(page[1], width/2-50+100, height-200);# L3 v: I' Q7 n4 E
- LPDF_Page_Stroke(page[1]);6 E" h, j% n! R E6 g& D! l. h
- LPDF_Page_MoveTo(page[1], width/2-50+40+100, height-140);
# w4 ^) p0 W7 K5 s$ d - LPDF_Page_LineTo(page[1], width/2-50+40+100, height-240);7 A X$ ^: c g: p* W
- LPDF_Page_LineTo(page[1], width/2-50+100, height-300);/ ~( q( n) |+ u) R% s9 J
- LPDF_Page_Stroke(page[1]);
! V: Y1 t' ~6 R$ I2 A8 \# R9 X _/ O - LPDF_Page_SaveContext(page[1]);
; |5 {1 q* Z* }/ i - LPDF_SaveToFile(pdf, "/red.pdf");) r: C& o. r2 A7 }0 s
- PRINTF("\r\nCreate pdf file success!\r\n");) S, B8 G; f; o
-
复制代码代码很简单,生成了一个含有两个page的pdf文件,在第一页中用了不同的字体来显示同一个字符串,可以参考libHaru中的font_demo示例,第二页中是画了一个立方体图,下载代码到目标板,并运行该示例,效果如下:
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 |
LZ,我怎么没看到有添加image的接口,您的pdflib.c中LPDF_LoadRawImageFromFile也没有实现哇,您说的可以添加image,是哪里~LPDF_LoadRawImageFromMem这个是直接传入读到图片的buf么?有什么办法可以直接拿别的pdf中通过编辑软件看到pdf语法格式,拷贝图片的那段buf,直接添加到我自己的pdf中呢?
66楼附件有的
这个我也还没遇到过,只是之前看到有人问这个,所以看看
这个还只是一个简单的库,实用性还是差一些的
ff.h是FATfs中的文件
嗯,这个画线能改变线宽吗