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/tools/fixup_pdf_template.py | 191 +++++++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 5 deletions(-) (limited to 'testing/tools/fixup_pdf_template.py') 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() -- cgit v1.2.3