Commit b48a0ff0e8e1861884b2dac62d98d39f8e194086
1 parent
8cf7f2bf
Add qpdf_empty_pdf to C API
Showing
8 changed files
with
61 additions
and
7 deletions
ChangeLog
TODO
| 1 | 1 | 10.6 |
| 2 | 2 | ==== |
| 3 | 3 | |
| 4 | -* Expose emptyPDF to the C API. Ensure that qpdf_get_qpdf_version is | |
| 5 | - always static. | |
| 6 | - | |
| 7 | 4 | * Consider doing one big commit to reformat the entire codebase using |
| 8 | 5 | clang-format or a similar tool. Consider using blame.ignoreRevsFile |
| 9 | 6 | or similar (or otherwise study git blame to see how to minimize the | ... | ... |
include/qpdf/qpdf-c.h
| ... | ... | @@ -178,9 +178,9 @@ extern "C" { |
| 178 | 178 | char const* qpdf_get_qpdf_version(); |
| 179 | 179 | |
| 180 | 180 | /* Returns dynamically allocated qpdf_data pointer; must be freed |
| 181 | - * by calling qpdf_cleanup. You must call qpdf_read or one of the | |
| 182 | - * other qpdf_read_* functions before calling any function that | |
| 183 | - * would need to operate on the PDF file. | |
| 181 | + * by calling qpdf_cleanup. You must call qpdf_read, one of the | |
| 182 | + * other qpdf_read_* functions, or qpdf_empty_pdf before calling | |
| 183 | + * any function that would need to operate on the PDF file. | |
| 184 | 184 | */ |
| 185 | 185 | QPDF_DLL |
| 186 | 186 | qpdf_data qpdf_init(); |
| ... | ... | @@ -289,6 +289,13 @@ extern "C" { |
| 289 | 289 | unsigned long long size, |
| 290 | 290 | char const* password); |
| 291 | 291 | |
| 292 | + /* Calling qpdf_empty_pdf initializes this qpdf object with an | |
| 293 | + * empty PDF, making it possible to create a PDF from scratch | |
| 294 | + * using the C API. Added in 10.6. | |
| 295 | + */ | |
| 296 | + QPDF_DLL | |
| 297 | + QPDF_ERROR_CODE qpdf_empty_pdf(qpdf_data qpdf); | |
| 298 | + | |
| 292 | 299 | /* Read functions below must be called after qpdf_read or |
| 293 | 300 | * qpdf_read_memory. */ |
| 294 | 301 | ... | ... |
libqpdf/qpdf-c.cc
| ... | ... | @@ -356,6 +356,14 @@ QPDF_ERROR_CODE qpdf_read_memory(qpdf_data qpdf, |
| 356 | 356 | return status; |
| 357 | 357 | } |
| 358 | 358 | |
| 359 | +QPDF_ERROR_CODE qpdf_empty_pdf(qpdf_data qpdf) | |
| 360 | +{ | |
| 361 | + qpdf->filename = "empty PDF"; | |
| 362 | + qpdf->qpdf->emptyPDF(); | |
| 363 | + QTC::TC("qpdf", "qpdf-c called qpdf_empty_pdf"); | |
| 364 | + return QPDF_SUCCESS; | |
| 365 | +} | |
| 366 | + | |
| 359 | 367 | char const* qpdf_get_pdf_version(qpdf_data qpdf) |
| 360 | 368 | { |
| 361 | 369 | QTC::TC("qpdf", "qpdf-c called qpdf_get_pdf_version"); | ... | ... |
qpdf/qpdf-ctest.c
| ... | ... | @@ -1242,6 +1242,19 @@ static void test40(char const* infile, |
| 1242 | 1242 | report_errors(); |
| 1243 | 1243 | } |
| 1244 | 1244 | |
| 1245 | +static void test41(char const* infile, | |
| 1246 | + char const* password, | |
| 1247 | + char const* outfile, | |
| 1248 | + char const* xarg) | |
| 1249 | +{ | |
| 1250 | + /* Empty PDF -- infile is ignored*/ | |
| 1251 | + assert(qpdf_empty_pdf(qpdf) == 0); | |
| 1252 | + qpdf_init_write(qpdf, outfile); | |
| 1253 | + qpdf_set_static_ID(qpdf, QPDF_TRUE); | |
| 1254 | + qpdf_write(qpdf); | |
| 1255 | + report_errors(); | |
| 1256 | +} | |
| 1257 | + | |
| 1245 | 1258 | int main(int argc, char* argv[]) |
| 1246 | 1259 | { |
| 1247 | 1260 | char* p = 0; |
| ... | ... | @@ -1322,6 +1335,7 @@ int main(int argc, char* argv[]) |
| 1322 | 1335 | (n == 38) ? test38 : |
| 1323 | 1336 | (n == 39) ? test39 : |
| 1324 | 1337 | (n == 40) ? test40 : |
| 1338 | + (n == 41) ? test41 : | |
| 1325 | 1339 | 0); |
| 1326 | 1340 | |
| 1327 | 1341 | if (fn == 0) | ... | ... |
qpdf/qpdf.testcov
qpdf/qtest/qpdf.test
| ... | ... | @@ -3553,7 +3553,7 @@ my @capi = ( |
| 3553 | 3553 | [8, 'no original object ids'], |
| 3554 | 3554 | [9, 'uncompressed streams'], |
| 3555 | 3555 | ); |
| 3556 | -$n_tests += (2 * @capi) + 3; | |
| 3556 | +$n_tests += (2 * @capi) + 5; | |
| 3557 | 3557 | foreach my $d (@capi) |
| 3558 | 3558 | { |
| 3559 | 3559 | my ($n, $description) = @$d; |
| ... | ... | @@ -3590,6 +3590,14 @@ $td->runtest("write damaged", |
| 3590 | 3590 | $td->EXIT_STATUS => 0}, |
| 3591 | 3591 | $td->NORMALIZE_NEWLINES); |
| 3592 | 3592 | |
| 3593 | +$td->runtest("empty PDF", | |
| 3594 | + {$td->COMMAND => "qpdf-ctest 41 - '' a.pdf"}, | |
| 3595 | + {$td->STRING => "C test 41 done\n", $td->EXIT_STATUS => 0}, | |
| 3596 | + $td->NORMALIZE_NEWLINES); | |
| 3597 | +$td->runtest("check output", | |
| 3598 | + {$td->FILE => "a.pdf"}, | |
| 3599 | + {$td->FILE => "c-empty.pdf"}); | |
| 3600 | + | |
| 3593 | 3601 | show_ntests(); |
| 3594 | 3602 | # ---------- |
| 3595 | 3603 | $td->notify("--- Deterministic ID Tests ---"); | ... | ... |
qpdf/qtest/qpdf/c-empty.pdf
0 → 100644
| 1 | +%PDF-1.3 | |
| 2 | +%¿÷¢þ | |
| 3 | +1 0 obj | |
| 4 | +<< /Pages 2 0 R /Type /Catalog >> | |
| 5 | +endobj | |
| 6 | +2 0 obj | |
| 7 | +<< /Count 0 /Kids [ ] /Type /Pages >> | |
| 8 | +endobj | |
| 9 | +xref | |
| 10 | +0 3 | |
| 11 | +0000000000 65535 f | |
| 12 | +0000000015 00000 n | |
| 13 | +0000000064 00000 n | |
| 14 | +trailer << /Root 1 0 R /Size 3 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> | |
| 15 | +startxref | |
| 16 | +117 | |
| 17 | +%%EOF | ... | ... |