| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- // fpdf.h
- //
- #ifndef LZZ_fpdf_h
- #define LZZ_fpdf_h
- #include <string>
- #include <vector>
- #include <map>
- #include "pdf-font.h"
- typedef float pdf_float_t;
- #define LZZ_INLINE inline
- std::string & gzcompress (std::string & dest, std::string const & src);
- std::string & gzuncompress (std::string & dest, std::string const & src);
- extern char const * FPDF_FONTPATH;
- class FPDF
- {
- public:
- enum e_orientation
- {
- e_orientation_none,
- e_orientation_portrait,
- e_orientation_landscape
- };
- enum e_units
- {
- e_units_none,
- e_mm,
- e_pt,
- e_cm,
- e_in
- };
- enum e_page_sizes
- {
- e_page_size_none,
- e_A3,
- e_A4,
- e_A5,
- e_Letter,
- e_Legal,
- e_page_sizes_last
- };
- enum e_zoom_mode
- {
- e_zoom_default,
- e_zoom_fullpage,
- e_zoom_fullwidth,
- e_zoom_real
- };
- enum e_layout_mode
- {
- e_layout_default,
- e_layout_single,
- e_layout_continuous,
- e_layout_two
- };
- struct st_image
- {
- pdf_float_t w;
- pdf_float_t h;
- std::string cs;
- std::string dp;
- std::string f;
- std::string parms;
- std::string pal;
- std::string trns;
- std::string imgdata;
- std::string file;
- std::string data;
- std::string smask;
- int i;
- int n;
- int bpc;
- };
- struct st_pagesize
- {
- pdf_float_t w;
- pdf_float_t h;
- };
- struct st_link
- {
- int from;
- int to;
- };
- struct st_page_link
- {
- pdf_float_t x;
- pdf_float_t y;
- pdf_float_t w;
- pdf_float_t h;
- int link;
- };
- struct pdf_color_t
- {
- unsigned char r;
- unsigned char g;
- unsigned char b;
- unsigned char t;
- };
- protected:
- int m_page;
- int m_n;
- std::vector <int> m_offsets;
- std::string m_buffer;
- std::vector <std::string> m_pages;
- int m_state;
- int m_compress;
- pdf_float_t m_k;
- e_orientation m_DefOrientation;
- e_orientation m_CurOrientation;
- st_pagesize m_DefPageSize;
- st_pagesize m_CurPageSize;
- std::map <int, st_pagesize> m_PageSizes;
- pdf_float_t m_wPt;
- pdf_float_t m_hPt;
- pdf_float_t m_w;
- pdf_float_t m_h;
- pdf_float_t m_angle;
- pdf_float_t m_lMargin;
- pdf_float_t m_tMargin;
- pdf_float_t m_rMargin;
- pdf_float_t m_bMargin;
- pdf_float_t m_cMargin;
- pdf_float_t m_x;
- pdf_float_t m_y;
- pdf_float_t m_lasth;
- pdf_float_t m_LineWidth;
- std::string m_fontpath;
- typedef std::map <std::string, st_pdf_font_base*> font_map_t;
- font_map_t m_fonts;
- std::vector <int> m_FontFiles;
- std::vector <int> m_diffs;
- std::string m_FontFamily;
- std::string m_FontStyle;
- bool m_underline;
- st_pdf_font_base * m_CurrentFont;
- pdf_float_t m_FontSizePt;
- pdf_float_t m_FontSize;
- std::string m_DrawColor;
- pdf_color_t m_DrawColor_rgb;
- std::string m_FillColor;
- pdf_color_t m_FillColor_rgb;
- std::string m_TextColor;
- pdf_color_t m_TextColor_rgb;
- bool m_ColorFlag;
- pdf_float_t m_ws;
- typedef std::map <std::string, st_image> image_map_t;
- image_map_t m_images;
- typedef std::map <int, st_page_link> link_map_t;
- link_map_t m_PageLinks;
- std::vector <st_link> m_links;
- bool m_AutoPageBreak;
- pdf_float_t m_PageBreakTrigger;
- bool m_InHeader;
- bool m_InFooter;
- e_zoom_mode m_ZoomMode;
- int m_CustomZoom;
- int m_LayoutMode;
- std::string m_title;
- std::string m_subject;
- std::string m_author;
- std::string m_keywords;
- std::string m_creator;
- std::string m_AliasNbPages;
- std::string m_PDFVersion;
- char (m_scratch_buf) [128];
- struct st_alpha_t
- {
- int n;
- pdf_float_t alpha;
- std::string bm;
- };
- std::vector <st_alpha_t> m_extgstates;
- pdf_float_t m_outerMargin;
- pdf_float_t m_innerMargin;
- pdf_float_t m_xDelta;
- bool m_doubleSided;
- std::string m_javascript;
- int m_n_js;
- public:
- virtual ~ FPDF ();
- FPDF ();
- FPDF (e_orientation orientation, e_units unit, e_page_sizes psize);
- FPDF (char orientation, char const * unit, char const * psize);
- void reset (e_orientation orientation = e_orientation_portrait, e_units unit = e_mm, e_page_sizes psize = e_A4);
- void SetDoubleSided (pdf_float_t inner = 7, pdf_float_t outer = 13);
- void SetMargins (pdf_float_t left, pdf_float_t top, pdf_float_t right = 0.0f);
- void SetLeftMargin (pdf_float_t margin);
- void SetTopMargin (pdf_float_t margin);
- void SetRightMargin (pdf_float_t margin);
- pdf_float_t GetLeftMargin ();
- pdf_float_t GetRightMargin ();
- void SetAutoPageBreak (bool b, pdf_float_t margin = 0.0f);
- void CheckPageBreak (pdf_float_t height);
- void setCustomZoom (int zoom);
- int getCustomZoom ();
- void SetDisplayMode (e_zoom_mode zoom, e_layout_mode layout = e_layout_default);
- void SetCompression (bool compress);
- void SetTitle (char const * title);
- void SetSubject (char const * subject);
- void SetAuthor (char const * author);
- void SetKeywords (char const * keywords);
- void SetCreator (char const * creator);
- void AliasNbPages (char const * alias = "{nb}");
- std::string const & GetAliasNbPages ();
- void Error (char const * msg, ...);
- void Open ();
- void Close ();
- void AddPage (e_orientation orientation = e_orientation_none, st_pagesize * psize = 0);
- virtual void Header ();
- virtual void Footer ();
- int PageNo ();
- void SetDrawColor (unsigned char r);
- void SetDrawColor (unsigned char r, unsigned char g, unsigned char b);
- void SetDrawColor (pdf_color_t & color);
- void GetDrawColor (pdf_color_t & color);
- void SetFillColor (unsigned char r);
- void SetFillColor (unsigned char r, unsigned char g, unsigned char b);
- void SetFillColor (pdf_color_t & color);
- void GetFillColor (pdf_color_t & color);
- void SetTextColor (unsigned char r);
- void SetTextColor (unsigned char r, unsigned char g, unsigned char b);
- void SetTextColor (pdf_color_t & color);
- void GetTextColor (pdf_color_t & color);
- void SetAlpha (pdf_float_t alpha, char const * bm = 0);
- pdf_float_t GetStringWidth (char const * s);
- pdf_float_t GetStringWidth (std::string const & s);
- void SetLineWidth (pdf_float_t width);
- void SetDash (pdf_float_t black = -1, pdf_float_t white = -1);
- void Line (pdf_float_t x1, pdf_float_t y1, pdf_float_t x2, pdf_float_t y2);
- void Rect (pdf_float_t x, pdf_float_t y, pdf_float_t w, pdf_float_t h, char const * style = 0);
- void AddFont (char const * afamily, char const * astyle = 0, char const * afile = 0);
- struct font_settings_st
- {
- std::string family;
- std::string style;
- pdf_float_t size;
- };
- void GetFontSettings (font_settings_st & fs);
- void SetFontSettings (font_settings_st & fs);
- void SetFont (char const * afamily = 0, char const * astyle = 0, pdf_float_t size = 0);
- void SetFontSize (pdf_float_t size);
- pdf_float_t GetFontSize ();
- int AddLink ();
- void SetLink (int link, pdf_float_t y = 0, int page = -1);
- void Link (pdf_float_t x, pdf_float_t y, pdf_float_t w, pdf_float_t h, int link);
- protected:
- void _TextBase (std::string & result, pdf_float_t x, pdf_float_t y, char const * txt);
- public:
- void Rotate (pdf_float_t angle, pdf_float_t x = -1, pdf_float_t y = -1);
- void RotatedText (pdf_float_t x, pdf_float_t y, char const * txt, pdf_float_t angle);
- void RotatedText (pdf_float_t x, pdf_float_t y, std::string const & txt, pdf_float_t angle);
- void ClippingText (pdf_float_t x, pdf_float_t y, char const * txt, bool outline = false);
- void Text (pdf_float_t x, pdf_float_t y, char const * txt);
- void TextShadow (pdf_float_t x, pdf_float_t y, char const * txt, pdf_float_t displacement = .3);
- virtual bool AcceptPageBreak ();
- void Cell (pdf_float_t w, pdf_float_t h = 0.0f, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void Cell (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void MultiCell (pdf_float_t w, pdf_float_t h, char const * txt, char const * border = 0, char align = 'J', bool fill = false);
- void MultiCell (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, char align = 'J', bool fill = false);
- int CalcLines (pdf_float_t w, char const * txt);
- void MultiCellBlt (pdf_float_t w, pdf_float_t h, char const * blt, char const * txt, char const * border = 0, char align = 'J', bool fill = false);
- void ClippingRect (pdf_float_t x, pdf_float_t y, pdf_float_t w, pdf_float_t h, bool outline = false);
- void UnsetClipping ();
- void ClippedCell (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFit (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0, bool scale = false, bool force = true);
- void CellFitScale (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitScale (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitScaleForce (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitScaleForce (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitSpace (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitSpace (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitSpaceForce (pdf_float_t w, pdf_float_t h = 0, char const * txt = 0, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void CellFitSpaceForce (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border = 0, int ln = 0, char align = ' ', bool fill = false, int link = 0);
- void Write (pdf_float_t h, char const * txt, int link = 0);
- void Ln (pdf_float_t h = 0.0);
- void Image (char const * image_name, unsigned char const * image_blob, size_t blob_size, pdf_float_t x = -1, pdf_float_t y = -1, pdf_float_t w = 0.0, pdf_float_t h = 0.0, char const * atype = 0, int link = 0);
- void Image (char const * file, pdf_float_t x = -1, pdf_float_t y = -1, pdf_float_t w = 0.0, pdf_float_t h = 0.0, char const * atype = 0, int link = 0);
- pdf_float_t GetX ();
- void SetX (pdf_float_t x);
- pdf_float_t GetY ();
- void SetY (pdf_float_t y);
- void SetXY (pdf_float_t x, pdf_float_t y);
- pdf_float_t GetW ();
- pdf_float_t GetH ();
- std::string Output (char const * name = 0, char dest = ' ');
- void RoundedRect (pdf_float_t x, pdf_float_t y, pdf_float_t w, pdf_float_t h, pdf_float_t r, char const * style = "");
- void Circle (pdf_float_t x, pdf_float_t y, pdf_float_t r, char const * style = "D");
- void Ellipse (pdf_float_t x, pdf_float_t y, pdf_float_t rx, pdf_float_t ry, char const * style = "D");
- void IncludeJS (char const * script);
- protected:
- void _Arc (pdf_float_t x1, pdf_float_t y1, pdf_float_t x2, pdf_float_t y2, pdf_float_t x3, pdf_float_t y3);
- std::string & _erasestrch (std::string & str, char c);
- void _str_tolower (std::string & str);
- void _dochecks ();
- void _checkoutput ();
- st_pagesize & _getpagesize (st_pagesize & result, e_page_sizes size);
- void _beginpage (e_orientation orientation = e_orientation_none, st_pagesize * size = 0);
- void _endpage ();
- std::string _escape (std::string const & s);
- void _textstring (std::string & result, std::string const & s);
- int substr_count (char const * str, char c);
- std::string _dounderline (pdf_float_t x, pdf_float_t y, char const * txt);
- struct blob_stream_t
- {
- virtual bool eof () = 0;
- virtual size_t tell () = 0;
- virtual size_t read (void * dest, size_t num_read) = 0;
- virtual void seek (size_t to_offset, int whence) = 0;
- virtual ~ blob_stream_t ();
- };
- struct blob_stream_memory_t : public blob_stream_t
- {
- size_t size;
- size_t offset;
- unsigned char const * blob;
- blob_stream_memory_t (unsigned char const * ablob, size_t asize);
- bool eof ();
- size_t tell ();
- size_t read (void * dest, size_t num_read);
- void seek (size_t to_offset, int whence);
- };
- struct blob_stream_file_t : public blob_stream_t
- {
- FILE * fp;
- blob_stream_file_t (FILE * afp);
- ~ blob_stream_file_t ();
- bool eof ();
- size_t tell ();
- size_t read (void * dest, size_t num_read);
- void seek (size_t to_offset, int whence);
- };
- void _parsejpg (st_image & info, blob_stream_t & fp, char const * image_name);
- void _parsejpg (st_image & info, char const * file_name);
- void _parsejpg_blob (st_image & info, char const * image_name, unsigned char const * image_blob, size_t blob_size);
- void _parsepng (st_image & info, char const * file_name);
- void _parsepng_blob (st_image & info, char const * image_name, unsigned char const * image_blob, size_t blob_size);
- void _getGrayImgColorAndalpha (std::string & color, std::string & alpha, std::string & line);
- void _getRGBImgColorAndalpha (std::string & color, std::string & alpha, std::string & line);
- void _parsepngstream (st_image & info, blob_stream_t & fp, char const * image_name);
- std::string & _readstream (std::string & result, blob_stream_t & fp, size_t n);
- int _readint (blob_stream_t & fp);
- int _readshort (blob_stream_t & fp);
- void _parsegif (std::string & file);
- void _newobj ();
- void _putstream (std::string const & s);
- void _out (char const * s, size_t size, bool nl = true);
- std::string & pdf_sprintf (std::string & s, char const * fmt, ...);
- void pdf_sprintf_append (std::string & s, char const * fmt, ...);
- void _outfmt (bool nl, char const * fmt, ...);
- void _out (char const * s, bool nl = true);
- void _out (std::string const & s, bool nl = true);
- void _putpages ();
- void _putfonts ();
- void _putimages ();
- void _putimage (st_image & info);
- void _putxobjectdict ();
- void _putextgstates ();
- void _putjavascript ();
- void _putresourcedict ();
- void _putresources ();
- void _putinfo ();
- void _putcatalog ();
- void _putheader ();
- void _puttrailer ();
- void _enddoc ();
- };
- LZZ_INLINE void FPDF::SetTopMargin (pdf_float_t margin)
- {
- // Set top margin
- m_tMargin = margin;
- }
- LZZ_INLINE void FPDF::SetRightMargin (pdf_float_t margin)
- {
- // Set right margin
- m_rMargin = margin;
- }
- LZZ_INLINE pdf_float_t FPDF::GetLeftMargin ()
- {
- return m_lMargin;
- }
- LZZ_INLINE pdf_float_t FPDF::GetRightMargin ()
- {
- return m_rMargin;
- }
- LZZ_INLINE void FPDF::setCustomZoom (int zoom)
- {
- m_CustomZoom = zoom;
- }
- LZZ_INLINE int FPDF::getCustomZoom ()
- {
- return m_CustomZoom;
- }
- LZZ_INLINE std::string const & FPDF::GetAliasNbPages ()
- {
- // Define an alias for total number of pages
- return m_AliasNbPages;
- }
- LZZ_INLINE void FPDF::Open ()
- {
- // Begin document
- m_state = 1;
- }
- LZZ_INLINE int FPDF::PageNo ()
- {
- // Get current page number
- return m_page;
- }
- LZZ_INLINE void FPDF::SetDrawColor (pdf_color_t & color)
- {
- SetDrawColor(color.r, color.g, color.b);
- }
- LZZ_INLINE void FPDF::GetDrawColor (pdf_color_t & color)
- {
- color = m_DrawColor_rgb;
- }
- LZZ_INLINE void FPDF::SetFillColor (pdf_color_t & color)
- {
- SetFillColor(color.r, color.g, color.b);
- }
- LZZ_INLINE void FPDF::GetFillColor (pdf_color_t & color)
- {
- color = m_FillColor_rgb;
- }
- LZZ_INLINE void FPDF::SetTextColor (pdf_color_t & color)
- {
- SetTextColor(color.r, color.g, color.b);
- }
- LZZ_INLINE void FPDF::GetTextColor (pdf_color_t & color)
- {
- color = m_TextColor_rgb;
- }
- LZZ_INLINE pdf_float_t FPDF::GetStringWidth (std::string const & s)
- {
- return GetStringWidth(s.c_str());
- }
- LZZ_INLINE pdf_float_t FPDF::GetFontSize ()
- {
- return m_FontSizePt;
- }
- LZZ_INLINE void FPDF::RotatedText (pdf_float_t x, pdf_float_t y, std::string const & txt, pdf_float_t angle)
- {
- RotatedText(x, y, txt.c_str(), angle);
- }
- LZZ_INLINE void FPDF::Cell (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, int ln, char align, bool fill, int link)
- {
- Cell(w, h, txt.c_str(), border, ln, align, fill, link);
- }
- LZZ_INLINE void FPDF::MultiCell (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, char align, bool fill)
- {
- MultiCell(w, h, txt.c_str(), border, align, fill);
- }
- LZZ_INLINE void FPDF::CellFitScale (pdf_float_t w, pdf_float_t h, char const * txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt,border,ln,align,fill,link,true,false);
- }
- LZZ_INLINE void FPDF::CellFitScale (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt.c_str(),border,ln,align,fill,link,true,false);
- }
- LZZ_INLINE void FPDF::CellFitScaleForce (pdf_float_t w, pdf_float_t h, char const * txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt,border,ln,align,fill,link,true,true);
- }
- LZZ_INLINE void FPDF::CellFitScaleForce (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt.c_str(),border,ln,align,fill,link,true,true);
- }
- LZZ_INLINE void FPDF::CellFitSpace (pdf_float_t w, pdf_float_t h, char const * txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt,border,ln,align,fill,link,false,false);
- }
- LZZ_INLINE void FPDF::CellFitSpace (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, int ln, char align, bool fill, int link)
- {
- CellFit(w,h,txt.c_str(),border,ln,align,fill,link,false,false);
- }
- LZZ_INLINE void FPDF::CellFitSpaceForce (pdf_float_t w, pdf_float_t h, char const * txt, char const * border, int ln, char align, bool fill, int link)
- {
- //Same as calling CellFit directly
- CellFit(w,h,txt,border,ln,align,fill,link,false,true);
- }
- LZZ_INLINE void FPDF::CellFitSpaceForce (pdf_float_t w, pdf_float_t h, std::string const & txt, char const * border, int ln, char align, bool fill, int link)
- {
- //Same as calling CellFit directly
- CellFit(w,h,txt.c_str(),border,ln,align,fill,link,false,true);
- }
- LZZ_INLINE pdf_float_t FPDF::GetX ()
- {
- // Get x position
- return m_x;
- }
- LZZ_INLINE pdf_float_t FPDF::GetY ()
- {
- // Get y position
- return m_y;
- }
- LZZ_INLINE void FPDF::SetXY (pdf_float_t x, pdf_float_t y)
- {
- // Set x and y positions
- SetY(y);
- SetX(x);
- }
- LZZ_INLINE pdf_float_t FPDF::GetW ()
- {
- // Get y position
- return m_w;
- }
- LZZ_INLINE pdf_float_t FPDF::GetH ()
- {
- // Get y position
- return m_h;
- }
- LZZ_INLINE void FPDF::_endpage ()
- {
- if(m_angle!=0)
- {
- m_angle=0;
- _out("Q");
- }
- m_state = 1;
- }
- #undef LZZ_INLINE
- #endif
|