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