summaryrefslogtreecommitdiff
path: root/testing/tools/fixup_pdf_template.py
diff options
context:
space:
mode:
authorRyan Harrison <rharrison@chromium.org>2018-02-23 22:10:06 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-02-23 22:10:06 +0000
commit26820b47434313b187d664ef702f48b1059bacb5 (patch)
treefb46186c97fd4fbd5a418a4cdc3541fdc6562ee8 /testing/tools/fixup_pdf_template.py
parent3760afa05acd4955120a47b82ecf3d543541b791 (diff)
downloadpdfium-26820b47434313b187d664ef702f48b1059bacb5.tar.xz
Setup testing XFA using .in fileschromium/3355chromium/3354
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 <rharrison@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'testing/tools/fixup_pdf_template.py')
-rwxr-xr-xtesting/tools/fixup_pdf_template.py191
1 files changed, 186 insertions, 5 deletions
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 = '<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/" timeStamp="2018-02-23T21:37:11Z" uuid="21482798-7bf0-40a4-bc5d-3cefdccf32b5">'
+
+ 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 = '</xdp:xdp>'
+
+ 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 = '''<config xmlns="http://www.xfa.org/schema/xci/3.0/">
+ <agent name="designer">
+ <destination>pdf</destination>
+ <pdf>
+ <fontInfo/>
+ </pdf>
+ </agent>
+ <present>
+ <pdf>
+ <version>1.7</version>
+ <adobeExtensionLevel>8</adobeExtensionLevel>
+ <renderPolicy>client</renderPolicy>
+ <scriptModel>XFA</scriptModel>
+ <interactive>1</interactive>
+ </pdf>
+ <xdp>
+ <packets>*</packets>
+ </xdp>
+ <destination>pdf</destination>
+ <script>
+ <runScripts>server</runScripts>
+ </script>
+ </present>
+ <acrobat>
+ <acrobat7>
+ <dynamicRender>required</dynamicRender>
+ </acrobat7>
+ <validate>preSubmit</validate>
+ </acrobat>
+</config>'''
+
+ 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 = '''<localeSet xmlns="http://www.xfa.org/schema/xfa-locale-set/2.7/">
+ <locale name="en_US" desc="English (United States)">
+ <calendarSymbols name="gregorian">
+ <monthNames>
+ <month>January</month>
+ <month>February</month>
+ <month>March</month>
+ <month>April</month>
+ <month>May</month>
+ <month>June</month>
+ <month>July</month>
+ <month>August</month>
+ <month>September</month>
+ <month>October</month>
+ <month>November</month>
+ <month>December</month>
+ </monthNames>
+ <monthNames abbr="1">
+ <month>Jan</month>
+ <month>Feb</month>
+ <month>Mar</month>
+ <month>Apr</month>
+ <month>May</month>
+ <month>Jun</month>
+ <month>Jul</month>
+ <month>Aug</month>
+ <month>Sep</month>
+ <month>Oct</month>
+ <month>Nov</month>
+ <month>Dec</month>
+ </monthNames>
+ <dayNames>
+ <day>Sunday</day>
+ <day>Monday</day>
+ <day>Tuesday</day>
+ <day>Wednesday</day>
+ <day>Thursday</day>
+ <day>Friday</day>
+ <day>Saturday</day>
+ </dayNames>
+ <dayNames abbr="1">
+ <day>Sun</day>
+ <day>Mon</day>
+ <day>Tue</day>
+ <day>Wed</day>
+ <day>Thu</day>
+ <day>Fri</day>
+ <day>Sat</day>
+ </dayNames>
+ <meridiemNames>
+ <meridiem>AM</meridiem>
+ <meridiem>PM</meridiem>
+ </meridiemNames>
+ <eraNames>
+ <era>BC</era>
+ <era>AD</era>
+ </eraNames>
+ </calendarSymbols>
+ <datePatterns>
+ <datePattern name="full">EEEE, MMMM D, YYYY</datePattern>
+ <datePattern name="long">MMMM D, YYYY</datePattern>
+ <datePattern name="med">MMM D, YYYY</datePattern>
+ <datePattern name="short">M/D/YY</datePattern>
+ </datePatterns>
+ <timePatterns>
+ <timePattern name="full">h:MM:SS A Z</timePattern>
+ <timePattern name="long">h:MM:SS A Z</timePattern>
+ <timePattern name="med">h:MM:SS A</timePattern>
+ <timePattern name="short">h:MM A</timePattern>
+ </timePatterns>
+ <dateTimeSymbols>GyMdkHmsSEDFwWahKzZ</dateTimeSymbols>
+ <numberPatterns>
+ <numberPattern name="numeric">z,zz9.zzz</numberPattern>
+ <numberPattern name="currency">$z,zz9.99|($z,zz9.99)</numberPattern>
+ <numberPattern name="percent">z,zz9%</numberPattern>
+ </numberPatterns>
+ <numberSymbols>
+ <numberSymbol name="decimal">.</numberSymbol>
+ <numberSymbol name="grouping">,</numberSymbol>
+ <numberSymbol name="percent">%</numberSymbol>
+ <numberSymbol name="minus">-</numberSymbol>
+ <numberSymbol name="zero">0</numberSymbol>
+ </numberSymbols>
+ <currencySymbols>
+ <currencySymbol name="symbol">$</currencySymbol>
+ <currencySymbol name="isoname">USD</currencySymbol>
+ <currencySymbol name="decimal">.</currencySymbol>
+ </currencySymbols>
+ <typefaces>
+ <typeface name="Myriad Pro"/>
+ <typeface name="Minion Pro"/>
+ <typeface name="Courier Std"/>
+ <typeface name="Adobe Pi Std"/>
+ <typeface name="Adobe Hebrew"/>
+ <typeface name="Adobe Arabic"/>
+ <typeface name="Adobe Thai"/>
+ <typeface name="Kozuka Gothic Pro-VI M"/>
+ <typeface name="Kozuka Mincho Pro-VI R"/>
+ <typeface name="Adobe Ming Std L"/>
+ <typeface name="Adobe Song Std L"/>
+ <typeface name="Adobe Myungjo Std M"/>
+ </typefaces>
+ </locale>
+</localeSet>'''
+
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()