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