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