Ensure that PDFPageProxy.pageSizeInches
handles non-default /Rotate entries correctly
Without this patch, the pageSize will be incorrectly reported for some PDF files. --- Move pageSizeInches to ui_utils
This commit is contained in:
parent
0d391daccc
commit
d547936827
@ -874,19 +874,6 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
|
|||||||
return this.pageInfo.view;
|
return this.pageInfo.view;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* The size of the current page, converted from PDF units to inches.
|
|
||||||
* @return {Object} An Object containing the properties: {number} `width`
|
|
||||||
* and {number} `height`, given in inches.
|
|
||||||
*/
|
|
||||||
get pageSizeInches() {
|
|
||||||
const [x1, y1, x2, y2] = this.view, userUnit = this.userUnit;
|
|
||||||
return {
|
|
||||||
width: (x2 - x1) / 72 * userUnit,
|
|
||||||
height: (y2 - y1) / 72 * userUnit,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {number} scale The desired scale of the viewport.
|
* @param {number} scale The desired scale of the viewport.
|
||||||
* @param {number} rotate Degrees to rotate the viewport. If omitted this
|
* @param {number} rotate Degrees to rotate the viewport. If omitted this
|
||||||
|
@ -964,14 +964,6 @@ describe('api', function() {
|
|||||||
it('gets view', function () {
|
it('gets view', function () {
|
||||||
expect(page.view).toEqual([0, 0, 595.28, 841.89]);
|
expect(page.view).toEqual([0, 0, 595.28, 841.89]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('gets page size (in inches)', function() {
|
|
||||||
const { width, height, } = page.pageSizeInches;
|
|
||||||
|
|
||||||
expect(+width.toPrecision(3)).toEqual(8.27);
|
|
||||||
expect(+height.toPrecision(4)).toEqual(11.69);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('gets viewport', function () {
|
it('gets viewport', function () {
|
||||||
var viewport = page.getViewport(1.5, 90);
|
var viewport = page.getViewport(1.5, 90);
|
||||||
expect(viewport.viewBox).toEqual(page.view);
|
expect(viewport.viewBox).toEqual(page.view);
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import {
|
||||||
binarySearchFirstItem, EventBus, getPDFFileNameFromURL, isValidRotation,
|
binarySearchFirstItem, EventBus, getPageSizeInches, getPDFFileNameFromURL,
|
||||||
waitOnEventOrTimeout, WaitOnType
|
isValidRotation, waitOnEventOrTimeout, WaitOnType
|
||||||
} from '../../web/ui_utils';
|
} from '../../web/ui_utils';
|
||||||
import { createObjectURL } from '../../src/shared/util';
|
import { createObjectURL } from '../../src/shared/util';
|
||||||
import isNodeJS from '../../src/shared/is_node';
|
import isNodeJS from '../../src/shared/is_node';
|
||||||
@ -398,4 +398,32 @@ describe('ui_utils', function() {
|
|||||||
}, done.fail);
|
}, done.fail);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getPageSizeInches', function () {
|
||||||
|
it('gets page size (in inches)', function() {
|
||||||
|
const page = {
|
||||||
|
view: [0, 0, 595.28, 841.89],
|
||||||
|
userUnit: 1.0,
|
||||||
|
rotate: 0,
|
||||||
|
};
|
||||||
|
const { width, height, } = getPageSizeInches(page);
|
||||||
|
|
||||||
|
expect(+width.toPrecision(3)).toEqual(8.27);
|
||||||
|
expect(+height.toPrecision(4)).toEqual(11.69);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('gets page size (in inches), for non-default /Rotate entry', function() {
|
||||||
|
const pdfPage1 = { view: [0, 0, 612, 792], userUnit: 1, rotate: 0, };
|
||||||
|
const { width: width1, height: height1, } = getPageSizeInches(pdfPage1);
|
||||||
|
|
||||||
|
expect(width1).toEqual(8.5);
|
||||||
|
expect(height1).toEqual(11);
|
||||||
|
|
||||||
|
const pdfPage2 = { view: [0, 0, 612, 792], userUnit: 1, rotate: 90, };
|
||||||
|
const { width: width2, height: height2, } = getPageSizeInches(pdfPage2);
|
||||||
|
|
||||||
|
expect(width2).toEqual(11);
|
||||||
|
expect(height2).toEqual(8.5);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { cloneObj, getPDFFileNameFromURL, NullL10n } from './ui_utils';
|
import {
|
||||||
|
cloneObj, getPageSizeInches, getPDFFileNameFromURL, NullL10n
|
||||||
|
} from './ui_utils';
|
||||||
import { createPromiseCapability } from 'pdfjs-lib';
|
import { createPromiseCapability } from 'pdfjs-lib';
|
||||||
|
|
||||||
const DEFAULT_FIELD_CONTENT = '-';
|
const DEFAULT_FIELD_CONTENT = '-';
|
||||||
@ -92,7 +94,7 @@ class PDFDocumentProperties {
|
|||||||
this._parseDate(info.CreationDate),
|
this._parseDate(info.CreationDate),
|
||||||
this._parseDate(info.ModDate),
|
this._parseDate(info.ModDate),
|
||||||
this.pdfDocument.getPage(currentPageNumber).then((pdfPage) => {
|
this.pdfDocument.getPage(currentPageNumber).then((pdfPage) => {
|
||||||
return this._parsePageSize(pdfPage.pageSizeInches);
|
return this._parsePageSize(getPageSizeInches(pdfPage));
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
}).then(([info, metadata, fileName, fileSize, creationDate, modDate,
|
}).then(([info, metadata, fileName, fileSize, creationDate, modDate,
|
||||||
|
@ -269,6 +269,27 @@ function roundToDivide(x, div) {
|
|||||||
return r === 0 ? x : Math.round(x - r + div);
|
return r === 0 ? x : Math.round(x - r + div);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the size of the specified page, converted from PDF units to inches.
|
||||||
|
* @param {Object} An Object containing the properties: {Array} `view`,
|
||||||
|
* {number} `userUnit`, and {number} `rotate`.
|
||||||
|
* @return {Object} An Object containing the properties: {number} `width`
|
||||||
|
* and {number} `height`, given in inches.
|
||||||
|
*/
|
||||||
|
function getPageSizeInches({ view, userUnit, rotate, }) {
|
||||||
|
const [x1, y1, x2, y2] = view;
|
||||||
|
// We need to take the page rotation into account as well.
|
||||||
|
const changeOrientation = rotate % 180 !== 0;
|
||||||
|
|
||||||
|
const width = (x2 - x1) / 72 * userUnit;
|
||||||
|
const height = (y2 - y1) / 72 * userUnit;
|
||||||
|
|
||||||
|
return {
|
||||||
|
width: (changeOrientation ? height : width),
|
||||||
|
height: (changeOrientation ? width : height),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic helper to find out what elements are visible within a scroll pane.
|
* Generic helper to find out what elements are visible within a scroll pane.
|
||||||
*/
|
*/
|
||||||
@ -645,6 +666,7 @@ export {
|
|||||||
parseQueryString,
|
parseQueryString,
|
||||||
getVisibleElements,
|
getVisibleElements,
|
||||||
roundToDivide,
|
roundToDivide,
|
||||||
|
getPageSizeInches,
|
||||||
approximateFraction,
|
approximateFraction,
|
||||||
getOutputScale,
|
getOutputScale,
|
||||||
scrollIntoView,
|
scrollIntoView,
|
||||||
|
Loading…
Reference in New Issue
Block a user