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