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