@pixldocs/canvas-renderer 0.5.154 → 0.5.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-CoH2Xntr.js → index-BQA8_wgq.js} +17 -8
- package/dist/index-BQA8_wgq.js.map +1 -0
- package/dist/{index-Cl1_1tTg.cjs → index-BwHwQrnS.cjs} +17 -8
- package/dist/index-BwHwQrnS.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/{vectorPdfExport-BHADcvGH.cjs → vectorPdfExport-C5NmVmxB.cjs} +51 -4
- package/dist/vectorPdfExport-C5NmVmxB.cjs.map +1 -0
- package/dist/{vectorPdfExport-Db9b2C3K.js → vectorPdfExport-vCax992V.js} +51 -4
- package/dist/vectorPdfExport-vCax992V.js.map +1 -0
- package/package.json +1 -1
- package/dist/index-Cl1_1tTg.cjs.map +0 -1
- package/dist/index-CoH2Xntr.js.map +0 -1
- package/dist/vectorPdfExport-BHADcvGH.cjs.map +0 -1
- package/dist/vectorPdfExport-Db9b2C3K.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsPDF, ShadingPattern } from "jspdf";
|
|
2
2
|
import { svg2pdf } from "svg2pdf.js";
|
|
3
3
|
import * as fabric from "fabric";
|
|
4
|
-
import { g as getCanvasForPage, c as captureFabricCanvasSvgForPdf, f as findNodeById, a as getAbsoluteBounds, p as parseTextMarkdown, r as renderSmartElementToSvg, n as normalizeShapeType, h as hasEdgeFade, b as getProxiedImageUrl, d as bakeEdgeFade, i as isElement, e as isGroup, j as buildRoundedTrianglePath, A as API_URL, k as getImageProxyFetchOptions, l as getRoundedRectRadii, T as TRIANGLE_STROKE_MITER_LIMIT, m as getTrianglePoints } from "./index-
|
|
4
|
+
import { g as getCanvasForPage, c as captureFabricCanvasSvgForPdf, f as findNodeById, a as getAbsoluteBounds, p as parseTextMarkdown, r as renderSmartElementToSvg, n as normalizeShapeType, h as hasEdgeFade, b as getProxiedImageUrl, d as bakeEdgeFade, i as isElement, e as isGroup, j as buildRoundedTrianglePath, A as API_URL, k as getImageProxyFetchOptions, l as getRoundedRectRadii, T as TRIANGLE_STROKE_MITER_LIMIT, m as getTrianglePoints } from "./index-BQA8_wgq.js";
|
|
5
5
|
import { resetPdfFontRegistry, FONT_FALLBACK_SYMBOLS, FONT_FALLBACK_MATH, FONT_FALLBACK_DEVANAGARI, embedFontWithGoogleFallback, getEmbeddedVariantsList, isFontAvailable, isFamilyEmbedded, resolveBestRegisteredVariant, getEmbeddedJsPDFFontName, resolveFontWeight, doesVariantSupportChar } from "./pdfFonts-b3_bv7F0.js";
|
|
6
6
|
async function embedFontsForSvg(pdf, svgStr) {
|
|
7
7
|
var _a;
|
|
@@ -1308,6 +1308,51 @@ async function bakeTextAnchorPositionsFromLiveSvg(svg) {
|
|
|
1308
1308
|
}
|
|
1309
1309
|
}
|
|
1310
1310
|
}
|
|
1311
|
+
function promoteFabricLineAnchorsToSelectableText(svg) {
|
|
1312
|
+
const doc = svg.ownerDocument;
|
|
1313
|
+
if (!doc) return;
|
|
1314
|
+
const lineTspans = Array.from(svg.querySelectorAll('tspan[data-pd-line-anchor="1"]'));
|
|
1315
|
+
if (lineTspans.length === 0) return;
|
|
1316
|
+
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
1317
|
+
const touchedParents = /* @__PURE__ */ new Set();
|
|
1318
|
+
let promoted = 0;
|
|
1319
|
+
for (const tspan of lineTspans) {
|
|
1320
|
+
const parentText = tspan.parentElement;
|
|
1321
|
+
if (!parentText || parentText.tagName.toLowerCase() !== "text" || !parentText.parentNode) continue;
|
|
1322
|
+
const rawWidth = Number.parseFloat(tspan.getAttribute("data-pd-line-width") || "");
|
|
1323
|
+
const rawX = Number.parseFloat(tspan.getAttribute("x") || parentText.getAttribute("x") || "");
|
|
1324
|
+
if (!Number.isFinite(rawWidth) || rawWidth <= 0 || !Number.isFinite(rawX)) continue;
|
|
1325
|
+
const anchor = (tspan.getAttribute("text-anchor") || "start").trim().toLowerCase();
|
|
1326
|
+
if (anchor !== "middle" && anchor !== "end") continue;
|
|
1327
|
+
const startX = anchor === "end" ? rawX - rawWidth : anchor === "middle" ? rawX - rawWidth / 2 : rawX;
|
|
1328
|
+
const y = tspan.getAttribute("y") || parentText.getAttribute("y") || "0";
|
|
1329
|
+
const wrapper = doc.createElementNS(SVG_NS, "text");
|
|
1330
|
+
for (const attr of Array.from(parentText.attributes)) {
|
|
1331
|
+
if (["x", "y", "dx", "dy", "text-anchor", "textLength", "lengthAdjust"].includes(attr.name)) continue;
|
|
1332
|
+
wrapper.setAttribute(attr.name, attr.value);
|
|
1333
|
+
}
|
|
1334
|
+
for (const attr of Array.from(tspan.attributes)) {
|
|
1335
|
+
if (["x", "y", "dx", "dy", "text-anchor", "data-pd-line-anchor", "data-pd-line-width", "textLength", "lengthAdjust"].includes(attr.name)) continue;
|
|
1336
|
+
wrapper.setAttribute(attr.name, attr.value);
|
|
1337
|
+
}
|
|
1338
|
+
wrapper.setAttribute("x", startX.toFixed(3));
|
|
1339
|
+
wrapper.setAttribute("y", y);
|
|
1340
|
+
wrapper.setAttribute("text-anchor", "start");
|
|
1341
|
+
wrapper.setAttribute("textLength", rawWidth.toFixed(3));
|
|
1342
|
+
wrapper.setAttribute("lengthAdjust", "spacing");
|
|
1343
|
+
wrapper.textContent = tspan.textContent || "";
|
|
1344
|
+
parentText.parentNode.insertBefore(wrapper, parentText);
|
|
1345
|
+
tspan.remove();
|
|
1346
|
+
touchedParents.add(parentText);
|
|
1347
|
+
promoted++;
|
|
1348
|
+
}
|
|
1349
|
+
for (const parentText of touchedParents) {
|
|
1350
|
+
if (!parentText.parentNode) continue;
|
|
1351
|
+
const hasText = Array.from(parentText.childNodes).some((node) => (node.textContent || "").trim().length > 0);
|
|
1352
|
+
if (!hasText) parentText.parentNode.removeChild(parentText);
|
|
1353
|
+
}
|
|
1354
|
+
if (promoted > 0) console.log(`[Vector PDF][parity] promoted ${promoted} Fabric line anchor(s) to selectable fixed-width text`);
|
|
1355
|
+
}
|
|
1311
1356
|
async function logTextMeasurementDiagnostic(svg) {
|
|
1312
1357
|
var _a, _b, _c, _d, _e;
|
|
1313
1358
|
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
@@ -1874,6 +1919,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
|
|
|
1874
1919
|
console.warn("[Vector PDF] anchor-bake pass failed (continuing):", e);
|
|
1875
1920
|
}
|
|
1876
1921
|
await rasterizeShadowMarkers(svgToDraw);
|
|
1922
|
+
promoteFabricLineAnchorsToSelectableText(svgToDraw);
|
|
1877
1923
|
await convertTextDecorationsToLines(svgToDraw);
|
|
1878
1924
|
const rewritten = rewriteSvgFontsForJsPDFWithSourceMeta(new XMLSerializer().serializeToString(svgToDraw));
|
|
1879
1925
|
const rewrittenDoc = parser.parseFromString(rewritten, "image/svg+xml");
|
|
@@ -2459,7 +2505,7 @@ async function fetchSvgAsElement(imageUrl, colorMap) {
|
|
|
2459
2505
|
async function getRecoloredSvgDataUrl(imageUrl, colorMap) {
|
|
2460
2506
|
if (!colorMap || Object.keys(colorMap).length === 0) return null;
|
|
2461
2507
|
try {
|
|
2462
|
-
const { getNormalizedSvgUrl } = await import("./index-
|
|
2508
|
+
const { getNormalizedSvgUrl } = await import("./index-BQA8_wgq.js").then((n) => n.$);
|
|
2463
2509
|
return await getNormalizedSvgUrl(imageUrl, colorMap);
|
|
2464
2510
|
} catch {
|
|
2465
2511
|
return null;
|
|
@@ -3240,7 +3286,7 @@ async function fetchImageAsBase64(imageUrl, opts = {}) {
|
|
|
3240
3286
|
}
|
|
3241
3287
|
let fetchUrl = imageUrl;
|
|
3242
3288
|
if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
|
|
3243
|
-
const { isPrivateUrl } = await import("./index-
|
|
3289
|
+
const { isPrivateUrl } = await import("./index-BQA8_wgq.js").then((n) => n.$);
|
|
3244
3290
|
if (isPrivateUrl(imageUrl)) return null;
|
|
3245
3291
|
const proxyUrl = new URL(`${API_URL}/image-proxy`);
|
|
3246
3292
|
proxyUrl.searchParams.set("url", imageUrl);
|
|
@@ -5222,6 +5268,7 @@ export {
|
|
|
5222
5268
|
exportMultiPagePdf,
|
|
5223
5269
|
logTextMeasurementDiagnostic,
|
|
5224
5270
|
preparePagesForExport,
|
|
5271
|
+
promoteFabricLineAnchorsToSelectableText,
|
|
5225
5272
|
rewriteSvgFontsForJsPDFWithSourceMeta
|
|
5226
5273
|
};
|
|
5227
|
-
//# sourceMappingURL=vectorPdfExport-
|
|
5274
|
+
//# sourceMappingURL=vectorPdfExport-vCax992V.js.map
|