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