From 26820b47434313b187d664ef702f48b1059bacb5 Mon Sep 17 00:00:00 2001 From: Ryan Harrison Date: Fri, 23 Feb 2018 22:10:06 +0000 Subject: Setup testing XFA using .in files This adds a number of {{}} style tags to the .in format that allow the fix-up script to inject XFA related boilerplate into the PDF, instead of having the .in file replicate this. A simple example XFA .in file, called xfa_example.in has been added as a template for future files to follow. Finally a run_xfa_tests.py has been added for executing all of the tests in testing/resources/xfa, which from what I can tell are not executed any other way. All of the existing PDFs in that directory are currently suppressed. BUG=pdfium:1008 Change-Id: Ie055b6640969ce8291b4c96b401ebf6887dfa0c0 Reviewed-on: https://pdfium-review.googlesource.com/27631 Commit-Queue: Ryan Harrison Reviewed-by: Lei Zhang --- testing/SUPPRESSIONS | 15 ++ testing/resources/xfa/xfa_example.in | 71 ++++++++ .../resources/xfa/xfa_example_expected.pdf.0.png | Bin 0 -> 4806 bytes testing/tools/fixup_pdf_template.py | 191 ++++++++++++++++++++- testing/tools/run_xfa_tests.py | 16 ++ 5 files changed, 288 insertions(+), 5 deletions(-) create mode 100644 testing/resources/xfa/xfa_example.in create mode 100644 testing/resources/xfa/xfa_example_expected.pdf.0.png create mode 100755 testing/tools/run_xfa_tests.py diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS index 1edc158161..317f370b31 100644 --- a/testing/SUPPRESSIONS +++ b/testing/SUPPRESSIONS @@ -321,3 +321,18 @@ bug_735912.in * * noxfa # bug_492.in * nov8 * +# +# XFA Tests +# +# TODO(rharrison): Create expectations for existing files. +barcode_test.pdf * * * +dynamic_list_box_allow_multiple_selection.pdf * * * +dynamic_password_field_background_fill.pdf * * * +dynamic_table_color_and_width.pdf * * * +email_recommended.pdf * * * +resolve_nodes.pdf * * * +standard_symbols.pdf * * * +static_list_box_caption.pdf * * * +static_password_field_rotate.pdf * * * +xfa_node_caption.pdf * * * + diff --git a/testing/resources/xfa/xfa_example.in b/testing/resources/xfa/xfa_example.in new file mode 100644 index 0000000000..d8be96f305 --- /dev/null +++ b/testing/resources/xfa/xfa_example.in @@ -0,0 +1,71 @@ +{{header}} + +%% Original object ID: 24 0 +{{object 1 0}} +<< + /AcroForm 2 0 R + /Extensions << + /ADBE << + /BaseVersion /1.7 + /ExtensionLevel 8 + >> + >> + /NeedsRendering true + /Type /Catalog +>> +endobj + +%% Original object ID: 32 0 +{{object 2 0}} +<< + /XFA [ + (preamble) + 3 0 R + (config) + 4 0 R + (template) + 5 0 R + (localeSet) + 6 0 R + (postamble) + 7 0 R + ] +>> +endobj + +{{xfapreamble 3 0}} +{{xfaconfig 4 0}} + +{{object 5 0}} +<< + {{streamlen}} +>> +stream + +endstream +endobj + +{{xfalocale 6 0}} + +{{xfapostamble 7 0}} + +{{xref}} +{{trailer}} +{{startxref}} +%%EOF \ No newline at end of file diff --git a/testing/resources/xfa/xfa_example_expected.pdf.0.png b/testing/resources/xfa/xfa_example_expected.pdf.0.png new file mode 100644 index 0000000000..9a682f7186 Binary files /dev/null and b/testing/resources/xfa/xfa_example_expected.pdf.0.png differ diff --git a/testing/tools/fixup_pdf_template.py b/testing/tools/fixup_pdf_template.py index 19f75e0263..fed0ed8e0a 100755 --- a/testing/tools/fixup_pdf_template.py +++ b/testing/tools/fixup_pdf_template.py @@ -8,12 +8,20 @@ There are several places in a PDF file where byte-offsets are required. This script replaces {{name}}-style variables in the input with calculated results - {{header}} - expands to the header comment required for PDF files. - {{xref}} - expands to a generated xref table, noting the offset. - {{trailer}} - expands to a standard trailer with "1 0 R" as the /Root. - {{startxref} - expands to a startxref directive followed by correct offset. + {{header}} - expands to the header comment required for PDF files. + {{xref}} - expands to a generated xref table, noting the offset. + {{trailer}} - expands to a standard trailer with "1 0 R" as the /Root. + {{startxref} - expands to a startxref directive followed by correct offset. {{object x y}} - expands to |x y obj| declaration, noting the offset. - {{streamlen}} - expands to |/Length n|. + {{streamlen}} - expands to |/Length n|. + {{xfapreamble x y}} - expands to an object |x y obj| containing a XML preamble + to be used in XFA docs. + {{xfaconfig x y}} - expands to an object |x y obj| containing a config XML + block to be used in XFA docs. + {{xfalocale x y}} - expands to an object |x y obj| containing a locale XML + block to be used in XFA docs. + {{xfapostamble x y}} - expands to an object |x y obj| containing a XML + posteamble to be used in XFA docs. """ import cStringIO @@ -51,6 +59,154 @@ class TemplateProcessor: STREAMLEN_TOKEN = '{{streamlen}}' STREAMLEN_REPLACEMENT = '/Length %d' + XFAPREAMBLE_PATTERN = r'\{\{xfapreamble\s+(\d+)\s+(\d+)\}\}' + XFAPREAMBLE_REPLACEMENT = '%d %d obj\n<<\n /Length %d\n>>\nstream\n%s\nendstream\nendobj\n' + XFAPREAMBLE_STREAM = '' + + XFAPOSTAMBLE_PATTERN = r'\{\{xfapostamble\s+(\d+)\s+(\d+)\}\}' + XFAPOSTAMBLE_REPLACEMENT = '%d %d obj\n<<\n /Length %d\n>>\nstream\n%s\nendstream\nendobj\n' + XFAPOSTAMBLE_STREAM = '' + + XFACONFIG_PATTERN = r'\{\{xfaconfig\s+(\d+)\s+(\d+)\}\}' + XFACONFIG_REPLACEMENT = '%d %d obj\n<<\n /Length %d\n>>\nstream\n%s\nendstream\nendobj\n' + XFACONFIG_STREAM = ''' + + pdf + + + + + + + 1.7 + 8 + client + XFA + 1 + + + * + + pdf + + + + + required + + preSubmit + +''' + + XFALOCALE_PATTERN = r'\{\{xfalocale\s+(\d+)\s+(\d+)\}\}' + XFALOCALE_REPLACEMENT = '%d %d obj\n<<\n /Length %d\n>>\nstream\n%s\nendstream\nendobj\n' + XFALOCALE_STREAM = ''' + + + + January + February + March + April + May + June + July + August + September + October + November + December + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + Sunday + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + + + Sun + Mon + Tue + Wed + Thu + Fri + Sat + + + AM + PM + + + BC + AD + + + + EEEE, MMMM D, YYYY + MMMM D, YYYY + MMM D, YYYY + M/D/YY + + + h:MM:SS A Z + h:MM:SS A Z + h:MM:SS A + h:MM A + + GyMdkHmsSEDFwWahKzZ + + z,zz9.zzz + $z,zz9.99|($z,zz9.99) + z,zz9% + + + . + , + % + - + 0 + + + $ + USD + . + + + + + + + + + + + + + + + + +''' + def __init__(self): self.streamlen_state = StreamLenState.START self.streamlens = [] @@ -109,10 +265,35 @@ class TemplateProcessor: if match: self.insert_xref_entry(int(match.group(1)), int(match.group(2))) line = re.sub(self.OBJECT_PATTERN, self.OBJECT_REPLACEMENT, line) + line = self.replace_xfa_tag(line, + self.XFAPREAMBLE_PATTERN, + self.XFAPREAMBLE_REPLACEMENT, + self.XFAPREAMBLE_STREAM) + line = self.replace_xfa_tag(line, + self.XFACONFIG_PATTERN, + self.XFACONFIG_REPLACEMENT, + self.XFACONFIG_STREAM) + line = self.replace_xfa_tag(line, + self.XFALOCALE_PATTERN, + self.XFALOCALE_REPLACEMENT, + self.XFALOCALE_STREAM) + line = self.replace_xfa_tag(line, + self.XFAPOSTAMBLE_PATTERN, + self.XFAPOSTAMBLE_REPLACEMENT, + self.XFAPOSTAMBLE_STREAM) self.offset += len(line) return line + def replace_xfa_tag(self, line, pattern, replacement, stream): + match = re.match(pattern, line) + if match: + x = int(match.group(1)) + y = int(match.group(2)) + self.insert_xref_entry(x, y) + line = replacement % (x, y, len(stream), stream) + return line + def expand_file(input_path, output_path): processor = TemplateProcessor() diff --git a/testing/tools/run_xfa_tests.py b/testing/tools/run_xfa_tests.py new file mode 100755 index 0000000000..6647cfd939 --- /dev/null +++ b/testing/tools/run_xfa_tests.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# Copyright 2018 The PDFium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import sys + +import test_runner + +def main(): + runner = test_runner.TestRunner('xfa') + runner.SetEnforceExpectedImages(True) + return runner.Run() + +if __name__ == '__main__': + sys.exit(main()) -- cgit v1.2.3