cpp/poppler-document.cpp | 10 ++--- cpp/poppler-document.h | 2 - cpp/poppler-embedded-file.cpp | 8 ++-- cpp/poppler-embedded-file.h | 4 +- cpp/poppler-font.cpp | 79 ++++++++++++++++++++++++++++++++++++++++-- cpp/poppler-global.cpp | 25 +------------ cpp/poppler-global.h | 4 +- cpp/poppler-page.cpp | 68 ++++++++++++++++++++++++++++++++++++ cpp/poppler-private.cpp | 25 +++++++++++++ cpp/poppler-private.h | 2 + poppler/XRef.cc | 2 - 11 files changed, 191 insertions(+), 38 deletions(-)
New commits: commit a72c68117ba05f3934e2df227cdcaf53a375f0ce Author: Pino Toscano <[email protected]> Date: Fri May 28 18:11:02 2010 +0200 [cpp apidox] add a start of API documentation for the 'page' class diff --git a/cpp/poppler-page.cpp b/cpp/poppler-page.cpp index e61415c..1bfb8d4 100644 --- a/cpp/poppler-page.cpp +++ b/cpp/poppler-page.cpp @@ -42,17 +42,41 @@ page_private::~page_private() delete transition; } +/** + \class poppler::page poppler-page.h "poppler/cpp/poppler-page.h" + + A page in a PDF %document. + */ + +/** + \enum poppler::page::orientation_enum + + The possible orientation of a page. +*/ + +/** + \enum poppler::page::search_direction_enum + + The direction/action to follow when performing a text search. +*/ + page::page(document_private *doc, int index) : d(new page_private(doc, index)) { } +/** + Destructor. + */ page::~page() { delete d; } +/** + \returns the orientation of the page + */ page::orientation_enum page::orientation() const { const int rotation = d->page->getRotate(); @@ -71,11 +95,26 @@ page::orientation_enum page::orientation() const } } +/** + The eventual duration the page can be hinted to be shown in a presentation. + + If this value is positive (usually different than -1) then a PDF viewer, when + showing the page in a presentation, should show the page for at most for this + number of seconds, and then switch to the next page (if any). Note this is + purely a presentation attribute, it has no influence on the behaviour. + + \returns the duration time (in seconds) of the page + */ double page::duration() const { return d->page->getDuration(); } +/** + Returns the size of one rect of the page. + + \returns the size of the specified page rect + */ rectf page::page_rect(page_box_enum box) const { PDFRectangle *r = 0; @@ -102,6 +141,9 @@ rectf page::page_rect(page_box_enum box) const return rectf(); } +/** + \returns the label of the page, if any + */ ustring page::label() const { GooString goo; @@ -112,6 +154,14 @@ ustring page::label() const return detail::unicode_GooString_to_ustring(&goo); } +/** + The transition from this page to the next one. + + If it is set, then a PDF viewer in a presentation should perform the + specified transition effect when switching from this page to the next one. + + \returns the transition effect for the switch to the next page, if any + */ page_transition* page::transition() const { if (!d->transition) { @@ -124,6 +174,16 @@ page_transition* page::transition() const return d->transition; } +/** + Search the page for some text. + + \param text the text to search + \param[in,out] r the area where to start search, which will be set to the area + of the match (if any) + \param direction in which direction search for text + \param case_sensitivity whether search in a case sensitive way + \param rotation the rotation assumed for the page + */ bool page::search(const ustring &text, rectf &r, search_direction_enum direction, case_sensitivity_enum case_sensitivity, rotation_enum rotation) const { @@ -173,6 +233,14 @@ bool page::search(const ustring &text, rectf &r, search_direction_enum direction return found; } +/** + Returns the text in the page. + + \param r if not empty, it will be extracted the text in it; otherwise, the + text of the whole page + + \returns the text of the page in the specified rect or in the whole page + */ ustring page::text(const rectf &r) const { std::auto_ptr<GooString> s; commit acf7729e8e270e1b4b2a552272dc280ae6d7b352 Author: Pino Toscano <[email protected]> Date: Fri May 28 17:38:35 2010 +0200 [cpp] fix the font_iterator current page status diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp index 27a0107..ab3b409 100644 --- a/cpp/poppler-font.cpp +++ b/cpp/poppler-font.cpp @@ -62,7 +62,7 @@ public: font_iterator_private(int start_page, document_private *dd) : font_info_scanner(dd->doc, start_page) , total_pages(dd->doc->getNumPages()) - , current_page((std::max)(start_page, 0) - 1) + , current_page((std::max)(start_page, 0)) { } ~font_iterator_private() @@ -206,6 +206,10 @@ font_iterator::~font_iterator() */ std::vector<font_info> font_iterator::next() { + if (!has_next()) { + return std::vector<font_info>(); + } + ++d->current_page; GooList *items = d->font_info_scanner.scan(1); @@ -225,7 +229,7 @@ std::vector<font_info> font_iterator::next() */ bool font_iterator::has_next() const { - return (d->current_page + 1) < d->total_pages; + return d->current_page < d->total_pages; } /** commit 4e017ff24a01cbbf1b39eedc3d7697f8b180fdd9 Author: Pino Toscano <[email protected]> Date: Fri May 28 17:15:28 2010 +0200 [cpp apidox] add API documentation for the 'font_info' and 'font_iterator' classes diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp index 5c3221b..27a0107 100644 --- a/cpp/poppler-font.cpp +++ b/cpp/poppler-font.cpp @@ -74,7 +74,22 @@ public: int current_page; }; +/** + \class poppler::font_info poppler-font.h "poppler/cpp/poppler-font.h" + The information about a font used in a PDF %document. + */ + +/** + \enum poppler::font_info::type_enum + + The various types of fonts available in a PDF %document. +*/ + + +/** + Constructs an invalid font information. + */ font_info::font_info() : d(new font_info_private()) { @@ -85,41 +100,65 @@ font_info::font_info(font_info_private &dd) { } +/** + Copy constructor. + */ font_info::font_info(const font_info &fi) : d(new font_info_private(*fi.d)) { } +/** + Destructor. + */ font_info::~font_info() { delete d; } +/** + \returns the name of the font + */ std::string font_info::name() const { return d->font_name; } +/** + \returns the file name of the font, in case the font is not embedded nor subset + */ std::string font_info::file() const { return d->font_file; } +/** + \returns whether the font is totally embedded in the %document + */ bool font_info::is_embedded() const { return d->is_embedded; } +/** + \returns whether there is a subset of the font embedded in the %document + */ bool font_info::is_subset() const { return d->is_subset; } +/** + \returns the type of the font + */ font_info::type_enum font_info::type() const { return d->type; } +/** + Assignment operator. + */ font_info& font_info::operator=(const font_info &fi) { if (this != &fi) { @@ -128,17 +167,43 @@ font_info& font_info::operator=(const font_info &fi) return *this; } +/** + \class poppler::font_iterator poppler-font.h "poppler/cpp/poppler-font.h" + + Reads the fonts in the PDF %document page by page. + + font_iterator is the way to collect the list of the fonts used in a PDF + %document, reading them incrementally page by page. + + A typical usage of this might look like: + \code +poppler::font_iterator *it = doc->create_font_iterator(); +while (it->has_next()) { + std::vector<poppler::font_info> fonts = it->next(); + // do domething with the fonts +} +// after we are done with the iterator, it must be deleted +delete it; +\endcode + */ + font_iterator::font_iterator(int start_page, document_private *dd) : d(new font_iterator_private(start_page, dd)) { } +/** + Destructor. + */ font_iterator::~font_iterator() { delete d; } +/** + Returns the fonts of the current page and advances to the next one. + */ std::vector<font_info> font_iterator::next() { ++d->current_page; @@ -155,11 +220,17 @@ std::vector<font_info> font_iterator::next() return fonts; } +/** + \returns whether the iterator has more pages to advance to +*/ bool font_iterator::has_next() const { return (d->current_page + 1) < d->total_pages; } +/** + \returns the current page +*/ int font_iterator::current_page() const { return d->current_page; commit 2ff840b62e41e2fc98e9fcff7330f40216de58a5 Author: Pino Toscano <[email protected]> Date: Fri May 28 14:34:37 2010 +0200 [cpp] move the actual convert_date(const char*) implementation in the detail this way it is possible to call it from inside poppler-cpp without an implicit conversion to std::string diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 4a4077d..50d21a4 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -350,7 +350,7 @@ time_type document::info_date(const std::string &key) const Object obj; time_type result = time_type(-1); if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) { - result = convert_date(obj.getString()->getCString()); + result = detail::convert_date(obj.getString()->getCString()); } obj.free(); info.free(); diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp index 1b05a4c..7fe6204 100644 --- a/cpp/poppler-embedded-file.cpp +++ b/cpp/poppler-embedded-file.cpp @@ -103,7 +103,7 @@ int embedded_file::size() const */ time_type embedded_file::modification_date() const { - return convert_date(d->emb_file->modDate()->getCString()); + return detail::convert_date(d->emb_file->modDate()->getCString()); } /** @@ -112,7 +112,7 @@ time_type embedded_file::modification_date() const */ time_type embedded_file::creation_date() const { - return convert_date(d->emb_file->createDate()->getCString()); + return detail::convert_date(d->emb_file->createDate()->getCString()); } /** diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index 509dfdb..fbdf5a9 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -19,10 +19,9 @@ #include "poppler-global.h" -#include "DateInfo.h" +#include "poppler-private.h" #include <cerrno> -#include <ctime> #include <cstring> #include <iostream> @@ -190,25 +189,7 @@ ustring ustring::from_latin1(const std::string &str) */ time_type poppler::convert_date(const std::string &date) { - int year, mon, day, hour, min, sec, tzHours, tzMins; - char tz; - - if (!parseDateString(date.c_str(), &year, &mon, &day, &hour, &min, &sec, - &tz, &tzHours, &tzMins)) { - return time_type(-1); - } - - struct tm time; - time.tm_sec = sec; - time.tm_min = min; - time.tm_hour = hour; - time.tm_mday = day; - time.tm_mon = mon - 1; - time.tm_year = year - 1900; - time.tm_wday = -1; - time.tm_yday = -1; - time.tm_isdst = -1; - return mktime(&time); + return detail::convert_date(date.c_str()); } std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array) diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp index 51d557c..5b63786 100644 --- a/cpp/poppler-private.cpp +++ b/cpp/poppler-private.cpp @@ -18,9 +18,11 @@ #include "poppler-private.h" +#include "DateInfo.h" #include "GooString.h" #include "Page.h" +#include <ctime> #include <iostream> #include <sstream> @@ -105,3 +107,26 @@ GooString* detail::ustring_to_unicode_GooString(const ustring &str) GooString *goo = new GooString(&ba[0]); return goo; } + +time_type detail::convert_date(const char *date) +{ + int year, mon, day, hour, min, sec, tzHours, tzMins; + char tz; + + if (!parseDateString(date, &year, &mon, &day, &hour, &min, &sec, + &tz, &tzHours, &tzMins)) { + return time_type(-1); + } + + struct tm time; + time.tm_sec = sec; + time.tm_min = min; + time.tm_hour = hour; + time.tm_mday = day; + time.tm_mon = mon - 1; + time.tm_year = year - 1900; + time.tm_wday = -1; + time.tm_yday = -1; + time.tm_isdst = -1; + return mktime(&time); +} diff --git a/cpp/poppler-private.h b/cpp/poppler-private.h index fb3bc6c..9f7952b 100644 --- a/cpp/poppler-private.h +++ b/cpp/poppler-private.h @@ -45,6 +45,8 @@ ustring unicode_GooString_to_ustring(GooString *str); ustring unicode_to_ustring(const Unicode *u, int length); GooString* ustring_to_unicode_GooString(const ustring &str); +time_type convert_date(const char *date); + } template <typename ConstIterator> commit 8112e9111313eaded4cd2e89d0e67efb0f3e29db Author: Pino Toscano <[email protected]> Date: Fri May 28 13:13:50 2010 +0200 [cpp] add a time_type typedef ... defined as unsigned int, and use it all around (it changes nothing for client code) diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index ff1beaa..4a4077d 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -334,21 +334,21 @@ ustring document::info_key(const std::string &key) const \returns the time_t value for the \p key \see info_keys, info_date */ -unsigned int document::info_date(const std::string &key) const +time_type document::info_date(const std::string &key) const { if (d->is_locked) { - return (unsigned int)(-1); + return time_type(-1); } Object info; if (!d->doc->getDocInfo(&info)->isDict()) { info.free(); - return (unsigned int)(-1); + return time_type(-1); } Dict *info_dict = info.getDict(); Object obj; - unsigned int result = (unsigned int)(-1); + time_type result = time_type(-1); if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) { result = convert_date(obj.getString()->getCString()); } diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index 5d394bb..665b9e7 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -62,7 +62,7 @@ public: void get_pdf_version(int *major, int *minor) const; std::vector<std::string> info_keys() const; ustring info_key(const std::string &key) const; - unsigned int /*time_t*/ info_date(const std::string &key) const; + time_type info_date(const std::string &key) const; bool is_encrypted() const; bool is_linearized() const; bool has_permission(permission_enum which) const; diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp index bd53a13..1b05a4c 100644 --- a/cpp/poppler-embedded-file.cpp +++ b/cpp/poppler-embedded-file.cpp @@ -101,7 +101,7 @@ int embedded_file::size() const \returns the time_t representing the modification date of the embedded file, if available */ -unsigned int embedded_file::modification_date() const +time_type embedded_file::modification_date() const { return convert_date(d->emb_file->modDate()->getCString()); } @@ -110,7 +110,7 @@ unsigned int embedded_file::modification_date() const \returns the time_t representing the creation date of the embedded file, if available */ -unsigned int embedded_file::creation_date() const +time_type embedded_file::creation_date() const { return convert_date(d->emb_file->createDate()->getCString()); } diff --git a/cpp/poppler-embedded-file.h b/cpp/poppler-embedded-file.h index e4f5c91..307fdd6 100644 --- a/cpp/poppler-embedded-file.h +++ b/cpp/poppler-embedded-file.h @@ -37,8 +37,8 @@ public: std::string name() const; ustring description() const; int size() const; - unsigned int /*time_t*/ modification_date() const; - unsigned int /*time_t*/ creation_date() const; + time_type modification_date() const; + time_type creation_date() const; byte_array checksum() const; std::string mime_type() const; byte_array data() const; diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index 96cb321..509dfdb 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -188,14 +188,14 @@ ustring ustring::from_latin1(const std::string &str) /** Converts a string representing a PDF date to a value compatible with time_t. */ -unsigned int poppler::convert_date(const std::string &date) +time_type poppler::convert_date(const std::string &date) { int year, mon, day, hour, min, sec, tzHours, tzMins; char tz; if (!parseDateString(date.c_str(), &year, &mon, &day, &hour, &min, &sec, &tz, &tzHours, &tzMins)) { - return (unsigned int)(-1); + return time_type(-1); } struct tm time; diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h index 9010af1..5650182 100644 --- a/cpp/poppler-global.h +++ b/cpp/poppler-global.h @@ -72,6 +72,8 @@ enum case_sensitivity_enum { case_sensitive, case_insensitive }; typedef std::vector<char> byte_array; +typedef unsigned int /* time_t */ time_type; + // to disable warning only for this occurrence #ifdef _MSC_VER #pragma warning(push) @@ -100,7 +102,7 @@ private: #pragma warning(pop) #endif -POPPLER_CPP_EXPORT unsigned int /*time_t*/ convert_date(const std::string &date); +POPPLER_CPP_EXPORT time_type convert_date(const std::string &date); POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const byte_array &array); commit bc5bdb43b12437e00aaddc27a74b9ac4b6498446 Author: Pino Toscano <[email protected]> Date: Fri May 28 13:01:53 2010 +0200 use the proper type for iterating on a GooVector diff --git a/poppler/XRef.cc b/poppler/XRef.cc index a4e3941..8ce370c 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -510,7 +510,7 @@ GBool XRef::readXRefTable(Parser *parser, Guint *pos, GooVector<Guint> *followed // check for an 'XRefStm' key if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { pos2 = (Guint)obj2.getInt(); - for (uint i = 0; ok == gTrue && i < followedXRefStm->size(); ++i) { + for (size_t i = 0; ok == gTrue && i < followedXRefStm->size(); ++i) { if (followedXRefStm->at(i) == pos2) { ok = gFalse; } _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
