Merge pull request #14899 from Snuffleupagus/issue-14896

[api-minor] Include line endings in Line/Polyline Annotation-data (issue 14896)
This commit is contained in:
Jonas Jenwald 2022-05-12 11:29:17 +02:00 committed by GitHub
commit ed70ec8726
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 72 additions and 5 deletions

View File

@ -613,6 +613,39 @@ class Annotation {
this.color = getRgbColor(color);
}
/**
* Set the line endings; should only be used with specific annotation types.
* @param {Array} lineEndings - The line endings array.
*/
setLineEndings(lineEndings) {
this.lineEndings = ["None", "None"]; // The default values.
if (Array.isArray(lineEndings) && lineEndings.length === 2) {
for (let i = 0; i < 2; i++) {
const obj = lineEndings[i];
if (obj instanceof Name) {
switch (obj.name) {
case "None":
continue;
case "Square":
case "Circle":
case "Diamond":
case "OpenArrow":
case "ClosedArrow":
case "Butt":
case "ROpenArrow":
case "RClosedArrow":
case "Slash":
this.lineEndings[i] = obj.name;
continue;
}
}
warn(`Ignoring invalid lineEnding: ${obj}`);
}
}
}
/**
* Set the color for background and border if any.
* The default values are transparent.
@ -2803,22 +2836,26 @@ class LineAnnotation extends MarkupAnnotation {
constructor(parameters) {
super(parameters);
const { dict } = parameters;
this.data.annotationType = AnnotationType.LINE;
const lineCoordinates = parameters.dict.getArray("L");
const lineCoordinates = dict.getArray("L");
this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);
this.setLineEndings(dict.getArray("LE"));
this.data.lineEndings = this.lineEndings;
if (!this.appearance) {
// The default stroke color is black.
const strokeColor = this.color
? Array.from(this.color).map(c => c / 255)
: [0, 0, 0];
const strokeAlpha = parameters.dict.get("CA");
const strokeAlpha = dict.get("CA");
// The default fill color is transparent. Setting the fill colour is
// necessary if/when we want to add support for non-default line endings.
let fillColor = null,
interiorColor = parameters.dict.getArray("IC");
interiorColor = dict.getArray("IC");
if (interiorColor) {
interiorColor = getRgbColor(interiorColor, null);
fillColor = interiorColor
@ -2996,13 +3033,20 @@ class PolylineAnnotation extends MarkupAnnotation {
constructor(parameters) {
super(parameters);
const { dict } = parameters;
this.data.annotationType = AnnotationType.POLYLINE;
this.data.vertices = [];
if (!(this instanceof PolygonAnnotation)) {
// Only meaningful for polyline annotations.
this.setLineEndings(dict.getArray("LE"));
this.data.lineEndings = this.lineEndings;
}
// The vertices array is an array of numbers representing the alternating
// horizontal and vertical coordinates, respectively, of each vertex.
// Convert this to an array of objects with x and y coordinates.
const rawVertices = parameters.dict.getArray("Vertices");
const rawVertices = dict.getArray("Vertices");
if (!Array.isArray(rawVertices)) {
return;
}
@ -3018,7 +3062,7 @@ class PolylineAnnotation extends MarkupAnnotation {
const strokeColor = this.color
? Array.from(this.color).map(c => c / 255)
: [0, 0, 0];
const strokeAlpha = parameters.dict.get("CA");
const strokeAlpha = dict.get("CA");
const borderWidth = this.borderStyle.width || 1,
borderAdjust = 2 * borderWidth;

View File

@ -3618,6 +3618,7 @@ describe("annotation", function () {
lineDict.set("Type", Name.get("Annot"));
lineDict.set("Subtype", Name.get("Line"));
lineDict.set("L", [1, 2, 3, 4]);
lineDict.set("LE", ["Square", "Circle"]);
const lineRef = Ref.get(122, 0);
const xref = new XRefMock([{ ref: lineRef, data: lineDict }]);
@ -3630,6 +3631,28 @@ describe("annotation", function () {
);
expect(data.annotationType).toEqual(AnnotationType.LINE);
expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
expect(data.lineEndings).toEqual(["None", "None"]);
});
it("should set the line endings", async function () {
const lineDict = new Dict();
lineDict.set("Type", Name.get("Annot"));
lineDict.set("Subtype", Name.get("Line"));
lineDict.set("L", [1, 2, 3, 4]);
lineDict.set("LE", [Name.get("Square"), Name.get("Circle")]);
const lineRef = Ref.get(122, 0);
const xref = new XRefMock([{ ref: lineRef, data: lineDict }]);
const { data } = await AnnotationFactory.create(
xref,
lineRef,
pdfManagerMock,
idFactoryMock
);
expect(data.annotationType).toEqual(AnnotationType.LINE);
expect(data.lineCoordinates).toEqual([1, 2, 3, 4]);
expect(data.lineEndings).toEqual(["Square", "Circle"]);
});
});