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
examples/pdf-linearize.c
| ... | ... | @@ -15,6 +15,11 @@ static void usage() |
| 15 | 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 | 23 | int main(int argc, char* argv[]) |
| 19 | 24 | { |
| 20 | 25 | char* infile = NULL; |
| ... | ... | @@ -55,6 +60,7 @@ int main(int argc, char* argv[]) |
| 55 | 60 | * qpdf_set_deterministic_ID. */ |
| 56 | 61 | qpdf_set_static_ID(qpdf, QPDF_TRUE); /* for testing only */ |
| 57 | 62 | qpdf_set_linearization(qpdf, QPDF_TRUE); |
| 63 | + qpdf_register_progress_reporter(qpdf, write_progress, infile); | |
| 58 | 64 | qpdf_write(qpdf); |
| 59 | 65 | } |
| 60 | 66 | while (qpdf_more_warnings(qpdf)) | ... | ... |
examples/qtest/linearize.test
| ... | ... | @@ -15,7 +15,8 @@ my $qpdf = $ENV{'QPDF_BIN'} or die; |
| 15 | 15 | |
| 16 | 16 | $td->runtest("linearize", |
| 17 | 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 | 21 | $td->runtest("check", |
| 21 | 22 | {$td->COMMAND => "$qpdf --check a.pdf"}, | ... | ... |
include/qpdf/qpdf-c.h
| ... | ... | @@ -467,6 +467,18 @@ extern "C" { |
| 467 | 467 | void qpdf_force_pdf_version_and_extension( |
| 468 | 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 | 482 | /* Do actual write operation. */ |
| 471 | 483 | QPDF_DLL |
| 472 | 484 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf); | ... | ... |
libqpdf/qpdf-c.cc
| ... | ... | @@ -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 | 84 | // must set qpdf->filename and qpdf->password |
| 61 | 85 | static void call_read(qpdf_data qpdf) |
| 62 | 86 | { |
| ... | ... | @@ -752,6 +776,15 @@ void qpdf_force_pdf_version_and_extension( |
| 752 | 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 | 788 | QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf) |
| 756 | 789 | { |
| 757 | 790 | QPDF_ERROR_CODE status = QPDF_SUCCESS; | ... | ... |