mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-25 09:38:06 +02:00
Add a parser to get font data from the default appearance (#12831)
* Add a parser to get font data from the default appearance - pdfium & poppler use a special parser too to get these info. * Update src/core/default_appearance.js Co-authored-by: Jonas Jenwald <jonas.jenwald@gmail.com> Co-authored-by: Jonas Jenwald <jonas.jenwald@gmail.com>
This commit is contained in:
parent
4142001fc2
commit
1039698697
7 changed files with 191 additions and 33 deletions
|
@ -35,6 +35,10 @@ import {
|
|||
} from "../shared/util.js";
|
||||
import { Catalog, FileSpec, ObjectLoader } from "./obj.js";
|
||||
import { collectActions, getInheritableProperty } from "./core_utils.js";
|
||||
import {
|
||||
createDefaultAppearance,
|
||||
parseDefaultAppearance,
|
||||
} from "./default_appearance.js";
|
||||
import { Dict, isDict, isName, isRef, isStream, Name } from "./primitives.js";
|
||||
import { ColorSpace } from "./colorspace.js";
|
||||
import { OperatorList } from "./operator_list.js";
|
||||
|
@ -993,6 +997,10 @@ class WidgetAnnotation extends Annotation {
|
|||
data.defaultAppearance = isString(defaultAppearance)
|
||||
? defaultAppearance
|
||||
: "";
|
||||
this._defaultAppearanceData = parseDefaultAppearance(
|
||||
data.defaultAppearance
|
||||
);
|
||||
|
||||
const fieldType = getInheritableProperty({ dict, key: "FT" });
|
||||
data.fieldType = isName(fieldType) ? fieldType.name : null;
|
||||
|
||||
|
@ -1288,12 +1296,14 @@ class WidgetAnnotation extends Annotation {
|
|||
// Doing so prevents exceptions and allows saving/printing
|
||||
// the file as expected.
|
||||
this.data.defaultAppearance = "/Helvetica 0 Tf 0 g";
|
||||
this._defaultAppearanceData = parseDefaultAppearance(
|
||||
this.data.defaultAppearance
|
||||
);
|
||||
}
|
||||
|
||||
const fontInfo = await this._getFontData(evaluator, task);
|
||||
const [font, fontName] = fontInfo;
|
||||
const fontSize = this._computeFontSize(...fontInfo, totalHeight);
|
||||
this._fontName = fontName;
|
||||
const font = await this._getFontData(evaluator, task);
|
||||
const fontSize = this._computeFontSize(font, totalHeight);
|
||||
this._fontName = this._defaultAppearanceData.fontName.name;
|
||||
|
||||
let descent = font.descent;
|
||||
if (isNaN(descent)) {
|
||||
|
@ -1364,27 +1374,30 @@ class WidgetAnnotation extends Annotation {
|
|||
async _getFontData(evaluator, task) {
|
||||
const operatorList = new OperatorList();
|
||||
const initialState = {
|
||||
fontSize: 0,
|
||||
font: null,
|
||||
fontName: null,
|
||||
clone() {
|
||||
return this;
|
||||
},
|
||||
};
|
||||
|
||||
await evaluator.getOperatorList({
|
||||
stream: new StringStream(this.data.defaultAppearance),
|
||||
task,
|
||||
resources: this._fieldResources.mergedResources,
|
||||
const { fontName, fontSize } = this._defaultAppearanceData;
|
||||
await evaluator.handleSetFont(
|
||||
this._fieldResources.mergedResources,
|
||||
[fontName, fontSize],
|
||||
/* fontRef = */ null,
|
||||
operatorList,
|
||||
task,
|
||||
initialState,
|
||||
});
|
||||
/* fallbackFontDict = */ null
|
||||
);
|
||||
|
||||
return [initialState.font, initialState.fontName, initialState.fontSize];
|
||||
return initialState.font;
|
||||
}
|
||||
|
||||
_computeFontSize(font, fontName, fontSize, height) {
|
||||
if (fontSize === null || fontSize === 0) {
|
||||
_computeFontSize(font, height) {
|
||||
let fontSize = this._defaultAppearanceData.fontSize;
|
||||
if (!fontSize) {
|
||||
const { fontColor, fontName } = this._defaultAppearanceData;
|
||||
let capHeight;
|
||||
if (font.capHeight) {
|
||||
capHeight = font.capHeight;
|
||||
|
@ -1403,15 +1416,11 @@ class WidgetAnnotation extends Annotation {
|
|||
// 1.5 * capHeight * fontSize seems to be a good value for lineHeight
|
||||
fontSize = Math.max(1, Math.floor(height / (1.5 * capHeight)));
|
||||
|
||||
let fontRegex = new RegExp(`/${fontName}\\s+[0-9.]+\\s+Tf`);
|
||||
if (this.data.defaultAppearance.search(fontRegex) === -1) {
|
||||
// The font size is missing
|
||||
fontRegex = new RegExp(`/${fontName}\\s+Tf`);
|
||||
}
|
||||
this.data.defaultAppearance = this.data.defaultAppearance.replace(
|
||||
fontRegex,
|
||||
`/${fontName} ${fontSize} Tf`
|
||||
);
|
||||
this.data.defaultAppearance = createDefaultAppearance({
|
||||
fontSize,
|
||||
fontName,
|
||||
fontColor,
|
||||
});
|
||||
}
|
||||
return fontSize;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue