Merge pull request #9920 from Snuffleupagus/getMetadata-linearization

[api-minor] Add an `IsLinearized` property to the `PDFDocument.documentInfo` getter, to allow accessing the linearization status through the API (via `PDFDocumentProxy.getMetadata`)
This commit is contained in:
Tim van der Meij 2018-07-29 20:23:22 +02:00 committed by GitHub
commit 3521424576
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 69 additions and 38 deletions

View File

@ -120,6 +120,11 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
# the document; usually called "Fast Web View" in English locales of Adobe software.
document_properties_linearized=Fast Web View:
document_properties_linearized_yes=Yes
document_properties_linearized_no=No
document_properties_close=Close
print_progress_message=Preparing document for printing…

View File

@ -120,6 +120,11 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
# the document; usually called "Fast Web View" in English locales of Adobe software.
document_properties_linearized=Snelle webweergave:
document_properties_linearized_yes=Ja
document_properties_linearized_no=Nee
document_properties_close=Sluiten
print_progress_message=Document voorbereiden voor afdrukken…

View File

@ -120,6 +120,11 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
# the document; usually called "Fast Web View" in English locales of Adobe software.
document_properties_linearized=Snabb webbvisning:
document_properties_linearized_yes=Ja
document_properties_linearized_no=Nej
document_properties_close=Stäng
print_progress_message=Förbereder sidor för utskrift…

View File

@ -379,22 +379,16 @@ var PDFDocument = (function PDFDocumentClosure() {
return true; /* found */
}
var DocumentInfoValidators = {
get entries() {
// Lazily build this since all the validation functions below are not
// defined until after this file loads.
return shadow(this, 'entries', {
Title: isString,
Author: isString,
Subject: isString,
Keywords: isString,
Creator: isString,
Producer: isString,
CreationDate: isString,
ModDate: isString,
Trapped: isName,
});
},
const DocumentInfoValidators = {
Title: isString,
Author: isString,
Subject: isString,
Keywords: isString,
Creator: isString,
Producer: isString,
CreationDate: isString,
ModDate: isString,
Trapped: isName,
};
PDFDocument.prototype = {
@ -426,16 +420,14 @@ var PDFDocument = (function PDFDocumentClosure() {
},
get linearization() {
var linearization = null;
if (this.stream.length) {
try {
linearization = Linearization.create(this.stream);
} catch (err) {
if (err instanceof MissingDataException) {
throw err;
}
info(err);
let linearization = null;
try {
linearization = Linearization.create(this.stream);
} catch (err) {
if (err instanceof MissingDataException) {
throw err;
}
info(err);
}
// shadow the prototype getter with a data property
return shadow(this, 'linearization', linearization);
@ -531,12 +523,13 @@ var PDFDocument = (function PDFDocumentClosure() {
return shadow(this, 'numPages', num);
},
get documentInfo() {
var docInfo = {
const docInfo = {
PDFFormatVersion: this.pdfFormatVersion,
IsLinearized: !!this.linearization,
IsAcroFormPresent: !!this.acroForm,
IsXFAPresent: !!this.xfa,
};
var infoDict;
let infoDict;
try {
infoDict = this.xref.trailer.get('Info');
} catch (err) {
@ -545,14 +538,13 @@ var PDFDocument = (function PDFDocumentClosure() {
}
info('The document information dictionary is invalid.');
}
if (infoDict) {
var validEntries = DocumentInfoValidators.entries;
if (isDict(infoDict)) {
// Only fill the document info with valid entries from the spec.
for (var key in validEntries) {
for (let key in DocumentInfoValidators) {
if (infoDict.has(key)) {
var value = infoDict.get(key);
const value = infoDict.get(key);
// Make sure the value conforms to the spec.
if (validEntries[key](value)) {
if (DocumentInfoValidators[key](value)) {
docInfo[key] = (typeof value !== 'string' ?
value : stringToPDFString(value));
} else {

View File

@ -28,6 +28,7 @@ import {
} from '../../src/display/api';
import { GlobalWorkerOptions } from '../../src/display/worker_options';
import isNodeJS from '../../src/shared/is_node';
import { Metadata } from '../../src/display/metadata';
describe('api', function() {
let basicApiFileName = 'basicapi.pdf';
@ -802,11 +803,18 @@ describe('api', function() {
});
it('gets metadata', function(done) {
var promise = doc.getMetadata();
promise.then(function(metadata) {
expect(metadata.info['Title']).toEqual('Basic API Test');
expect(metadata.info['PDFFormatVersion']).toEqual('1.7');
expect(metadata.metadata.get('dc:title')).toEqual('Basic API Test');
expect(metadata.contentDispositionFilename).toEqual(null);
promise.then(function({ info, metadata, contentDispositionFilename, }) {
expect(info['Title']).toEqual('Basic API Test');
// The following are PDF.js specific, non-standard, properties.
expect(info['PDFFormatVersion']).toEqual('1.7');
expect(info['IsLinearized']).toEqual(false);
expect(info['IsAcroFormPresent']).toEqual(false);
expect(info['IsXFAPresent']).toEqual(false);
expect(metadata instanceof Metadata).toEqual(true);
expect(metadata.get('dc:title')).toEqual('Basic API Test');
expect(contentDispositionFilename).toEqual(null);
done();
}).catch(function (reason) {
done.fail(reason);

View File

@ -128,9 +128,10 @@ class PDFDocumentProperties {
return this._parsePageSize(getPageSizeInches(pdfPage),
pagesRotation);
}),
this._parseLinearization(info.IsLinearized),
]);
}).then(([info, metadata, fileName, fileSize, creationDate, modDate,
pageSize]) => {
pageSize, isLinearized]) => {
freezeFieldData({
'fileName': fileName,
'fileSize': fileSize,
@ -145,6 +146,7 @@ class PDFDocumentProperties {
'version': info.PDFFormatVersion,
'pageCount': this.pdfDocument.numPages,
'pageSize': pageSize,
'linearized': isLinearized,
'_currentPageNumber': currentPageNumber,
'_pagesRotation': pagesRotation,
});
@ -406,6 +408,15 @@ class PDFDocumentProperties {
{ date: dateString, time: timeString, },
'{{date}}, {{time}}');
}
/**
* @private
*/
_parseLinearization(isLinearized) {
return this.l10n.get('document_properties_linearized_' +
(isLinearized ? 'yes' : 'no'), null,
(isLinearized ? 'Yes' : 'No'));
}
}
export {

View File

@ -378,6 +378,10 @@ See https://github.com/adobe-type-tools/cmap-resources
<div class="row">
<span data-l10n-id="document_properties_page_size">Page Size:</span> <p id="pageSizeField">-</p>
</div>
<div class="separator"></div>
<div class="row">
<span data-l10n-id="document_properties_linearized">Fast Web View:</span> <p id="linearizedField">-</p>
</div>
<div class="buttonRow">
<button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
</div>

View File

@ -166,6 +166,7 @@ function getViewerConfiguration() {
'version': document.getElementById('versionField'),
'pageCount': document.getElementById('pageCountField'),
'pageSize': document.getElementById('pageSizeField'),
'linearized': document.getElementById('linearizedField'),
},
},
errorWrapper: {