[poppler] Patches for form choice fields
Carlos Garcia Campos
carlosgc at gnome.org
Sat Nov 3 02:07:19 PDT 2012
Fabio D'Urso <fabiodurso at hotmail.it> writes:
> On Sunday, October 14, 2012 04:26:02 PM Fabio D'Urso wrote:
>> [snip]
>> So we have two working options:
>> - Always write /I, not matter if multiselect is true or false (current
>> approach in my 0002 patch)
>> - Only write /I if multiselect is true, but write export values instead of
>> option names in /V, which is also against the specs
>
> Hi,
Hi,
> I'm attaching a new set of patches implementing the second option.
> They no longer abuse the /I property for single-selection only fields, instead
> they only break the spec in two things:
> 1. They write/expect the export value instead of the option name, if an
> export value is present (see patches 0004 and 0005);
> 2. If /I is present, it is given precedence over /V to determine initially
> selected options. In other words, if /I and /V don't agree, /I is used.
> This is the reverse of what the spec says (table 231 - last paragraph),
> but acroread seems to do the same (see patches 0003 and 0006).
>
> Note that #2 only affects how poppler decides which option are initially
> selected. #1 is a little more sensible because it causes poppler to produce
> invalid documents with reference to the PDF spec but, as I've explained in the
> previous posts, tests show that acroread expects *this* behavior and there's
> at least foxit already doing this. Therefore, I feel that we're on a safe
> track.
>
> Details for each patch:
>
> == 0001-FormFieldChoice-ctor-Don-t-convert-human-readable-op.patch ==
>
> With this patch, poppler no longer converts option names to Unicode while
> reading them. Note that frontend clients won't notice the difference because
> both glib and qt4 re-handle encoding conversion internally.
>
> I've removed the conversion so that when we write /V, we set it to a string
> that is binary-equal to the corresponding /Opt entry.
> Without this patch, it often occurred that poppler couldn't parse the selected
> option in forms saved by poppler itself: it wrote a Unicode string in /V, but
> when it read the resulting file it compared /V against the strings in /Opt,
> which are usually in pdfdoc encoding. Since it is a binary comparison, all
> tests failed and no selected option was shown.
> I could have fixed it by making the comparison encoding-aware, but this
> approach seems to work just fine and therefore I've decided to keep it simple.
> Note: Documents saved with old poppler versions will not work, but I haven't
> worried about them as they have never really worked anyway.
>
> == 0002-FormFieldChoice-updateSelection-Fixed-wrong-loop-con.patch ==
>
> Fixes a wrong loop condition. I've put it in a dedicated patch so that you can
> push it to 0.20 too.
Pushed to the stable branch too.
> == 0003-FormFieldChoice-updateSelection-Write-I-too.patch ==
>
> This patch writes the /I property if the field supports multiple selection or
> removes /I if it doesn't. In other words, this patch makes sure that /I, if
> present, is updated to the current selection. This fixes the situation in
> which the orginal document contained /I, we changed selection (by updating /V
> only) and acroread still showed the old value because /I had not been updated.
>
> Note: This *acroread* behavior is against the spec, that say that "if the
> items identified by I differ from those in the V entry of the field
> dictionary, the V entry shall be used" (table 231 - last paragraph). Note that
> in patch 0006 I knowingly introduce the same bug in poppler too. See below for
> details.
>
> == 0004-FormFieldChoice-ctor-Be-able-to-understand-V-values-.patch,
> 0005-FormFieldChoice-updateSelection-Write-the-export-val.patch ===
>
> These two patches break the spec to overcome the issue described here:
> http://lists.freedesktop.org/archives/poppler/2012-October/009641.html .
>
> They make poppler expect/write the export name instead of the option name if
> both are present (i.e. if /Opt is an array of string pairs).
>
> NOTE: With the 5 patches so far, choice fields should be already fully
> working, with the exception of those with duplicate options.
I've pushed these merged.
> == 0006-FormFieldChoice-ctor-Look-for-selected-options-in-I-.patch ==
>
> This patch adds support to parse selected options from /I.
> According to the spec, data in /I should be compared with data in /V and /V
> should be used if they differ. However, acroread seems to blindly trust /I and
> so I've decided to keep things simple and do the same.
>
> Using /I, if available, instead of /V gives us better handling of duplicate
> options (which couldn't be distinguished otherwise) and independence on the
> option name vs export value issue (because we don't look at /V at all).
> Note: This patch only adds about 10 lines, the rest is just indentation change
Editable form field choices are currently broken in evince, but I've
tried the patches with poppler-glib-demo and they work as expected
(matching acroread behaviour).
> P.S.: I'm working on three more patches about editable combobox fields that
> fix the issue described here:
> http://lists.freedesktop.org/archives/poppler/2012-October/009688.html .
> I'll post them in that thread.
Thanks!
> Thank you,
> Fabio
--
Carlos Garcia Campos
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/poppler/attachments/20121103/e0fbe413/attachment-0001.pgp>
More information about the poppler
mailing list