diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | libqpdf/QPDFFormFieldObjectHelper.cc | 36 | ||||
-rw-r--r-- | qpdf/qpdf.testcov | 1 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/appearances-a-more2.pdf | 310 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/need-appearances-more2.pdf | 398 |
5 files changed, 393 insertions, 355 deletions
@@ -1,5 +1,8 @@ 2019-01-20 Jay Berkenbilt <ejb@ql.org> + * Tweak the content code generated for variable text fields to + better handle font sizes and multi-line text. + * When generating appearance streams for variable text annotations, properly handle the cases of there being no appearance dictionary, no appearance stream, or an appearance diff --git a/libqpdf/QPDFFormFieldObjectHelper.cc b/libqpdf/QPDFFormFieldObjectHelper.cc index da49505a..38755388 100644 --- a/libqpdf/QPDFFormFieldObjectHelper.cc +++ b/libqpdf/QPDFFormFieldObjectHelper.cc @@ -715,17 +715,23 @@ class TfFinder: public QPDFObjectHandle::TokenFilter virtual void handleToken(QPDFTokenizer::Token const&); double getTf(); std::string getFontName(); + std::string getDA(); private: double tf; + size_t tf_idx; std::string font_name; double last_num; + size_t last_num_idx; std::string last_name; + std::vector<std::string> DA; }; TfFinder::TfFinder() : tf(11.0), - last_num(0.0) + tf_idx(0), + last_num(0.0), + last_num_idx(0) { } @@ -734,11 +740,13 @@ TfFinder::handleToken(QPDFTokenizer::Token const& token) { QPDFTokenizer::token_type_e ttype = token.getType(); std::string value = token.getValue(); + DA.push_back(token.getRawValue()); switch (ttype) { case QPDFTokenizer::tt_integer: case QPDFTokenizer::tt_real: last_num = strtod(value.c_str(), 0); + last_num_idx = DA.size() - 1; break; case QPDFTokenizer::tt_name: @@ -754,6 +762,7 @@ TfFinder::handleToken(QPDFTokenizer::Token const& token) // insane things or suffering from over/underflow tf = last_num; } + tf_idx = last_num_idx; font_name = last_name; break; @@ -769,6 +778,30 @@ TfFinder::getTf() } std::string +TfFinder::getDA() +{ + std::string result; + size_t n = this->DA.size(); + for (size_t i = 0; i < n; ++i) + { + std::string cur = this->DA.at(i); + if (i == tf_idx) + { + double delta = strtod(cur.c_str(), 0) - this->tf; + if ((delta > 0.001) || (delta < -0.001)) + { + // tf doesn't match the font size passed to Tf, so + // substitute. + QTC::TC("qpdf", "QPDFFormFieldObjectHelper fallback Tf"); + cur = QUtil::double_to_string(tf); + } + } + result += cur; + } + return result; +} + +std::string TfFinder::getFontName() { return this->font_name; @@ -843,6 +876,7 @@ QPDFFormFieldObjectHelper::generateTextAppearance( tok.write(QUtil::unsigned_char_pointer(DA.c_str()), DA.length()); tok.finish(); double tf = tff.getTf(); + DA = tff.getDA(); std::string (*encoder)(std::string const&, char) = &QUtil::utf8_to_ascii; std::string font_name = tff.getFontName(); diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 92e59424..b5330e58 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -425,3 +425,4 @@ QPDFPageDocumentHelper ignore annotation with no appearance 0 QPDFFormFieldObjectHelper create AS from scratch 0 QPDFFormFieldObjectHelper create AP from scratch 0 QPDFFormFieldObjectHelper replaced BMC at EOF 0 +QPDFFormFieldObjectHelper fallback Tf 0 diff --git a/qpdf/qtest/qpdf/appearances-a-more2.pdf b/qpdf/qtest/qpdf/appearances-a-more2.pdf index 45388574..60ffa989 100644 --- a/qpdf/qtest/qpdf/appearances-a-more2.pdf +++ b/qpdf/qtest/qpdf/appearances-a-more2.pdf @@ -485,8 +485,8 @@ stream /Tx BMC q BT -0.18039 0.20392 0.21176 rg /F2 12 Tf -1 2.600000 Td +0.18039 0.20392 0.21176 rg /F2 11.000000 Tf +1 3.000000 Td (abc) Tj ET Q @@ -496,7 +496,7 @@ endobj %QDF: ignore_newline 14 0 obj -81 +88 endobj 15 0 obj @@ -3017,157 +3017,157 @@ xref 0000007341 00000 n 0000007363 00000 n 0000007453 00000 n -0000007864 00000 n -0000007884 00000 n -0000008304 00000 n -0000008324 00000 n -0000008750 00000 n -0000008771 00000 n -0000009328 00000 n -0000009349 00000 n -0000009778 00000 n -0000009799 00000 n -0000010224 00000 n -0000010245 00000 n -0000011468 00000 n -0000011489 00000 n -0000011810 00000 n -0000011830 00000 n -0000012359 00000 n -0000012380 00000 n -0000012701 00000 n -0000012721 00000 n -0000013112 00000 n -0000013132 00000 n -0000013453 00000 n -0000013473 00000 n -0000013794 00000 n -0000013814 00000 n -0000014343 00000 n -0000014364 00000 n -0000014685 00000 n -0000014705 00000 n -0000015455 00000 n -0000015844 00000 n -0000016295 00000 n -0000018212 00000 n -0000018582 00000 n -0000020496 00000 n -0000020577 00000 n -0000020689 00000 n -0000020784 00000 n -0000020896 00000 n -0000020991 00000 n -0000021103 00000 n -0000021198 00000 n -0000021293 00000 n -0000021388 00000 n -0000021483 00000 n -0000021578 00000 n -0000021673 00000 n -0000021785 00000 n -0000021880 00000 n -0000021975 00000 n -0000022070 00000 n -0000022165 00000 n -0000022260 00000 n -0000022355 00000 n -0000022450 00000 n -0000022545 00000 n -0000022640 00000 n -0000022735 00000 n -0000022847 00000 n -0000022942 00000 n -0000023037 00000 n -0000023132 00000 n -0000023227 00000 n -0000023322 00000 n -0000023417 00000 n -0000023512 00000 n -0000023607 00000 n -0000023702 00000 n -0000023797 00000 n -0000023909 00000 n -0000024004 00000 n -0000024099 00000 n -0000024194 00000 n -0000024312 00000 n -0000024407 00000 n -0000024502 00000 n -0000024597 00000 n -0000024692 00000 n -0000024787 00000 n -0000024905 00000 n -0000025001 00000 n -0000025097 00000 n -0000025193 00000 n -0000025289 00000 n -0000025385 00000 n -0000025481 00000 n -0000025578 00000 n -0000025675 00000 n -0000025772 00000 n -0000025869 00000 n -0000025966 00000 n -0000026063 00000 n -0000026160 00000 n -0000026257 00000 n -0000026354 00000 n -0000026599 00000 n -0000027360 00000 n -0000027382 00000 n -0000027598 00000 n -0000027842 00000 n -0000028483 00000 n -0000028505 00000 n -0000028720 00000 n -0000028777 00000 n -0000028834 00000 n -0000028891 00000 n -0000028948 00000 n -0000029005 00000 n -0000029062 00000 n -0000029119 00000 n -0000029176 00000 n -0000029233 00000 n -0000029290 00000 n -0000029347 00000 n -0000029404 00000 n -0000029461 00000 n -0000029518 00000 n -0000029575 00000 n -0000029632 00000 n -0000029689 00000 n -0000029746 00000 n -0000029803 00000 n -0000029860 00000 n -0000029917 00000 n -0000029974 00000 n -0000030031 00000 n -0000030088 00000 n -0000030145 00000 n -0000030202 00000 n -0000030259 00000 n -0000030316 00000 n -0000030373 00000 n -0000030430 00000 n -0000030487 00000 n -0000030544 00000 n -0000030601 00000 n -0000030658 00000 n -0000030715 00000 n -0000030772 00000 n -0000030829 00000 n -0000030886 00000 n -0000030943 00000 n -0000031000 00000 n -0000031057 00000 n -0000031114 00000 n -0000031171 00000 n -0000031228 00000 n -0000047510 00000 n -0000047534 00000 n -0000058720 00000 n +0000007871 00000 n +0000007891 00000 n +0000008311 00000 n +0000008331 00000 n +0000008757 00000 n +0000008778 00000 n +0000009335 00000 n +0000009356 00000 n +0000009785 00000 n +0000009806 00000 n +0000010231 00000 n +0000010252 00000 n +0000011475 00000 n +0000011496 00000 n +0000011817 00000 n +0000011837 00000 n +0000012366 00000 n +0000012387 00000 n +0000012708 00000 n +0000012728 00000 n +0000013119 00000 n +0000013139 00000 n +0000013460 00000 n +0000013480 00000 n +0000013801 00000 n +0000013821 00000 n +0000014350 00000 n +0000014371 00000 n +0000014692 00000 n +0000014712 00000 n +0000015462 00000 n +0000015851 00000 n +0000016302 00000 n +0000018219 00000 n +0000018589 00000 n +0000020503 00000 n +0000020584 00000 n +0000020696 00000 n +0000020791 00000 n +0000020903 00000 n +0000020998 00000 n +0000021110 00000 n +0000021205 00000 n +0000021300 00000 n +0000021395 00000 n +0000021490 00000 n +0000021585 00000 n +0000021680 00000 n +0000021792 00000 n +0000021887 00000 n +0000021982 00000 n +0000022077 00000 n +0000022172 00000 n +0000022267 00000 n +0000022362 00000 n +0000022457 00000 n +0000022552 00000 n +0000022647 00000 n +0000022742 00000 n +0000022854 00000 n +0000022949 00000 n +0000023044 00000 n +0000023139 00000 n +0000023234 00000 n +0000023329 00000 n +0000023424 00000 n +0000023519 00000 n +0000023614 00000 n +0000023709 00000 n +0000023804 00000 n +0000023916 00000 n +0000024011 00000 n +0000024106 00000 n +0000024201 00000 n +0000024319 00000 n +0000024414 00000 n +0000024509 00000 n +0000024604 00000 n +0000024699 00000 n +0000024794 00000 n +0000024912 00000 n +0000025008 00000 n +0000025104 00000 n +0000025200 00000 n +0000025296 00000 n +0000025392 00000 n +0000025488 00000 n +0000025585 00000 n +0000025682 00000 n +0000025779 00000 n +0000025876 00000 n +0000025973 00000 n +0000026070 00000 n +0000026167 00000 n +0000026264 00000 n +0000026361 00000 n +0000026606 00000 n +0000027367 00000 n +0000027389 00000 n +0000027605 00000 n +0000027849 00000 n +0000028490 00000 n +0000028512 00000 n +0000028727 00000 n +0000028784 00000 n +0000028841 00000 n +0000028898 00000 n +0000028955 00000 n +0000029012 00000 n +0000029069 00000 n +0000029126 00000 n +0000029183 00000 n +0000029240 00000 n +0000029297 00000 n +0000029354 00000 n +0000029411 00000 n +0000029468 00000 n +0000029525 00000 n +0000029582 00000 n +0000029639 00000 n +0000029696 00000 n +0000029753 00000 n +0000029810 00000 n +0000029867 00000 n +0000029924 00000 n +0000029981 00000 n +0000030038 00000 n +0000030095 00000 n +0000030152 00000 n +0000030209 00000 n +0000030266 00000 n +0000030323 00000 n +0000030380 00000 n +0000030437 00000 n +0000030494 00000 n +0000030551 00000 n +0000030608 00000 n +0000030665 00000 n +0000030722 00000 n +0000030779 00000 n +0000030836 00000 n +0000030893 00000 n +0000030950 00000 n +0000031007 00000 n +0000031064 00000 n +0000031121 00000 n +0000031178 00000 n +0000031235 00000 n +0000047517 00000 n +0000047541 00000 n +0000058727 00000 n trailer << /DocChecksum /CC322E136FE95DECF8BC297B1A9B2C2E /Info 2 0 R @@ -3176,5 +3176,5 @@ trailer << /ID [<f8abc47bb1df544a0df9c15a75ef0046><31415926535897932384626433832795>] >> startxref -58744 +58751 %%EOF diff --git a/qpdf/qtest/qpdf/need-appearances-more2.pdf b/qpdf/qtest/qpdf/need-appearances-more2.pdf index f9e108e2..b78fc53e 100644 --- a/qpdf/qtest/qpdf/need-appearances-more2.pdf +++ b/qpdf/qtest/qpdf/need-appearances-more2.pdf @@ -61,7 +61,7 @@ endobj /AP << /N 19 0 R >> - /DA (0.18039 0.20392 0.21176 rg /F2 12 Tf) + /DA (0.18039 0.20392 0.21176 rg /F2 0 Tf) /DR << /Font 18 0 R >> @@ -3572,203 +3572,203 @@ xref 0000000439 00000 n 0000000624 00000 n 0000000697 00000 n -0000000997 00000 n -0000001128 00000 n -0000001499 00000 n -0000001888 00000 n -0000002277 00000 n -0000002408 00000 n -0000002752 00000 n -0000003179 00000 n -0000003655 00000 n -0000004076 00000 n -0000004547 00000 n -0000004791 00000 n -0000004930 00000 n -0000005080 00000 n -0000005170 00000 n -0000005325 00000 n -0000005344 00000 n -0000005708 00000 n -0000006074 00000 n -0000006440 00000 n -0000006608 00000 n -0000006628 00000 n -0000006866 00000 n -0000006886 00000 n -0000006967 00000 n -0000007135 00000 n -0000007155 00000 n -0000007393 00000 n -0000007413 00000 n -0000007581 00000 n -0000007601 00000 n -0000007839 00000 n -0000007859 00000 n -0000008225 00000 n -0000008589 00000 n -0000008955 00000 n -0000009124 00000 n -0000009144 00000 n -0000009345 00000 n -0000009365 00000 n -0000009566 00000 n -0000009586 00000 n -0000009789 00000 n -0000009809 00000 n -0000010008 00000 n -0000010051 00000 n -0000014877 00000 n -0000014899 00000 n -0000015683 00000 n -0000016084 00000 n -0000016535 00000 n -0000018452 00000 n -0000018822 00000 n -0000020736 00000 n -0000021112 00000 n -0000021133 00000 n -0000021301 00000 n -0000021321 00000 n -0000021697 00000 n -0000021718 00000 n -0000021886 00000 n -0000021906 00000 n -0000022282 00000 n -0000022303 00000 n -0000022471 00000 n -0000022491 00000 n -0000022867 00000 n -0000022888 00000 n -0000023056 00000 n -0000023076 00000 n -0000023452 00000 n -0000023473 00000 n -0000023641 00000 n -0000023661 00000 n -0000024037 00000 n -0000024058 00000 n -0000024226 00000 n -0000024246 00000 n -0000024359 00000 n -0000024455 00000 n -0000024568 00000 n -0000024664 00000 n -0000024777 00000 n -0000024873 00000 n -0000024969 00000 n -0000025065 00000 n -0000025161 00000 n -0000025257 00000 n -0000025353 00000 n -0000025466 00000 n -0000025562 00000 n -0000025658 00000 n -0000025754 00000 n -0000025850 00000 n -0000025946 00000 n -0000026042 00000 n -0000026139 00000 n -0000026236 00000 n -0000026333 00000 n -0000026430 00000 n -0000026544 00000 n -0000026641 00000 n -0000026738 00000 n -0000026835 00000 n -0000026932 00000 n -0000027029 00000 n -0000027126 00000 n -0000027223 00000 n -0000027320 00000 n -0000027417 00000 n -0000027514 00000 n -0000027628 00000 n -0000027725 00000 n -0000027822 00000 n -0000027919 00000 n -0000028039 00000 n -0000028136 00000 n -0000028233 00000 n -0000028330 00000 n -0000028427 00000 n -0000028524 00000 n -0000028644 00000 n -0000028742 00000 n -0000028840 00000 n -0000028938 00000 n -0000029036 00000 n -0000029134 00000 n -0000029232 00000 n -0000029330 00000 n -0000029428 00000 n -0000029526 00000 n -0000029624 00000 n -0000029722 00000 n -0000029820 00000 n -0000029918 00000 n -0000030016 00000 n -0000030114 00000 n -0000030359 00000 n -0000031120 00000 n -0000031142 00000 n -0000031358 00000 n -0000031602 00000 n -0000032243 00000 n -0000032265 00000 n -0000032480 00000 n -0000032537 00000 n -0000032594 00000 n -0000032651 00000 n -0000032708 00000 n -0000032765 00000 n -0000032822 00000 n -0000032879 00000 n -0000032936 00000 n -0000032993 00000 n -0000033050 00000 n -0000033107 00000 n -0000033164 00000 n -0000033221 00000 n -0000033278 00000 n -0000033335 00000 n -0000033392 00000 n -0000033449 00000 n -0000033506 00000 n -0000033563 00000 n -0000033620 00000 n -0000033677 00000 n -0000033734 00000 n -0000033791 00000 n -0000033848 00000 n -0000033905 00000 n -0000033962 00000 n -0000034019 00000 n -0000034076 00000 n -0000034133 00000 n -0000034190 00000 n -0000034247 00000 n -0000034304 00000 n -0000034361 00000 n -0000034418 00000 n -0000034475 00000 n -0000034532 00000 n -0000034589 00000 n -0000034646 00000 n -0000034703 00000 n -0000034760 00000 n -0000034817 00000 n -0000034874 00000 n -0000034931 00000 n -0000034988 00000 n -0000051270 00000 n -0000051294 00000 n -0000062480 00000 n -0000062504 00000 n -0000062839 00000 n -0000062982 00000 n -0000064207 00000 n -0000064229 00000 n +0000000996 00000 n +0000001127 00000 n +0000001498 00000 n +0000001887 00000 n +0000002276 00000 n +0000002407 00000 n +0000002751 00000 n +0000003178 00000 n +0000003654 00000 n +0000004075 00000 n +0000004546 00000 n +0000004790 00000 n +0000004929 00000 n +0000005079 00000 n +0000005169 00000 n +0000005324 00000 n +0000005343 00000 n +0000005707 00000 n +0000006073 00000 n +0000006439 00000 n +0000006607 00000 n +0000006627 00000 n +0000006865 00000 n +0000006885 00000 n +0000006966 00000 n +0000007134 00000 n +0000007154 00000 n +0000007392 00000 n +0000007412 00000 n +0000007580 00000 n +0000007600 00000 n +0000007838 00000 n +0000007858 00000 n +0000008224 00000 n +0000008588 00000 n +0000008954 00000 n +0000009123 00000 n +0000009143 00000 n +0000009344 00000 n +0000009364 00000 n +0000009565 00000 n +0000009585 00000 n +0000009788 00000 n +0000009808 00000 n +0000010007 00000 n +0000010050 00000 n +0000014876 00000 n +0000014898 00000 n +0000015682 00000 n +0000016083 00000 n +0000016534 00000 n +0000018451 00000 n +0000018821 00000 n +0000020735 00000 n +0000021111 00000 n +0000021132 00000 n +0000021300 00000 n +0000021320 00000 n +0000021696 00000 n +0000021717 00000 n +0000021885 00000 n +0000021905 00000 n +0000022281 00000 n +0000022302 00000 n +0000022470 00000 n +0000022490 00000 n +0000022866 00000 n +0000022887 00000 n +0000023055 00000 n +0000023075 00000 n +0000023451 00000 n +0000023472 00000 n +0000023640 00000 n +0000023660 00000 n +0000024036 00000 n +0000024057 00000 n +0000024225 00000 n +0000024245 00000 n +0000024358 00000 n +0000024454 00000 n +0000024567 00000 n +0000024663 00000 n +0000024776 00000 n +0000024872 00000 n +0000024968 00000 n +0000025064 00000 n +0000025160 00000 n +0000025256 00000 n +0000025352 00000 n +0000025465 00000 n +0000025561 00000 n +0000025657 00000 n +0000025753 00000 n +0000025849 00000 n +0000025945 00000 n +0000026041 00000 n +0000026138 00000 n +0000026235 00000 n +0000026332 00000 n +0000026429 00000 n +0000026543 00000 n +0000026640 00000 n +0000026737 00000 n +0000026834 00000 n +0000026931 00000 n +0000027028 00000 n +0000027125 00000 n +0000027222 00000 n +0000027319 00000 n +0000027416 00000 n +0000027513 00000 n +0000027627 00000 n +0000027724 00000 n +0000027821 00000 n +0000027918 00000 n +0000028038 00000 n +0000028135 00000 n +0000028232 00000 n +0000028329 00000 n +0000028426 00000 n +0000028523 00000 n +0000028643 00000 n +0000028741 00000 n +0000028839 00000 n +0000028937 00000 n +0000029035 00000 n +0000029133 00000 n +0000029231 00000 n +0000029329 00000 n +0000029427 00000 n +0000029525 00000 n +0000029623 00000 n +0000029721 00000 n +0000029819 00000 n +0000029917 00000 n +0000030015 00000 n +0000030113 00000 n +0000030358 00000 n +0000031119 00000 n +0000031141 00000 n +0000031357 00000 n +0000031601 00000 n +0000032242 00000 n +0000032264 00000 n +0000032479 00000 n +0000032536 00000 n +0000032593 00000 n +0000032650 00000 n +0000032707 00000 n +0000032764 00000 n +0000032821 00000 n +0000032878 00000 n +0000032935 00000 n +0000032992 00000 n +0000033049 00000 n +0000033106 00000 n +0000033163 00000 n +0000033220 00000 n +0000033277 00000 n +0000033334 00000 n +0000033391 00000 n +0000033448 00000 n +0000033505 00000 n +0000033562 00000 n +0000033619 00000 n +0000033676 00000 n +0000033733 00000 n +0000033790 00000 n +0000033847 00000 n +0000033904 00000 n +0000033961 00000 n +0000034018 00000 n +0000034075 00000 n +0000034132 00000 n +0000034189 00000 n +0000034246 00000 n +0000034303 00000 n +0000034360 00000 n +0000034417 00000 n +0000034474 00000 n +0000034531 00000 n +0000034588 00000 n +0000034645 00000 n +0000034702 00000 n +0000034759 00000 n +0000034816 00000 n +0000034873 00000 n +0000034930 00000 n +0000034987 00000 n +0000051269 00000 n +0000051293 00000 n +0000062479 00000 n +0000062503 00000 n +0000062838 00000 n +0000062981 00000 n +0000064206 00000 n +0000064228 00000 n trailer << /DocChecksum /CC322E136FE95DECF8BC297B1A9B2C2E /Info 2 0 R @@ -3777,5 +3777,5 @@ trailer << /ID [<f8abc47bb1df544a0df9c15a75ef0046><45201f7a345625a01ccb53b240a8ba8d>] >> startxref -64402 +64401 %%EOF |