mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-22 16:18:08 +02:00
XFA - Save filled data in the pdf when downloading the file (Bug 1716288)
- when binding (after parsing) we get a map between some template nodes and some data nodes; - so set user data in input handlers in using data node uids in the annotation storage; - to save the form, just put the value we have in the storage in the correct data nodes, serialize the xml as a string and then write the string at the end of the pdf using src/core/writer.js; - fix few bugs around data bindings: - the "Off" issue in Bug 1716980.
This commit is contained in:
parent
d7fdb72a3f
commit
429ffdcd2f
17 changed files with 71564 additions and 113 deletions
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
|
@ -67,6 +67,7 @@
|
|||
!issue8229.pdf
|
||||
!issue8276_reduced.pdf
|
||||
!issue8372.pdf
|
||||
!xfa_filled_imm1344e.pdf
|
||||
!issue8424.pdf
|
||||
!issue8480.pdf
|
||||
!bug1650302_reduced.pdf
|
||||
|
|
71171
test/pdfs/xfa_filled_imm1344e.pdf
Normal file
71171
test/pdfs/xfa_filled_imm1344e.pdf
Normal file
File diff suppressed because one or more lines are too long
|
@ -930,6 +930,14 @@
|
|||
"link": true,
|
||||
"type": "load"
|
||||
},
|
||||
{ "id": "xfa_filled_imm1344e",
|
||||
"file": "pdfs/xfa_filled_imm1344e.pdf",
|
||||
"md5": "0576d16692fcd8ef2366cb48bf296e81",
|
||||
"rounds": 1,
|
||||
"enableXfa": true,
|
||||
"lastPage": 2,
|
||||
"type": "eq"
|
||||
},
|
||||
{ "id": "xfa_bug1717681",
|
||||
"file": "pdfs/xfa_bug1717681.pdf",
|
||||
"md5": "435b1eae7e017b1a932fe204d1ba8be5",
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
"writer_spec.js",
|
||||
"xfa_formcalc_spec.js",
|
||||
"xfa_parser_spec.js",
|
||||
"xfa_serialize_data_spec.js",
|
||||
"xfa_tohtml_spec.js",
|
||||
"xml_spec.js"
|
||||
]
|
||||
|
|
|
@ -88,6 +88,7 @@ async function initializePDFJS(callback) {
|
|||
"pdfjs-test/unit/writer_spec.js",
|
||||
"pdfjs-test/unit/xfa_formcalc_spec.js",
|
||||
"pdfjs-test/unit/xfa_parser_spec.js",
|
||||
"pdfjs-test/unit/xfa_serialize_data_spec.js",
|
||||
"pdfjs-test/unit/xfa_tohtml_spec.js",
|
||||
"pdfjs-test/unit/xml_spec.js",
|
||||
].map(function (moduleName) {
|
||||
|
|
73
test/unit/xfa_serialize_data_spec.js
Normal file
73
test/unit/xfa_serialize_data_spec.js
Normal file
|
@ -0,0 +1,73 @@
|
|||
/* Copyright 2021 Mozilla Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { $uid } from "../../src/core/xfa/xfa_object.js";
|
||||
import { DataHandler } from "../../src/core/xfa/data.js";
|
||||
import { searchNode } from "../../src/core/xfa/som.js";
|
||||
import { XFAParser } from "../../src/core/xfa/parser.js";
|
||||
|
||||
describe("Data serializer", function () {
|
||||
it("should serialize data with an annotationStorage", function () {
|
||||
const xml = `
|
||||
<?xml version="1.0"?>
|
||||
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
|
||||
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
|
||||
<foo>bar</foo>
|
||||
<xfa:data>
|
||||
<Receipt>
|
||||
<Page>1</Page>
|
||||
<Detail PartNo="GS001">
|
||||
<Description>Giant Slingshot</Description>
|
||||
<Units>1</Units>
|
||||
<Unit_Price>250.00</Unit_Price>
|
||||
<Total_Price>250.00</Total_Price>
|
||||
</Detail>
|
||||
<Page>2</Page>
|
||||
<Detail PartNo="RRB-LB">
|
||||
<Description>Road Runner Bait, large bag</Description>
|
||||
<Units>5</Units>
|
||||
<Unit_Price>12.00</Unit_Price>
|
||||
<Total_Price>60.00</Total_Price>
|
||||
</Detail>
|
||||
<Sub_Total>310.00</Sub_Total>
|
||||
<Tax>24.80</Tax>
|
||||
<Total_Price>334.80</Total_Price>
|
||||
</Receipt>
|
||||
</xfa:data>
|
||||
<bar>foo</bar>
|
||||
</xfa:datasets>
|
||||
</xdp:xdp>
|
||||
`;
|
||||
const root = new XFAParser().parse(xml);
|
||||
const data = root.datasets.data;
|
||||
const dataHandler = new DataHandler(root, data);
|
||||
|
||||
const storage = new Map();
|
||||
for (const [path, value] of [
|
||||
["Receipt.Detail[0].Units", "12&3"],
|
||||
["Receipt.Detail[0].Unit_Price", "456>"],
|
||||
["Receipt.Detail[0].Total_Price", "789"],
|
||||
["Receipt.Detail[1].PartNo", "foo-bar😀"],
|
||||
["Receipt.Detail[1].Description", "hello world"],
|
||||
]) {
|
||||
storage.set(searchNode(root, data, path)[0][$uid], { value });
|
||||
}
|
||||
|
||||
const serialized = dataHandler.serialize(storage);
|
||||
const expected = `<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"><foo>bar</foo><bar>foo</bar><xfa:data><Receipt><Page>1</Page><Detail PartNo="GS001"><Description>Giant Slingshot</Description><Units>12&3</Units><Unit_Price>456></Unit_Price><Total_Price>789</Total_Price></Detail><Page>2</Page><Detail PartNo="foo-bar😀"><Description>hello world</Description><Units>5</Units><Unit_Price>12.00</Unit_Price><Total_Price>60.00</Total_Price></Detail><Sub_Total>310.00</Sub_Total><Tax>24.80</Tax><Total_Price>334.80</Total_Price></Receipt></xfa:data></xfa:datasets>`;
|
||||
|
||||
expect(serialized).toEqual(expected);
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue