Attempt to improve the detection of (metric) page names, by fuzzy matching the dimensions
The following is an example of a PDF file (the specification to be exact) where the page size (compare the size displayed in Adobe Reader), and the page name, isn't correctly displayed without the patch: https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
This commit is contained in:
parent
d86b816c2b
commit
b004308f88
@ -287,19 +287,50 @@ class PDFDocumentProperties {
|
|||||||
}
|
}
|
||||||
const isPortrait = isPortraitOrientation(pageSizeInches);
|
const isPortrait = isPortraitOrientation(pageSizeInches);
|
||||||
|
|
||||||
const sizeInches = {
|
let sizeInches = {
|
||||||
width: Math.round(pageSizeInches.width * 100) / 100,
|
width: Math.round(pageSizeInches.width * 100) / 100,
|
||||||
height: Math.round(pageSizeInches.height * 100) / 100,
|
height: Math.round(pageSizeInches.height * 100) / 100,
|
||||||
};
|
};
|
||||||
// 1in == 25.4mm; no need to round to 2 decimals for millimeters.
|
// 1in == 25.4mm; no need to round to 2 decimals for millimeters.
|
||||||
const sizeMillimeters = {
|
let sizeMillimeters = {
|
||||||
width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
|
width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
|
||||||
height: Math.round(pageSizeInches.height * 25.4 * 10) / 10,
|
height: Math.round(pageSizeInches.height * 25.4 * 10) / 10,
|
||||||
};
|
};
|
||||||
|
|
||||||
let pageName = null;
|
let pageName = null;
|
||||||
const name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) ||
|
let name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) ||
|
||||||
getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);
|
getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);
|
||||||
|
|
||||||
|
if (!name && !(Number.isInteger(sizeMillimeters.width) &&
|
||||||
|
Number.isInteger(sizeMillimeters.height))) {
|
||||||
|
// Attempt to improve the page name detection by falling back to fuzzy
|
||||||
|
// matching of the metric dimensions, to account for e.g. rounding errors
|
||||||
|
// and/or PDF files that define the page sizes in an imprecise manner.
|
||||||
|
const exactMillimeters = {
|
||||||
|
width: pageSizeInches.width * 25.4,
|
||||||
|
height: pageSizeInches.height * 25.4,
|
||||||
|
};
|
||||||
|
const intMillimeters = {
|
||||||
|
width: Math.round(sizeMillimeters.width),
|
||||||
|
height: Math.round(sizeMillimeters.height),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Try to avoid false positives, by only considering "small" differences.
|
||||||
|
if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 &&
|
||||||
|
Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {
|
||||||
|
|
||||||
|
name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
|
||||||
|
if (name) {
|
||||||
|
// Update *both* sizes, computed above, to ensure that the displayed
|
||||||
|
// dimensions always correspond to the detected page name.
|
||||||
|
sizeInches = {
|
||||||
|
width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
|
||||||
|
height: Math.round(intMillimeters.height / 25.4 * 100) / 100,
|
||||||
|
};
|
||||||
|
sizeMillimeters = intMillimeters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (name) {
|
if (name) {
|
||||||
pageName = this.l10n.get('document_properties_page_size_name_' +
|
pageName = this.l10n.get('document_properties_page_size_name_' +
|
||||||
name.toLowerCase(), null, name);
|
name.toLowerCase(), null, name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user