From 2d32f4db8fd125f2481ecf767d9f6506e80481f6 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 20 Jan 2019 22:48:24 -0500 Subject: [PATCH] Handle fallback font size in text appearances If we end up using our fallback font size when generating appearances for text fields, reflect that in the Tf operator used in the appearance stream. --- ChangeLog | 3 + libqpdf/QPDFFormFieldObjectHelper.cc | 36 +- qpdf/qpdf.testcov | 1 + qpdf/qtest/qpdf/appearances-a-more2.pdf | 310 ++++++++-------- qpdf/qtest/qpdf/need-appearances-more2.pdf | 398 ++++++++++----------- 5 files changed, 393 insertions(+), 355 deletions(-) diff --git a/ChangeLog b/ChangeLog index 545c75c4..a079c691 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2019-01-20 Jay Berkenbilt + * 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 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; @@ -768,6 +777,30 @@ TfFinder::getTf() return this->tf; } +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() { @@ -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 [<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 [<45201f7a345625a01ccb53b240a8ba8d>] >> startxref -64402 +64401 %%EOF