Commit 573b6eb8b1801b40a4b6eb32cfd159f532876510
1 parent
20509770
Provide qpdf write progress reporting from C API (fixes #487)
Showing
5 changed files
with
58 additions
and
1 deletions
ChangeLog
| 1 | +2020-12-20 Jay Berkenbilt <ejb@ql.org> | ||
| 2 | + | ||
| 3 | + * Add qpdf_register_progress_reporter method to C API, | ||
| 4 | + corresponding to QPDFWriter::registerProgressReporter. Fixes #487. | ||
| 5 | + | ||
| 1 | 2020-11-28 Jay Berkenbilt <ejb@ql.org> | 6 | 2020-11-28 Jay Berkenbilt <ejb@ql.org> |
| 2 | 7 | ||
| 3 | * Add new functions to the C API for manipulating | 8 | * Add new functions to the C API for manipulating |
examples/pdf-linearize.c
| @@ -15,6 +15,11 @@ static void usage() | @@ -15,6 +15,11 @@ static void usage() | ||
| 15 | exit(2); | 15 | exit(2); |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | +static void write_progress(int percent, void* data) | ||
| 19 | +{ | ||
| 20 | + printf("%s progress: %d%%\n", (char const*)(data), percent); | ||
| 21 | +} | ||
| 22 | + | ||
| 18 | int main(int argc, char* argv[]) | 23 | int main(int argc, char* argv[]) |
| 19 | { | 24 | { |
| 20 | char* infile = NULL; | 25 | char* infile = NULL; |
| @@ -55,6 +60,7 @@ int main(int argc, char* argv[]) | @@ -55,6 +60,7 @@ int main(int argc, char* argv[]) | ||
| 55 | * qpdf_set_deterministic_ID. */ | 60 | * qpdf_set_deterministic_ID. */ |
| 56 | qpdf_set_static_ID(qpdf, QPDF_TRUE); /* for testing only */ | 61 | qpdf_set_static_ID(qpdf, QPDF_TRUE); /* for testing only */ |
| 57 | qpdf_set_linearization(qpdf, QPDF_TRUE); | 62 | qpdf_set_linearization(qpdf, QPDF_TRUE); |
| 63 | + qpdf_register_progress_reporter(qpdf, write_progress, infile); | ||
| 58 | qpdf_write(qpdf); | 64 | qpdf_write(qpdf); |
| 59 | } | 65 | } |
| 60 | while (qpdf_more_warnings(qpdf)) | 66 | while (qpdf_more_warnings(qpdf)) |
examples/qtest/linearize.test
| @@ -15,7 +15,8 @@ my $qpdf = $ENV{'QPDF_BIN'} or die; | @@ -15,7 +15,8 @@ my $qpdf = $ENV{'QPDF_BIN'} or die; | ||
| 15 | 15 | ||
| 16 | $td->runtest("linearize", | 16 | $td->runtest("linearize", |
| 17 | {$td->COMMAND => "pdf-linearize input.pdf '' a.pdf"}, | 17 | {$td->COMMAND => "pdf-linearize input.pdf '' a.pdf"}, |
| 18 | - {$td->STRING => "", $td->EXIT_STATUS => 0}); | 18 | + {$td->REGEXP => '(?s).*input\.pdf progress: \d+\%.*', |
| 19 | + $td->EXIT_STATUS => 0}); | ||
| 19 | 20 | ||
| 20 | $td->runtest("check", | 21 | $td->runtest("check", |
| 21 | {$td->COMMAND => "$qpdf --check a.pdf"}, | 22 | {$td->COMMAND => "$qpdf --check a.pdf"}, |
include/qpdf/qpdf-c.h
| @@ -467,6 +467,18 @@ extern "C" { | @@ -467,6 +467,18 @@ extern "C" { | ||
| 467 | void qpdf_force_pdf_version_and_extension( | 467 | void qpdf_force_pdf_version_and_extension( |
| 468 | qpdf_data qpdf, char const* version, int extension_level); | 468 | qpdf_data qpdf, char const* version, int extension_level); |
| 469 | 469 | ||
| 470 | + /* During write, your report_progress function will be called with | ||
| 471 | + * a value between 0 and 100 representing the approximate write | ||
| 472 | + * progress. The data object you pass to | ||
| 473 | + * qpdf_register_progress_reporter will be handed back to your | ||
| 474 | + * function. | ||
| 475 | + */ | ||
| 476 | + QPDF_DLL | ||
| 477 | + void qpdf_register_progress_reporter( | ||
| 478 | + qpdf_data qpdf, | ||
| 479 | + void (*report_progress)(int percent, void* data), | ||
| 480 | + void* data); | ||
| 481 | + | ||
| 470 | /* Do actual write operation. */ | 482 | /* Do actual write operation. */ |
| 471 | QPDF_DLL | 483 | QPDF_DLL |
| 472 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf); | 484 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf); |
libqpdf/qpdf-c.cc
| @@ -57,6 +57,30 @@ _qpdf_data::~_qpdf_data() | @@ -57,6 +57,30 @@ _qpdf_data::~_qpdf_data() | ||
| 57 | { | 57 | { |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | +class ProgressReporter: public QPDFWriter::ProgressReporter | ||
| 61 | +{ | ||
| 62 | + public: | ||
| 63 | + ProgressReporter(void (*handler)(int, void*), void* data); | ||
| 64 | + virtual ~ProgressReporter() = default; | ||
| 65 | + virtual void reportProgress(int); | ||
| 66 | + | ||
| 67 | + private: | ||
| 68 | + void (*handler)(int, void*); | ||
| 69 | + void* data; | ||
| 70 | +}; | ||
| 71 | + | ||
| 72 | +ProgressReporter::ProgressReporter(void (*handler)(int, void*), void* data) : | ||
| 73 | + handler(handler), | ||
| 74 | + data(data) | ||
| 75 | +{ | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +void | ||
| 79 | +ProgressReporter::reportProgress(int progress) | ||
| 80 | +{ | ||
| 81 | + this->handler(progress, this->data); | ||
| 82 | +} | ||
| 83 | + | ||
| 60 | // must set qpdf->filename and qpdf->password | 84 | // must set qpdf->filename and qpdf->password |
| 61 | static void call_read(qpdf_data qpdf) | 85 | static void call_read(qpdf_data qpdf) |
| 62 | { | 86 | { |
| @@ -752,6 +776,15 @@ void qpdf_force_pdf_version_and_extension( | @@ -752,6 +776,15 @@ void qpdf_force_pdf_version_and_extension( | ||
| 752 | qpdf->qpdf_writer->forcePDFVersion(version, extension_level); | 776 | qpdf->qpdf_writer->forcePDFVersion(version, extension_level); |
| 753 | } | 777 | } |
| 754 | 778 | ||
| 779 | +void qpdf_register_progress_reporter( | ||
| 780 | + qpdf_data qpdf, | ||
| 781 | + void (*report_progress)(int percent, void* data), | ||
| 782 | + void* data) | ||
| 783 | +{ | ||
| 784 | + qpdf->qpdf_writer->registerProgressReporter( | ||
| 785 | + new ProgressReporter(report_progress, data)); | ||
| 786 | +} | ||
| 787 | + | ||
| 755 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf) | 788 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf) |
| 756 | { | 789 | { |
| 757 | QPDF_ERROR_CODE status = QPDF_SUCCESS; | 790 | QPDF_ERROR_CODE status = QPDF_SUCCESS; |