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