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