mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-28 23:28:16 +02:00
XFA - Fix text positions (bug 1718741)
- font line height is taken into account by acrobat when it isn't with masterpdfeditor: I extracted a font from a pdf, modified some ascent/descent properties thanks to ttx and the reinjected the font in the pdf: only Acrobat is taken it into account. So in this patch, line heights for some substituted fonts are added. - it seems that Acrobat is using a line height of 1.2 when the line height in the font is not enough (it's the only way I found to fix correctly bug 1718741). - don't use flex in wrapper container (which was causing an horizontal overflow in the above bug). - consequently, the above fixes introduced a lot of small regressions, so in order to see real improvements on reftests, I fixed the regressions in this patch: - replace margin by padding in some case where padding is a part of a container dimensions; - remove some flex display: some containers are wrongly sized when rendered; - set letter-spacing to 0.01px: it helps to be sure that text is not broken because of not enough width in Firefox.
This commit is contained in:
parent
0afc785c7d
commit
58e1f51688
15 changed files with 220 additions and 103 deletions
|
@ -396,6 +396,11 @@ function toStyle(node, ...names) {
|
|||
if (value === null) {
|
||||
continue;
|
||||
}
|
||||
if (converters.hasOwnProperty(name)) {
|
||||
converters[name](node, style);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (value instanceof XFAObject) {
|
||||
const newStyle = value[$toStyle]();
|
||||
if (newStyle) {
|
||||
|
@ -403,11 +408,6 @@ function toStyle(node, ...names) {
|
|||
} else {
|
||||
warn(`(DEBUG) - XFA - style for ${name} not implemented yet`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (converters.hasOwnProperty(name)) {
|
||||
converters[name](node, style);
|
||||
}
|
||||
}
|
||||
return style;
|
||||
|
@ -560,6 +560,44 @@ function isPrintOnly(node) {
|
|||
);
|
||||
}
|
||||
|
||||
function setPara(node, nodeStyle, value) {
|
||||
if (value.attributes.class && value.attributes.class.includes("xfaRich")) {
|
||||
if (nodeStyle) {
|
||||
if (node.h === "") {
|
||||
nodeStyle.height = "auto";
|
||||
}
|
||||
if (node.w === "") {
|
||||
nodeStyle.width = "auto";
|
||||
}
|
||||
}
|
||||
if (node.para) {
|
||||
// By definition exData are external data so para
|
||||
// has no effect on it.
|
||||
const valueStyle = value.attributes.style;
|
||||
valueStyle.display = "flex";
|
||||
valueStyle.flexDirection = "column";
|
||||
switch (node.para.vAlign) {
|
||||
case "top":
|
||||
valueStyle.justifyContent = "start";
|
||||
break;
|
||||
case "bottom":
|
||||
valueStyle.justifyContent = "end";
|
||||
break;
|
||||
case "middle":
|
||||
valueStyle.justifyContent = "center";
|
||||
break;
|
||||
}
|
||||
|
||||
const paraStyle = node.para[$toStyle]();
|
||||
for (const [key, val] of Object.entries(paraStyle)) {
|
||||
if (!(key in valueStyle)) {
|
||||
valueStyle[key] = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setFontFamily(xfaFont, fontFinder, style) {
|
||||
const name = stripQuotes(xfaFont.typeface);
|
||||
const typeface = fontFinder.find(name);
|
||||
|
@ -574,9 +612,12 @@ function setFontFamily(xfaFont, fontFinder, style) {
|
|||
// Already something so don't overwrite.
|
||||
return;
|
||||
}
|
||||
|
||||
const pdfFont = selectFont(xfaFont, typeface);
|
||||
if (pdfFont && pdfFont.lineHeight > 0) {
|
||||
style.lineHeight = pdfFont.lineHeight;
|
||||
style.lineHeight = Math.max(1.2, pdfFont.lineHeight);
|
||||
} else {
|
||||
style.lineHeight = 1.2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -593,5 +634,6 @@ export {
|
|||
setAccess,
|
||||
setFontFamily,
|
||||
setMinMaxDimensions,
|
||||
setPara,
|
||||
toStyle,
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue