cpp/CMakeLists.txt | 1 cpp/Makefile.am | 1 cpp/poppler-document-private.h | 5 ++ cpp/poppler-document.cpp | 77 ++++++++++++++++++++++++++++++++++++++++- cpp/poppler-document.h | 11 ++++- cpp/poppler-embedded-file.cpp | 6 +-- cpp/poppler-embedded-file.h | 2 - cpp/poppler-global.cpp | 37 ++++++++++++++----- cpp/poppler-global.h | 12 +++++- cpp/poppler-private.cpp | 5 +- cpp/poppler-rectangle.cpp | 35 ++++++++++++++++++ cpp/poppler-rectangle.h | 8 +++- cpp/poppler-version.cpp | 8 ++-- 13 files changed, 182 insertions(+), 26 deletions(-)
New commits: commit 9bb90c99b65e0e9d9b65c7dbeb5b4d66377ceb21 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 23:43:12 2009 +0100 [cpp] add destructor for 'rectangle' diff --git a/cpp/poppler-rectangle.h b/cpp/poppler-rectangle.h index a2b7c10..18674b2 100644 --- a/cpp/poppler-rectangle.h +++ b/cpp/poppler-rectangle.h @@ -33,7 +33,8 @@ public: rectangle(T _x, T _y, T w, T h) : x1(_x), y1(_y), x2(x1 + w), y2(y1 + h) {} - ~rectangle(); + ~rectangle() + {} bool is_empty() const { return (x1 == x2) && (y1 == y2); } commit 61ccdc9ab3b816174896fcae0899ff34f11eee80 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 23:40:51 2009 +0100 [cpp] add out stream operators for rect and rectf diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 3f8e9d9..0a0c6f0 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -13,6 +13,7 @@ set(poppler_cpp_SRCS poppler-page.cpp poppler-page-transition.cpp poppler-private.cpp + poppler-rectangle.cpp poppler-toc.cpp poppler-version.cpp ) diff --git a/cpp/Makefile.am b/cpp/Makefile.am index b6c2d8e..6259770 100644 --- a/cpp/Makefile.am +++ b/cpp/Makefile.am @@ -25,6 +25,7 @@ libpoppler_cpp_la_SOURCES = \ poppler-page.cpp \ poppler-page-transition.cpp \ poppler-private.cpp \ + poppler-rectangle.cpp \ poppler-toc.cpp \ poppler-version.cpp diff --git a/cpp/poppler-rectangle.cpp b/cpp/poppler-rectangle.cpp new file mode 100644 index 0000000..57fd859 --- /dev/null +++ b/cpp/poppler-rectangle.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2009, Pino Toscano <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-rectangle.h" + +#include <iostream> + +using namespace poppler; + +std::ostream& poppler::operator<<(std::ostream& stream, const rect &r) +{ + stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]"; + return stream; +} + +std::ostream& poppler::operator<<(std::ostream& stream, const rectf &r) +{ + stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]"; + return stream; +} diff --git a/cpp/poppler-rectangle.h b/cpp/poppler-rectangle.h index 7465edc..a2b7c10 100644 --- a/cpp/poppler-rectangle.h +++ b/cpp/poppler-rectangle.h @@ -19,6 +19,8 @@ #ifndef POPPLER_RECTANGLE_H #define POPPLER_RECTANGLE_H +#include "poppler-global.h" + namespace poppler { @@ -55,6 +57,9 @@ private: typedef rectangle<int> rect; typedef rectangle<double> rectf; +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rect &r); +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rectf &r); + } #endif commit 69dd51fed3de41f8b799b811ae5ee59c0d5f59c2 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 22:24:07 2009 +0100 [cpp] add namespace to namespace functiond to link properly diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index 9ce7641..cc52b55 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -133,7 +133,7 @@ ustring ustring::from_latin1(const std::string &str) } -unsigned int convert_date(const std::string &date) +unsigned int poppler::convert_date(const std::string &date) { int year, mon, day, hour, min, sec, tzHours, tzMins; char tz; @@ -156,7 +156,7 @@ unsigned int convert_date(const std::string &date) return mktime(&time); } -std::ostream& operator<<(std::ostream& stream, const byte_array &array) +std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array) { stream << "["; const std::ios_base::fmtflags f = stream.flags(); diff --git a/cpp/poppler-version.cpp b/cpp/poppler-version.cpp index 89f95a3..b39af53 100644 --- a/cpp/poppler-version.cpp +++ b/cpp/poppler-version.cpp @@ -20,22 +20,22 @@ using namespace poppler; -std::string version_string() +std::string poppler::version_string() { return std::string(POPPLER_VERSION); } -unsigned int version_major() +unsigned int poppler::version_major() { return POPPLER_VERSION_MAJOR; } -unsigned int version_minor() +unsigned int poppler::version_minor() { return POPPLER_VERSION_MINOR; } -unsigned int version_micro() +unsigned int poppler::version_micro() { return POPPLER_VERSION_MICRO; } commit 3923fa4890984d8616d86016f4f4a94e8ef3e992 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 22:23:15 2009 +0100 [cpp] add default empty parameters for the passwords of the document loading functions diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index ab6eb27..5d394bb 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -81,11 +81,11 @@ public: std::vector<embedded_file *> embedded_files() const; static document* load_from_file(const std::string &file_name, - const std::string &owner_password, - const std::string &user_password); + const std::string &owner_password = std::string(), + const std::string &user_password = std::string()); static document* load_from_data(byte_array *file_data, - const std::string &owner_password, - const std::string &user_password); + const std::string &owner_password = std::string(), + const std::string &user_password = std::string()); private: document(document_private &dd); commit 1d23cc677e9b0a9f61c53e0ea365537f33abe5bf Author: Pino Toscano <[email protected]> Date: Mon Dec 14 21:44:56 2009 +0100 [cpp] add "human friendly" output representation for byte_array diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index cc15bce..9ce7641 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -22,6 +22,7 @@ #include <ctime> #include <cstring> +#include <iostream> using namespace poppler; @@ -154,3 +155,25 @@ unsigned int convert_date(const std::string &date) time.tm_isdst = -1; return mktime(&time); } + +std::ostream& operator<<(std::ostream& stream, const byte_array &array) +{ + stream << "["; + const std::ios_base::fmtflags f = stream.flags(); + std::hex(stream); + const char *data = array.data(); + const byte_array::size_type out_len = std::min<byte_array::size_type>(array.size(), 50); + for (byte_array::size_type i = 0; i < out_len; ++i) + { + if (i != 0) { + stream << " "; + } + stream << ((data[i] & 0xf0) >> 4) << (data[i] & 0xf); + } + stream.flags(f); + if (out_len < array.size()) { + stream << " ..."; + } + stream << "]"; + return stream; +} diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h index da7c295..4b08e8d 100644 --- a/cpp/poppler-global.h +++ b/cpp/poppler-global.h @@ -33,6 +33,7 @@ # define POPPLER_CPP_EXPORT LIB_IMPORT #endif +#include <iosfwd> #include <string> #include <vector> @@ -88,6 +89,8 @@ private: POPPLER_CPP_EXPORT unsigned int /*time_t*/ convert_date(const std::string &date); +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const byte_array &array); + } #endif commit a337c1d757d52c1c238229d2f0cd3a41694b0e08 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 16:18:22 2009 +0100 [cpp] add document metadata reading diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index ab14bf9..0ff526f 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -294,6 +294,15 @@ bool document::has_permission(permission_enum which) const return true; } +ustring document::metadata() const +{ + std::auto_ptr<GooString> md(d->doc->getCatalog()->readMetadata()); + if (md.get()) { + return detail::unicode_GooString_to_ustring(md.get()); + } + return ustring(); +} + int document::pages() const { return d->doc->getNumPages(); diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index 66abe87..ab6eb27 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -66,6 +66,7 @@ public: bool is_encrypted() const; bool is_linearized() const; bool has_permission(permission_enum which) const; + ustring metadata() const; int pages() const; page* create_page(const ustring &label) const; commit c9cb6353ad5279d09615eb2c944b2b053cdf5ccc Author: Pino Toscano <[email protected]> Date: Mon Dec 14 15:52:25 2009 +0100 [cpp] add function to query for document "permissions" diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 908d4d2..ab14bf9 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -271,6 +271,29 @@ bool document::is_linearized() const return d->doc->isLinearized(); } +bool document::has_permission(permission_enum which) const +{ + switch (which) { + case perm_print: + return d->doc->okToPrint(); + case perm_change: + return d->doc->okToChange(); + case perm_copy: + return d->doc->okToCopy(); + case perm_add_notes: + return d->doc->okToAddNotes(); + case perm_fill_forms: + return d->doc->okToFillForm(); + case perm_accessibility: + return d->doc->okToAccessibility(); + case perm_assemble: + return d->doc->okToAssemble(); + case perm_print_high_resolution: + return d->doc->okToPrintHighRes(); + } + return true; +} + int document::pages() const { return d->doc->getNumPages(); diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index cc3c10d..66abe87 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -65,6 +65,7 @@ public: unsigned int /*time_t*/ info_date(const std::string &key) const; bool is_encrypted() const; bool is_linearized() const; + bool has_permission(permission_enum which) const; int pages() const; page* create_page(const ustring &label) const; diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h index a6a9146..da7c295 100644 --- a/cpp/poppler-global.h +++ b/cpp/poppler-global.h @@ -60,6 +60,10 @@ enum rotation_enum { rotate_0, rotate_90, rotate_180, rotate_270 }; enum page_box_enum { media_box, crop_box, bleed_box, trim_box, art_box }; +enum permission_enum { perm_print, perm_change, perm_copy, perm_add_notes, + perm_fill_forms, perm_accessibility, perm_assemble, + perm_print_high_resolution }; + typedef std::vector<char> byte_array; class POPPLER_CPP_EXPORT ustring : public std::basic_string<unsigned short> commit 30e90c7c1b41c62ddc21905e7ccdea4c95547e80 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 15:33:36 2009 +0100 [cpp] add is_encrypted and is_linearized for document diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index d1bc026..908d4d2 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -261,6 +261,16 @@ unsigned int document::info_date(const std::string &key) const return result; } +bool document::is_encrypted() const +{ + return d->doc->isEncrypted(); +} + +bool document::is_linearized() const +{ + return d->doc->isLinearized(); +} + int document::pages() const { return d->doc->getNumPages(); diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index 213a81a..cc3c10d 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -63,6 +63,8 @@ public: 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; + bool is_encrypted() const; + bool is_linearized() const; int pages() const; page* create_page(const ustring &label) const; commit 93fd588c519958a1f66231c111ea8a6b0a759be1 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 13:19:24 2009 +0100 [cpp] add the possibility to load a document from raw data diff --git a/cpp/poppler-document-private.h b/cpp/poppler-document-private.h index 52ed935..9820603 100644 --- a/cpp/poppler-document-private.h +++ b/cpp/poppler-document-private.h @@ -19,6 +19,8 @@ #ifndef POPPLER_DOCUMENT_PRIVATE_H #define POPPLER_DOCUMENT_PRIVATE_H +#include "poppler-global.h" + #include "poppler-config.h" #include "GooString.h" #include "PDFDoc.h" @@ -36,11 +38,14 @@ class document_private public: document_private(GooString *file_path, const std::string &owner_password, const std::string &user_password); + document_private(byte_array *file_data, const std::string &owner_password, + const std::string &user_password); ~document_private(); static document* check_document(document_private *doc); PDFDoc *doc; + byte_array doc_data; bool is_locked; std::vector<embedded_file *> embedded_files; diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 46f52b9..d1bc026 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -49,6 +49,22 @@ document_private::document_private(GooString *file_path, const std::string &owne init(); } +document_private::document_private(byte_array *file_data, + const std::string &owner_password, + const std::string &user_password) + : doc(0) + , is_locked(false) +{ + Object obj; + obj.initNull(); + file_data->swap(doc_data); + MemStream *memstr = new MemStream(doc_data.data(), 0, doc_data.size(), &obj); + GooString goo_owner_password(owner_password.c_str()); + GooString goo_user_password(user_password.c_str()); + doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password); + init(); +} + document_private::~document_private() { delete_all(embedded_files); @@ -106,11 +122,15 @@ bool document::unlock(const std::string &owner_password, const std::string &user { if (d->is_locked) { document_private *newdoc = 0; - { + if (d->doc_data.size() > 0) { + newdoc = new document_private(&d->doc_data, + owner_password, user_password); + } else { newdoc = new document_private(new GooString(d->doc->getFileName()), owner_password, user_password); } if (!newdoc->doc->isOk()) { + d->doc_data.swap(newdoc->doc_data); delete newdoc; } else { delete d; @@ -314,3 +334,16 @@ document* document::load_from_file(const std::string &file_name, owner_password, user_password); return document_private::check_document(doc); } + +document* document::load_from_data(byte_array *file_data, + const std::string &owner_password, + const std::string &user_password) +{ + if (!file_data || file_data->size() < 10) { + return 0; + } + + document_private *doc = new document_private( + file_data, owner_password, user_password); + return document_private::check_document(doc); +} diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h index 7ff4337..213a81a 100644 --- a/cpp/poppler-document.h +++ b/cpp/poppler-document.h @@ -79,6 +79,9 @@ public: static document* load_from_file(const std::string &file_name, const std::string &owner_password, const std::string &user_password); + static document* load_from_data(byte_array *file_data, + const std::string &owner_password, + const std::string &user_password); private: document(document_private &dd); commit 53996365b159cf84adf2cac56c76b8bda8dfb12e Author: Pino Toscano <[email protected]> Date: Mon Dec 14 12:57:41 2009 +0100 [cpp] use the byte_array typedef diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp index 487b32d..6dfe321 100644 --- a/cpp/poppler-embedded-file.cpp +++ b/cpp/poppler-embedded-file.cpp @@ -93,15 +93,15 @@ std::string embedded_file::mime_type() const return std::string(d->emb_file->mimeType()->getCString()); } -std::vector<char> embedded_file::data() const +byte_array embedded_file::data() const { if (!is_valid()) { - return std::vector<char>(); + return byte_array(); } Stream *stream = d->emb_file->streamObject().getStream(); stream->reset(); - std::vector<char> ret(1024); + byte_array ret(1024); size_t data_len = 0; int i; while ((i = stream->getChar()) != EOF) { diff --git a/cpp/poppler-embedded-file.h b/cpp/poppler-embedded-file.h index 250b84a..04ad7be 100644 --- a/cpp/poppler-embedded-file.h +++ b/cpp/poppler-embedded-file.h @@ -41,7 +41,7 @@ public: unsigned int /*time_t*/ creation_date() const; std::string checksum() const; std::string mime_type() const; - std::vector<char> data() const; + byte_array data() const; private: embedded_file(embedded_file_private &dd); commit cfb4f5dfabf31de22d68aa0d5796cb7a33d8b462 Author: Pino Toscano <[email protected]> Date: Mon Dec 14 11:06:36 2009 +0100 [cpp] add a byte_array typedef, and use it for utf8 string data diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index ce27061..cc15bce 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -47,27 +47,21 @@ ustring::~ustring() { } -char* ustring::to_utf_8(int *length) const +byte_array ustring::to_utf_8() const { if (!size()) { - if (length) { - *length = 0; - } - return 0; + return byte_array(); } const value_type *me = data(); const size_t len = size() * 2 + 2; - char *str = new char[len]; + byte_array str(len); str[0] = 0xfe; str[1] = 0xff; for (size_t i = 0; i < size(); ++i, ++me) { str[i * 2 + 2] = (*me & 0xff); str[i * 2 + 3] = ((*me >> 8) & 0xff); } - if (length) { - *length = len; - } return str; } diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h index e51878c..a6a9146 100644 --- a/cpp/poppler-global.h +++ b/cpp/poppler-global.h @@ -34,6 +34,7 @@ #endif #include <string> +#include <vector> namespace poppler { @@ -59,6 +60,8 @@ enum rotation_enum { rotate_0, rotate_90, rotate_180, rotate_270 }; enum page_box_enum { media_box, crop_box, bleed_box, trim_box, art_box }; +typedef std::vector<char> byte_array; + class POPPLER_CPP_EXPORT ustring : public std::basic_string<unsigned short> { public: @@ -66,7 +69,7 @@ public: ustring(size_type len, value_type ch); ~ustring(); - char* to_utf_8(int *length = 0) const; + byte_array to_utf_8() const; std::string to_latin1() const; static ustring from_utf_8(const char *str, int len = -1); diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp index 16ba370..6ab3b6c 100644 --- a/cpp/poppler-private.cpp +++ b/cpp/poppler-private.cpp @@ -63,8 +63,7 @@ ustring detail::unicode_to_ustring(const Unicode *u, int length) GooString* detail::ustring_to_unicode_GooString(const ustring &str) { - char *u = str.to_utf_8(); - GooString *goo = new GooString(u); - delete [] u; + const byte_array utf8_data = str.to_utf_8(); + GooString *goo = new GooString(utf8_data.data()); return goo; } _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
