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