diff --git a/ChangeLog b/ChangeLog index 0a7aab28..15c0bce4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-10-19 Jay Berkenbilt + * include/qpdf/QPDF.hh (QPDF): getWarnings now returns a list of + QPDFExc rather than a list of strings. This way, warnings may be + inspected in more detail. + * Include information about the last object read in most error messages. Most of the time, this will provide a good hint as to which object contains the error, but it's possible that the last diff --git a/examples/pdf-linearize.c b/examples/pdf-linearize.c index ca49a4d9..d9da913e 100644 --- a/examples/pdf-linearize.c +++ b/examples/pdf-linearize.c @@ -24,6 +24,7 @@ int main(int argc, char* argv[]) int warnings = 0; int errors = 0; char* p = 0; + qpdf_error e = 0; if ((p = strrchr(argv[0], '/')) != NULL) { @@ -53,12 +54,14 @@ int main(int argc, char* argv[]) while (qpdf_more_warnings(qpdf)) { warnings = 1; - printf("warning: %s\n", qpdf_next_warning(qpdf)); + printf("warning: %s\n", + qpdf_get_error_full_text(qpdf, qpdf_next_warning(qpdf))); } - while (qpdf_more_errors(qpdf)) + e = qpdf_get_error(qpdf); + if (e) { errors = 1; - printf("error: %s\n", qpdf_next_error(qpdf)); + printf("error: %s\n", qpdf_get_error_full_text(qpdf, e)); } qpdf_cleanup(&qpdf); if (errors) diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index 178d71c7..3f66a5f9 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -70,7 +70,7 @@ class DLL_EXPORT QPDF // throws an exception. Note that if setSuppressWarnings was not // called or was called with a false value, any warnings retrieved // here will have already been issued to stderr. - std::vector getWarnings(); + std::vector getWarnings(); std::string getFilename() const; std::string getPDFVersion() const; @@ -761,7 +761,7 @@ class DLL_EXPORT QPDF std::map obj_cache; QPDFObjectHandle trailer; std::vector all_pages; - std::vector warnings; + std::vector warnings; // Linearization data int first_xref_item_offset; // actual value from file diff --git a/include/qpdf/QPDFExc.hh b/include/qpdf/QPDFExc.hh index 6b9a11e4..7d6d8968 100644 --- a/include/qpdf/QPDFExc.hh +++ b/include/qpdf/QPDFExc.hh @@ -11,7 +11,7 @@ #include #include #include -#include +#include class DLL_EXPORT QPDFExc: public std::runtime_error { @@ -36,8 +36,8 @@ class DLL_EXPORT QPDFExc: public std::runtime_error qpdf_error_code_e getErrorCode() const; std::string const& getFilename() const; std::string const& getObject() const; - off_t getOffset() const; - std::string const& getMessage() const; + off_t getFilePosition() const; + std::string const& getMessageDetail() const; private: static std::string createWhat(std::string const& filename, diff --git a/include/qpdf/qpdf-c.h b/include/qpdf/qpdf-c.h index 90b3e5f9..ef4c4c6b 100644 --- a/include/qpdf/qpdf-c.h +++ b/include/qpdf/qpdf-c.h @@ -63,12 +63,14 @@ #include #include +#include #ifdef __cplusplus extern "C" { #endif typedef struct _qpdf_data* qpdf_data; + typedef struct _qpdf_error* qpdf_error; /* Many functions return an integer error code. Codes are defined * below. See comments at the top of the file for details. Note @@ -97,21 +99,42 @@ extern "C" { /* ERROR REPORTING */ - /* Returns 1 if there are any errors or warnings, and zero + /* Returns the error condition, if any. The return value is a + * pointer to data that will become invalid the next time an error + * occurs or after this function is called gain. + */ + DLL_EXPORT + qpdf_error qpdf_get_error(qpdf_data qpdf); + + /* Returns 1 if there are any unretrieved warnings, and zero * otherwise. */ DLL_EXPORT - QPDF_BOOL qpdf_more_errors(qpdf_data qpdf); - DLL_EXPORT QPDF_BOOL qpdf_more_warnings(qpdf_data qpdf); - /* If there are any errors/warnings, returns a pointer to the next - * error or warning. Otherwise returns a null pointer. + /* If there are any warnings, returns a pointer to the next + * warning. Otherwise returns a null pointer. */ DLL_EXPORT - char const* qpdf_next_error(qpdf_data qpdf); + qpdf_error qpdf_next_warning(qpdf_data qpdf); + + /* Extract fields of the error. */ + + /* Use this function to get a full error message suitable for + * showing to the user. */ DLL_EXPORT - char const* qpdf_next_warning(qpdf_data qpdf); + char const* qpdf_get_error_full_text(qpdf_data q, qpdf_error e); + + /* Use these functions to extract individual fields from the + * error; see QPDFExc.hh for details. */ + DLL_EXPORT + enum qpdf_error_code_e qpdf_get_error_code(qpdf_data q, qpdf_error e); + DLL_EXPORT + char const* qpdf_get_error_filename(qpdf_data q, qpdf_error e); + DLL_EXPORT + off_t qpdf_get_error_file_position(qpdf_data q, qpdf_error e); + DLL_EXPORT + char const* qpdf_get_error_message_detail(qpdf_data q, qpdf_error e); /* By default, warnings are written to stderr. Passing true to * this function will prevent warnings from being written to diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index ebd78a9d..778091bd 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -300,10 +300,10 @@ QPDF::setAttemptRecovery(bool val) this->attempt_recovery = val; } -std::vector +std::vector QPDF::getWarnings() { - std::vector result = this->warnings; + std::vector result = this->warnings; this->warnings.clear(); return result; } @@ -397,10 +397,10 @@ QPDF::parse() void QPDF::warn(QPDFExc const& e) { - this->warnings.push_back(e.what()); + this->warnings.push_back(e); if (! this->suppress_warnings) { - std::cerr << "WARNING: " << this->warnings.back() << std::endl; + std::cerr << "WARNING: " << this->warnings.back().what() << std::endl; } } @@ -424,7 +424,7 @@ QPDF::reconstruct_xref(QPDFExc& e) warn(QPDFExc(qpdf_e_damaged_pdf, this->file.getName(), "", 0, "file is damaged")); warn(e); - warn(QPDFExc(qpdf_e_damaged_pdf, "", "", 0, + warn(QPDFExc(qpdf_e_damaged_pdf, this->file.getName(), "", 0, "Attempting to reconstruct cross-reference table")); // Delete all references to type 1 (uncompressed) objects diff --git a/libqpdf/QPDFExc.cc b/libqpdf/QPDFExc.cc index 614990a9..1fc9d724 100644 --- a/libqpdf/QPDFExc.cc +++ b/libqpdf/QPDFExc.cc @@ -54,3 +54,33 @@ QPDFExc::createWhat(std::string const& filename, result += message; return result; } + +qpdf_error_code_e +QPDFExc::getErrorCode() const +{ + return this->error_code; +} + +std::string const& +QPDFExc::getFilename() const +{ + return this->filename; +} + +std::string const& +QPDFExc::getObject() const +{ + return this->object; +} + +off_t +QPDFExc::getFilePosition() const +{ + return this->offset; +} + +std::string const& +QPDFExc::getMessageDetail() const +{ + return this->message; +} diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc index f18080b2..2f65b0f7 100644 --- a/libqpdf/qpdf-c.cc +++ b/libqpdf/qpdf-c.cc @@ -3,11 +3,17 @@ #include #include #include +#include #include #include #include +struct _qpdf_error +{ + PointerHolder exc; +}; + struct _qpdf_data { _qpdf_data(); @@ -16,9 +22,22 @@ struct _qpdf_data QPDF* qpdf; QPDFWriter* qpdf_writer; - std::string error; - std::list warnings; + PointerHolder error; + _qpdf_error tmp_error; + std::list warnings; std::string tmp_string; + + // Parameters for functions we call + char const* filename; + char const* password; + + // must set filename and password + void call_read(); + + // must set filename + void call_init_write(); + + void call_write(); }; _qpdf_data::_qpdf_data() : @@ -33,6 +52,65 @@ _qpdf_data::~_qpdf_data() delete qpdf; } +void +_qpdf_data::call_read() +{ + qpdf->processFile(filename, password); +} + +void +_qpdf_data::call_init_write() +{ + if (qpdf_writer) + { + QTC::TC("qpdf", "qpdf-c called qpdf_init_write multiple times"); + delete qpdf_writer; + qpdf_writer = 0; + } + try + { + qpdf_writer = new QPDFWriter(*qpdf, filename); + } + catch (...) + { + throw; + } +} + +void +_qpdf_data::call_write() +{ + qpdf_writer->write(); +} + +static QPDF_ERROR_CODE trap_errors(qpdf_data qpdf, void (_qpdf_data::*fn)()) +{ + QPDF_ERROR_CODE status = QPDF_SUCCESS; + try + { + (qpdf->*fn)(); + } + catch (QPDFExc& e) + { + qpdf->error = new QPDFExc(e); + status |= QPDF_ERRORS; + } + catch (std::runtime_error& e) + { + qpdf->error = new QPDFExc(qpdf_e_system, "", "", 0, e.what()); + } + catch (std::exception& e) + { + qpdf->error = new QPDFExc(qpdf_e_internal, "", "", 0, e.what()); + } + + if (qpdf_more_warnings(qpdf)) + { + status |= QPDF_WARNINGS; + } + return status; +} + qpdf_data qpdf_init() { QTC::TC("qpdf", "qpdf-c called qpdf_init"); @@ -48,19 +126,13 @@ void qpdf_cleanup(qpdf_data* qpdf) *qpdf = 0; } -QPDF_BOOL qpdf_more_errors(qpdf_data qpdf) -{ - QTC::TC("qpdf", "qpdf-c called qpdf_more_errors"); - return (qpdf->error.empty() ? QPDF_FALSE : QPDF_TRUE); -} - QPDF_BOOL qpdf_more_warnings(qpdf_data qpdf) { QTC::TC("qpdf", "qpdf-c called qpdf_more_warnings"); if (qpdf->warnings.empty()) { - std::vector w = qpdf->qpdf->getWarnings(); + std::vector w = qpdf->qpdf->getWarnings(); if (! w.empty()) { qpdf->warnings.assign(w.begin(), w.end()); @@ -76,14 +148,14 @@ QPDF_BOOL qpdf_more_warnings(qpdf_data qpdf) } } -char const* qpdf_next_error(qpdf_data qpdf) +qpdf_error qpdf_get_error(qpdf_data qpdf) { - if (qpdf_more_errors(qpdf)) + if (qpdf->error.getPointer()) { - qpdf->tmp_string = qpdf->error; - qpdf->error.clear(); + qpdf->tmp_error.exc = qpdf->error; + qpdf->error = 0; QTC::TC("qpdf", "qpdf-c qpdf_next_error returned error"); - return qpdf->tmp_string.c_str(); + return &qpdf->tmp_error; } else { @@ -91,14 +163,14 @@ char const* qpdf_next_error(qpdf_data qpdf) } } -char const* qpdf_next_warning(qpdf_data qpdf) +qpdf_error qpdf_next_warning(qpdf_data qpdf) { if (qpdf_more_warnings(qpdf)) { - qpdf->tmp_string = qpdf->warnings.front(); + qpdf->tmp_error.exc = new QPDFExc(qpdf->warnings.front()); qpdf->warnings.pop_front(); QTC::TC("qpdf", "qpdf-c qpdf_next_warning returned warning"); - return qpdf->tmp_string.c_str(); + return &qpdf->tmp_error; } else { @@ -106,6 +178,31 @@ char const* qpdf_next_warning(qpdf_data qpdf) } } +char const* qpdf_get_error_full_text(qpdf_data qpdf, qpdf_error e) +{ + return e->exc.getPointer()->what(); +} + +enum qpdf_error_code_e qpdf_get_error_code(qpdf_data qpdf, qpdf_error e) +{ + return e->exc.getPointer()->getErrorCode(); +} + +char const* qpdf_get_error_filename(qpdf_data qpdf, qpdf_error e) +{ + return e->exc.getPointer()->getFilename().c_str(); +} + +off_t qpdf_get_error_file_position(qpdf_data qpdf, qpdf_error e) +{ + return e->exc.getPointer()->getFilePosition(); +} + +char const* qpdf_get_error_message_detail(qpdf_data qpdf, qpdf_error e) +{ + return e->exc.getPointer()->getMessageDetail().c_str(); +} + void qpdf_set_suppress_warnings(qpdf_data qpdf, QPDF_BOOL value) { QTC::TC("qpdf", "qpdf-c called qpdf_set_suppress_warnings"); @@ -128,19 +225,9 @@ QPDF_ERROR_CODE qpdf_read(qpdf_data qpdf, char const* filename, char const* password) { QPDF_ERROR_CODE status = QPDF_SUCCESS; - try - { - qpdf->qpdf->processFile(filename, password); - } - catch (std::exception& e) - { - qpdf->error = e.what(); - status |= QPDF_ERRORS; - } - if (qpdf_more_warnings(qpdf)) - { - status |= QPDF_WARNINGS; - } + qpdf->filename = filename; + qpdf->password = password; + status = trap_errors(qpdf, &_qpdf_data::call_read); QTC::TC("qpdf", "qpdf-c called qpdf_read", status); return status; } @@ -228,25 +315,8 @@ QPDF_BOOL qpdf_allow_modify_all(qpdf_data qpdf) QPDF_ERROR_CODE qpdf_init_write(qpdf_data qpdf, char const* filename) { QPDF_ERROR_CODE status = QPDF_SUCCESS; - if (qpdf->qpdf_writer) - { - QTC::TC("qpdf", "qpdf-c called qpdf_init_write multiple times"); - delete qpdf->qpdf_writer; - qpdf->qpdf_writer = 0; - } - try - { - qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf), filename); - } - catch (std::exception& e) - { - qpdf->error = e.what(); - status |= QPDF_ERRORS; - } - if (qpdf_more_warnings(qpdf)) - { - status |= QPDF_WARNINGS; - } + qpdf->filename = filename; + status = trap_errors(qpdf, &_qpdf_data::call_init_write); QTC::TC("qpdf", "qpdf-c called qpdf_init_write", status); return status; } @@ -356,19 +426,7 @@ void qpdf_force_pdf_version(qpdf_data qpdf, char const* version) QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf) { QPDF_ERROR_CODE status = QPDF_SUCCESS; - try - { - qpdf->qpdf_writer->write(); - } - catch (std::exception& e) - { - qpdf->error = e.what(); - status |= QPDF_ERRORS; - } - if (qpdf_more_warnings(qpdf)) - { - status |= QPDF_WARNINGS; - } + status = trap_errors(qpdf, &_qpdf_data::call_write); QTC::TC("qpdf", "qpdf-c called qpdf_write", status); return status; } diff --git a/qpdf/qpdf-ctest.c b/qpdf/qpdf-ctest.c index 3b62f5ee..422aff15 100644 --- a/qpdf/qpdf-ctest.c +++ b/qpdf/qpdf-ctest.c @@ -8,13 +8,24 @@ static qpdf_data qpdf = 0; static void report_errors() { + qpdf_error e = 0; while (qpdf_more_warnings(qpdf)) { - printf("warning: %s\n", qpdf_next_warning(qpdf)); + e = qpdf_next_warning(qpdf); + printf("warning: %s\n", qpdf_get_error_full_text(qpdf, e)); + printf(" code: %d\n", qpdf_get_error_code(qpdf, e)); + printf(" file: %s\n", qpdf_get_error_filename(qpdf, e)); + printf(" pos : %ld\n", qpdf_get_error_file_position(qpdf, e)); + printf(" text: %s\n", qpdf_get_error_message_detail(qpdf, e)); } - while (qpdf_more_errors(qpdf)) + e = qpdf_get_error(qpdf); + if (e) { - printf("error: %s\n", qpdf_next_error(qpdf)); + printf("error: %s\n", qpdf_get_error_full_text(qpdf, e)); + printf(" code: %d\n", qpdf_get_error_code(qpdf, e)); + printf(" file: %s\n", qpdf_get_error_filename(qpdf, e)); + printf(" pos : %ld\n", qpdf_get_error_file_position(qpdf, e)); + printf(" text: %s\n", qpdf_get_error_message_detail(qpdf, e)); } } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index ac715259..811bddff 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -120,7 +120,6 @@ QPDF decoding error warning 0 QPDF_Stream ignore non-dictionary DecodeParms 0 qpdf-c called qpdf_init 0 qpdf-c called qpdf_cleanup 0 -qpdf-c called qpdf_more_errors 0 qpdf-c called qpdf_more_warnings 0 qpdf-c qpdf_next_error returned error 0 qpdf-c qpdf_next_warning returned warning 0 diff --git a/qpdf/qtest/qpdf/append-page-content-damaged-c-check.out b/qpdf/qtest/qpdf/append-page-content-damaged-c-check.out index f1ef65b1..ae557e52 100644 --- a/qpdf/qtest/qpdf/append-page-content-damaged-c-check.out +++ b/qpdf/qtest/qpdf/append-page-content-damaged-c-check.out @@ -1,9 +1,21 @@ WARNING: append-page-content-damaged.pdf: file is damaged WARNING: append-page-content-damaged.pdf: can't find startxref -WARNING: Attempting to reconstruct cross-reference table +WARNING: append-page-content-damaged.pdf: Attempting to reconstruct cross-reference table version: 1.3 linearized: 0 encrypted: 0 warning: append-page-content-damaged.pdf: file is damaged + code: 5 + file: append-page-content-damaged.pdf + pos : 0 + text: file is damaged warning: append-page-content-damaged.pdf: can't find startxref -warning: Attempting to reconstruct cross-reference table + code: 5 + file: append-page-content-damaged.pdf + pos : 0 + text: can't find startxref +warning: append-page-content-damaged.pdf: Attempting to reconstruct cross-reference table + code: 5 + file: append-page-content-damaged.pdf + pos : 0 + text: Attempting to reconstruct cross-reference table diff --git a/qpdf/qtest/qpdf/append-page-content-damaged-check.out b/qpdf/qtest/qpdf/append-page-content-damaged-check.out index 2b04bd9a..b529bc35 100644 --- a/qpdf/qtest/qpdf/append-page-content-damaged-check.out +++ b/qpdf/qtest/qpdf/append-page-content-damaged-check.out @@ -1,6 +1,6 @@ WARNING: append-page-content-damaged.pdf: file is damaged WARNING: append-page-content-damaged.pdf: can't find startxref -WARNING: Attempting to reconstruct cross-reference table +WARNING: append-page-content-damaged.pdf: Attempting to reconstruct cross-reference table checking append-page-content-damaged.pdf PDF Version: 1.3 File is not encrypted diff --git a/qpdf/qtest/qpdf/append-page-content-damaged.out b/qpdf/qtest/qpdf/append-page-content-damaged.out index 7835d627..bd4ecfab 100644 --- a/qpdf/qtest/qpdf/append-page-content-damaged.out +++ b/qpdf/qtest/qpdf/append-page-content-damaged.out @@ -1,4 +1,4 @@ WARNING: append-page-content-damaged.pdf: file is damaged WARNING: append-page-content-damaged.pdf: can't find startxref -WARNING: Attempting to reconstruct cross-reference table +WARNING: append-page-content-damaged.pdf: Attempting to reconstruct cross-reference table qpdf: operation succeeded with warnings; resulting file may have some problems diff --git a/qpdf/qtest/qpdf/bad10-recover.out b/qpdf/qtest/qpdf/bad10-recover.out index ca726ca9..25de9bcc 100644 --- a/qpdf/qtest/qpdf/bad10-recover.out +++ b/qpdf/qtest/qpdf/bad10-recover.out @@ -1,6 +1,6 @@ WARNING: bad10.pdf: file is damaged WARNING: bad10.pdf (trailer, file position 712): /Size key in trailer dictionary is not an integer -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad10.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad11-recover.out b/qpdf/qtest/qpdf/bad11-recover.out index f7825327..43bcd068 100644 --- a/qpdf/qtest/qpdf/bad11-recover.out +++ b/qpdf/qtest/qpdf/bad11-recover.out @@ -1,6 +1,6 @@ WARNING: bad11.pdf: file is damaged WARNING: bad11.pdf (trailer, file position 905): /Prev key in trailer dictionary is not an integer -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad11.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad13-recover.out b/qpdf/qtest/qpdf/bad13-recover.out index 06f1a002..c20d98a7 100644 --- a/qpdf/qtest/qpdf/bad13-recover.out +++ b/qpdf/qtest/qpdf/bad13-recover.out @@ -1,4 +1,4 @@ WARNING: bad13.pdf: file is damaged WARNING: bad13.pdf (trailer, file position 753): unexpected brace token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad13.pdf: Attempting to reconstruct cross-reference table bad13.pdf (trailer, file position 753): unexpected brace token diff --git a/qpdf/qtest/qpdf/bad14-recover.out b/qpdf/qtest/qpdf/bad14-recover.out index cd97fd5f..e66441a8 100644 --- a/qpdf/qtest/qpdf/bad14-recover.out +++ b/qpdf/qtest/qpdf/bad14-recover.out @@ -1,4 +1,4 @@ WARNING: bad14.pdf: file is damaged WARNING: bad14.pdf (trailer, file position 753): unexpected brace token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad14.pdf: Attempting to reconstruct cross-reference table bad14.pdf (trailer, file position 753): unexpected brace token diff --git a/qpdf/qtest/qpdf/bad15-recover.out b/qpdf/qtest/qpdf/bad15-recover.out index 333717cd..0575a338 100644 --- a/qpdf/qtest/qpdf/bad15-recover.out +++ b/qpdf/qtest/qpdf/bad15-recover.out @@ -1,4 +1,4 @@ WARNING: bad15.pdf: file is damaged WARNING: bad15.pdf (trailer, file position 753): unexpected array close token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad15.pdf: Attempting to reconstruct cross-reference table bad15.pdf (trailer, file position 753): unexpected array close token diff --git a/qpdf/qtest/qpdf/bad16-recover.out b/qpdf/qtest/qpdf/bad16-recover.out index 6c5f745c..1256ceab 100644 --- a/qpdf/qtest/qpdf/bad16-recover.out +++ b/qpdf/qtest/qpdf/bad16-recover.out @@ -1,4 +1,4 @@ WARNING: bad16.pdf: file is damaged WARNING: bad16.pdf (trailer, file position 753): unexpected dictionary close token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad16.pdf: Attempting to reconstruct cross-reference table bad16.pdf (trailer, file position 753): unexpected dictionary close token diff --git a/qpdf/qtest/qpdf/bad17-recover.out b/qpdf/qtest/qpdf/bad17-recover.out index 60d28961..d09805ae 100644 --- a/qpdf/qtest/qpdf/bad17-recover.out +++ b/qpdf/qtest/qpdf/bad17-recover.out @@ -1,4 +1,4 @@ WARNING: bad17.pdf: file is damaged WARNING: bad17.pdf (trailer, file position 753): dictionary ending here has an odd number of elements -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad17.pdf: Attempting to reconstruct cross-reference table bad17.pdf (trailer, file position 753): dictionary ending here has an odd number of elements diff --git a/qpdf/qtest/qpdf/bad18-recover.out b/qpdf/qtest/qpdf/bad18-recover.out index b81c6d7a..b3128041 100644 --- a/qpdf/qtest/qpdf/bad18-recover.out +++ b/qpdf/qtest/qpdf/bad18-recover.out @@ -1,4 +1,4 @@ WARNING: bad18.pdf: file is damaged WARNING: bad18.pdf (trailer, file position 753): unexpected ) -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad18.pdf: Attempting to reconstruct cross-reference table bad18.pdf (trailer, file position 753): unexpected ) diff --git a/qpdf/qtest/qpdf/bad19-recover.out b/qpdf/qtest/qpdf/bad19-recover.out index 7e99befd..133dcb9a 100644 --- a/qpdf/qtest/qpdf/bad19-recover.out +++ b/qpdf/qtest/qpdf/bad19-recover.out @@ -1,4 +1,4 @@ WARNING: bad19.pdf: file is damaged WARNING: bad19.pdf (trailer, file position 753): unexpected > -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad19.pdf: Attempting to reconstruct cross-reference table bad19.pdf (trailer, file position 753): unexpected > diff --git a/qpdf/qtest/qpdf/bad2-recover.out b/qpdf/qtest/qpdf/bad2-recover.out index 277913ef..569ca19c 100644 --- a/qpdf/qtest/qpdf/bad2-recover.out +++ b/qpdf/qtest/qpdf/bad2-recover.out @@ -1,6 +1,6 @@ WARNING: bad2.pdf: file is damaged WARNING: bad2.pdf: can't find startxref -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad2.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad20-recover.out b/qpdf/qtest/qpdf/bad20-recover.out index 2924a563..d9e35664 100644 --- a/qpdf/qtest/qpdf/bad20-recover.out +++ b/qpdf/qtest/qpdf/bad20-recover.out @@ -1,4 +1,4 @@ WARNING: bad20.pdf: file is damaged WARNING: bad20.pdf (trailer, file position 753): invalid character (q) in hexstring -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad20.pdf: Attempting to reconstruct cross-reference table bad20.pdf (trailer, file position 753): invalid character (q) in hexstring diff --git a/qpdf/qtest/qpdf/bad21-recover.out b/qpdf/qtest/qpdf/bad21-recover.out index b45319ee..73d2e895 100644 --- a/qpdf/qtest/qpdf/bad21-recover.out +++ b/qpdf/qtest/qpdf/bad21-recover.out @@ -1,4 +1,4 @@ WARNING: bad21.pdf: file is damaged WARNING: bad21.pdf (trailer, file position 742): invalid name token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad21.pdf: Attempting to reconstruct cross-reference table bad21.pdf (trailer, file position 742): invalid name token diff --git a/qpdf/qtest/qpdf/bad25-recover.out b/qpdf/qtest/qpdf/bad25-recover.out index 9528a504..23893d5d 100644 --- a/qpdf/qtest/qpdf/bad25-recover.out +++ b/qpdf/qtest/qpdf/bad25-recover.out @@ -1,6 +1,6 @@ WARNING: bad25.pdf: file is damaged WARNING: bad25.pdf (object 4 0, file position 307): expected n n obj -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad25.pdf: Attempting to reconstruct cross-reference table WARNING: bad25.pdf: object 4 0 not found in file after regenerating cross reference table /QTest is implicit /QTest is indirect diff --git a/qpdf/qtest/qpdf/bad26-recover.out b/qpdf/qtest/qpdf/bad26-recover.out index b3da37ce..248aff7d 100644 --- a/qpdf/qtest/qpdf/bad26-recover.out +++ b/qpdf/qtest/qpdf/bad26-recover.out @@ -1,6 +1,6 @@ WARNING: bad26.pdf: file is damaged WARNING: bad26.pdf (object 4 0, file position 307): expected n n obj -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad26.pdf: Attempting to reconstruct cross-reference table WARNING: bad26.pdf: object 4 0 not found in file after regenerating cross reference table /QTest is implicit /QTest is indirect diff --git a/qpdf/qtest/qpdf/bad27-recover.out b/qpdf/qtest/qpdf/bad27-recover.out index 18a133d0..f06203b5 100644 --- a/qpdf/qtest/qpdf/bad27-recover.out +++ b/qpdf/qtest/qpdf/bad27-recover.out @@ -1,6 +1,6 @@ WARNING: bad27.pdf: file is damaged WARNING: bad27.pdf (object 4 0, file position 307): expected n n obj -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad27.pdf: Attempting to reconstruct cross-reference table WARNING: bad27.pdf: object 4 0 not found in file after regenerating cross reference table /QTest is implicit /QTest is indirect diff --git a/qpdf/qtest/qpdf/bad29-recover.out b/qpdf/qtest/qpdf/bad29-recover.out index a39e7eda..e027db9e 100644 --- a/qpdf/qtest/qpdf/bad29-recover.out +++ b/qpdf/qtest/qpdf/bad29-recover.out @@ -1,4 +1,4 @@ WARNING: bad29.pdf: file is damaged WARNING: bad29.pdf (trailer, file position 742): null character not allowed in name token -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad29.pdf: Attempting to reconstruct cross-reference table bad29.pdf (trailer, file position 742): null character not allowed in name token diff --git a/qpdf/qtest/qpdf/bad3-recover.out b/qpdf/qtest/qpdf/bad3-recover.out index 927c03bf..e282d665 100644 --- a/qpdf/qtest/qpdf/bad3-recover.out +++ b/qpdf/qtest/qpdf/bad3-recover.out @@ -1,6 +1,6 @@ WARNING: bad3.pdf: file is damaged WARNING: bad3.pdf (file position 542): xref not found -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad3.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad32-recover.out b/qpdf/qtest/qpdf/bad32-recover.out index dd002f5e..c038a297 100644 --- a/qpdf/qtest/qpdf/bad32-recover.out +++ b/qpdf/qtest/qpdf/bad32-recover.out @@ -1,6 +1,6 @@ WARNING: bad32.pdf: file is damaged WARNING: bad32.pdf (object 4 0, file position 307): expected 4 0 obj -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad32.pdf: Attempting to reconstruct cross-reference table WARNING: bad32.pdf: object 4 0 not found in file after regenerating cross reference table /QTest is implicit /QTest is indirect diff --git a/qpdf/qtest/qpdf/bad33-recover.out b/qpdf/qtest/qpdf/bad33-recover.out index 9132c2a7..51dabe67 100644 --- a/qpdf/qtest/qpdf/bad33-recover.out +++ b/qpdf/qtest/qpdf/bad33-recover.out @@ -1,6 +1,6 @@ WARNING: bad33.pdf: file is damaged WARNING: bad33.pdf (file position 1771): xref not found -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad33.pdf: Attempting to reconstruct cross-reference table /QTest is indirect /QTest is a stream. Dictionary: << /Filter (FlateDecode) /Length 123 >> Raw stream data: diff --git a/qpdf/qtest/qpdf/bad34-recover.out b/qpdf/qtest/qpdf/bad34-recover.out index 071ebb91..08cc7bb1 100644 --- a/qpdf/qtest/qpdf/bad34-recover.out +++ b/qpdf/qtest/qpdf/bad34-recover.out @@ -1,6 +1,6 @@ WARNING: bad34.pdf: file is damaged WARNING: bad34.pdf (object 4 0, file position 322): expected n n obj -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad34.pdf: Attempting to reconstruct cross-reference table /QTest is indirect /QTest is a stream. Dictionary: << /Length 44 /Quack 9 0 R >> Raw stream data: diff --git a/qpdf/qtest/qpdf/bad4-recover.out b/qpdf/qtest/qpdf/bad4-recover.out index 12512e98..508acea5 100644 --- a/qpdf/qtest/qpdf/bad4-recover.out +++ b/qpdf/qtest/qpdf/bad4-recover.out @@ -1,6 +1,6 @@ WARNING: bad4.pdf: file is damaged WARNING: bad4.pdf (xref table, file position 547): xref syntax invalid -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad4.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad5-recover.out b/qpdf/qtest/qpdf/bad5-recover.out index cdb207ee..75fe746e 100644 --- a/qpdf/qtest/qpdf/bad5-recover.out +++ b/qpdf/qtest/qpdf/bad5-recover.out @@ -1,6 +1,6 @@ WARNING: bad5.pdf: file is damaged WARNING: bad5.pdf (xref table, file position 591): invalid xref entry (obj=2) -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad5.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad7-recover.out b/qpdf/qtest/qpdf/bad7-recover.out index 139835f8..fbf93ce5 100644 --- a/qpdf/qtest/qpdf/bad7-recover.out +++ b/qpdf/qtest/qpdf/bad7-recover.out @@ -1,4 +1,4 @@ WARNING: bad7.pdf: file is damaged WARNING: bad7.pdf (file position 698): expected trailer dictionary -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad7.pdf: Attempting to reconstruct cross-reference table bad7.pdf: unable to find trailer dictionary while recovering damaged file diff --git a/qpdf/qtest/qpdf/bad8-recover.out b/qpdf/qtest/qpdf/bad8-recover.out index 389b8304..f55a7948 100644 --- a/qpdf/qtest/qpdf/bad8-recover.out +++ b/qpdf/qtest/qpdf/bad8-recover.out @@ -1,6 +1,6 @@ WARNING: bad8.pdf: file is damaged WARNING: bad8.pdf (file position 543): xref not found -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad8.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/bad9-recover.out b/qpdf/qtest/qpdf/bad9-recover.out index 4eb923f8..f795a156 100644 --- a/qpdf/qtest/qpdf/bad9-recover.out +++ b/qpdf/qtest/qpdf/bad9-recover.out @@ -1,6 +1,6 @@ WARNING: bad9.pdf: file is damaged WARNING: bad9.pdf (trailer, file position 712): trailer dictionary lacks /Size key -WARNING: Attempting to reconstruct cross-reference table +WARNING: bad9.pdf: Attempting to reconstruct cross-reference table /QTest is implicit /QTest is direct /QTest is null diff --git a/qpdf/qtest/qpdf/c-no-recovery.out b/qpdf/qtest/qpdf/c-no-recovery.out index e6bc0956..2db03a71 100644 --- a/qpdf/qtest/qpdf/c-no-recovery.out +++ b/qpdf/qtest/qpdf/c-no-recovery.out @@ -1 +1,5 @@ error: bad33.pdf (file position 1771): xref not found + code: 5 + file: bad33.pdf + pos : 1771 + text: xref not found diff --git a/qpdf/qtest/qpdf/c-read-errors.out b/qpdf/qtest/qpdf/c-read-errors.out index 1d74816e..49594331 100644 --- a/qpdf/qtest/qpdf/c-read-errors.out +++ b/qpdf/qtest/qpdf/c-read-errors.out @@ -1 +1,5 @@ error: bad1.pdf: not a PDF file + code: 5 + file: bad1.pdf + pos : 0 + text: not a PDF file diff --git a/qpdf/qtest/qpdf/c-read-warnings-and-errors.out b/qpdf/qtest/qpdf/c-read-warnings-and-errors.out index 16674487..117663e9 100644 --- a/qpdf/qtest/qpdf/c-read-warnings-and-errors.out +++ b/qpdf/qtest/qpdf/c-read-warnings-and-errors.out @@ -1,4 +1,20 @@ warning: bad17.pdf: file is damaged + code: 5 + file: bad17.pdf + pos : 0 + text: file is damaged warning: bad17.pdf (trailer, file position 753): dictionary ending here has an odd number of elements -warning: Attempting to reconstruct cross-reference table + code: 5 + file: bad17.pdf + pos : 753 + text: dictionary ending here has an odd number of elements +warning: bad17.pdf: Attempting to reconstruct cross-reference table + code: 5 + file: bad17.pdf + pos : 0 + text: Attempting to reconstruct cross-reference table error: bad17.pdf (trailer, file position 753): dictionary ending here has an odd number of elements + code: 5 + file: bad17.pdf + pos : 753 + text: dictionary ending here has an odd number of elements diff --git a/qpdf/qtest/qpdf/c-write-errors.out b/qpdf/qtest/qpdf/c-write-errors.out index 031c6bf8..211cfdf9 100644 --- a/qpdf/qtest/qpdf/c-write-errors.out +++ b/qpdf/qtest/qpdf/c-write-errors.out @@ -1 +1,5 @@ error: bad30.pdf (file position 629): stream filter type is not name or array + code: 5 + file: bad30.pdf + pos : 629 + text: stream filter type is not name or array diff --git a/qpdf/qtest/qpdf/c-write-warnings-and-errors.out b/qpdf/qtest/qpdf/c-write-warnings-and-errors.out index e0833410..d486d599 100644 --- a/qpdf/qtest/qpdf/c-write-warnings-and-errors.out +++ b/qpdf/qtest/qpdf/c-write-warnings-and-errors.out @@ -1,4 +1,20 @@ warning: bad33.pdf: file is damaged + code: 5 + file: bad33.pdf + pos : 0 + text: file is damaged warning: bad33.pdf (file position 1771): xref not found -warning: Attempting to reconstruct cross-reference table + code: 5 + file: bad33.pdf + pos : 1771 + text: xref not found +warning: bad33.pdf: Attempting to reconstruct cross-reference table + code: 5 + file: bad33.pdf + pos : 0 + text: Attempting to reconstruct cross-reference table error: bad33.pdf (file position 629): stream filter type is not name or array + code: 5 + file: bad33.pdf + pos : 629 + text: stream filter type is not name or array diff --git a/qpdf/qtest/qpdf/heifer.out b/qpdf/qtest/qpdf/heifer.out index a3d365a2..ee550184 100644 --- a/qpdf/qtest/qpdf/heifer.out +++ b/qpdf/qtest/qpdf/heifer.out @@ -1,5 +1,5 @@ WARNING: heifer.pdf: file is damaged WARNING: heifer.pdf (file position 92741): xref not found -WARNING: Attempting to reconstruct cross-reference table +WARNING: heifer.pdf: Attempting to reconstruct cross-reference table WARNING: heifer.pdf (object 2 0, file position 51): attempting to recover stream length qpdf: operation succeeded with warnings; resulting file may have some problems