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