New:Socket for Asana Is Now Available.Learn more
Get Started

pixvec

Package Overview
Dependencies
Maintainers
1
Versions
40
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pixvec - npm Package Compare versions

Package was removed
Sorry, it seems this package was removed from the registry
Comparing version
1.26.0
to
1.27.0
+36
dist/cjs/io/images-pdf.d.ts
/**
* Images → one multi-page PDF.
*
* The complement of `pixvec doc` (PDF → images): stitch a stack of photos or
* scans into a single PDF, one image per page. Each page embeds its image as a
* JPEG stream (`DCTDecode`) sized to the page, so the file stays small and every
* reader opens it. The PDF is assembled as raw bytes — a JPEG stream cannot
* survive a round-trip through a JS string — with a correct cross-reference
* table. Node-only: encoding the pages to JPEG uses the raster codec.
*/
import type { RasterImage } from '../types.js';
export interface ImagePdfOptions {
/** Pixels-per-inch used to size each page from its image. Default 96. */
dpi?: number;
/** JPEG quality for the embedded page images, 1–100. Default 85. */
quality?: number;
/** Background the pages are composited onto (images may have alpha). Default white. */
background?: {
r: number;
g: number;
b: number;
};
}
/** One already-encoded JPEG page and its pixel dimensions. */
export interface JpegPage {
jpeg: Uint8Array;
width: number;
height: number;
}
/** Encode images to JPEG and assemble them into a multi-page PDF. */
export declare function imagesToPdf(images: RasterImage[], opts?: ImagePdfOptions): Promise<Uint8Array>;
/** Assemble already-JPEG pages into a PDF (pure — no codec, exact byte offsets). */
export declare function assembleImagePdf(pages: JpegPage[], opts?: {
dpi?: number;
}): Uint8Array;
//# sourceMappingURL=images-pdf.d.ts.map
{"version":3,"file":"images-pdf.d.ts","sourceRoot":"","sources":["../../../src/io/images-pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAaxG;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CAyE3F"}
"use strict";
/**
* Images → one multi-page PDF.
*
* The complement of `pixvec doc` (PDF → images): stitch a stack of photos or
* scans into a single PDF, one image per page. Each page embeds its image as a
* JPEG stream (`DCTDecode`) sized to the page, so the file stays small and every
* reader opens it. The PDF is assembled as raw bytes — a JPEG stream cannot
* survive a round-trip through a JS string — with a correct cross-reference
* table. Node-only: encoding the pages to JPEG uses the raster codec.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.imagesToPdf = imagesToPdf;
exports.assembleImagePdf = assembleImagePdf;
const encode_js_1 = require("./encode.js");
/** Encode images to JPEG and assemble them into a multi-page PDF. */
async function imagesToPdf(images, opts = {}) {
if (images.length === 0)
throw new Error('imagesToPdf needs at least one image.');
const quality = opts.quality ?? 85;
const bg = opts.background ?? { r: 255, g: 255, b: 255 };
const pages = [];
for (const img of images) {
// JPEG has no alpha; composite over the background so transparency reads as
// the page colour rather than the codec's default black.
const opaque = flattenOver(img, bg);
pages.push({ jpeg: await (0, encode_js_1.encodeRaster)(opaque, { format: 'jpeg', quality }), width: img.width, height: img.height });
}
return assembleImagePdf(pages, { dpi: opts.dpi ?? 96 });
}
/** Assemble already-JPEG pages into a PDF (pure — no codec, exact byte offsets). */
function assembleImagePdf(pages, opts = {}) {
if (pages.length === 0)
throw new Error('assembleImagePdf needs at least one page.');
const dpi = opts.dpi ?? 96;
const enc = new TextEncoder();
const chunks = [];
let pos = 0;
const put = (s) => {
const b = typeof s === 'string' ? enc.encode(s) : s;
chunks.push(b);
pos += b.length;
};
// Object numbering: 1 catalog, 2 pages, then per page i: page=3+3i,
// content=4+3i, image=5+3i.
const pageObjNum = (i) => 3 + i * 3;
const offsets = []; // offsets[objNum-1] = byte offset
const obj = (num, write) => {
offsets[num - 1] = pos;
put(`${num} 0 obj\n`);
write();
put('\nendobj\n');
};
put('%PDF-1.7\n');
put(new Uint8Array([0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a])); // binary marker
obj(1, () => put('<< /Type /Catalog /Pages 2 0 R >>'));
obj(2, () => {
const kids = pages.map((_, i) => `${pageObjNum(i)} 0 R`).join(' ');
put(`<< /Type /Pages /Kids [${kids}] /Count ${pages.length} >>`);
});
const ptPerPx = 72 / dpi;
pages.forEach((page, i) => {
const pw = round(page.width * ptPerPx);
const ph = round(page.height * ptPerPx);
const pageN = pageObjNum(i);
const contentN = pageN + 1;
const imageN = pageN + 2;
obj(pageN, () => put(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pw} ${ph}] ` +
`/Resources << /XObject << /Im0 ${imageN} 0 R >> >> /Contents ${contentN} 0 R >>`));
// Draw the image to fill the page. The cm maps the unit image square onto
// [0,0]-[pw,ph]; PDF images already run top-row-first, so it lands upright.
const content = `q ${pw} 0 0 ${ph} 0 0 cm /Im0 Do Q`;
obj(contentN, () => put(`<< /Length ${content.length} >>\nstream\n${content}\nendstream`));
obj(imageN, () => {
put(`<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} ` +
`/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpeg.length} >>\nstream\n`);
put(page.jpeg);
put('\nendstream');
});
});
const total = 2 + pages.length * 3; // highest object number
const xrefPos = pos;
let xref = `xref\n0 ${total + 1}\n0000000000 65535 f \n`;
for (let i = 1; i <= total; i++)
xref += `${String(offsets[i - 1] ?? 0).padStart(10, '0')} 00000 n \n`;
put(xref);
put(`trailer\n<< /Size ${total + 1} /Root 1 0 R >>\nstartxref\n${xrefPos}\n%%EOF\n`);
// Concatenate.
const out = new Uint8Array(pos);
let o = 0;
for (const c of chunks) {
out.set(c, o);
o += c.length;
}
return out;
}
/** Composite a (possibly transparent) image over a solid background → opaque RGBA. */
function flattenOver(img, bg) {
const { width, height, data } = img;
const out = new Uint8ClampedArray(width * height * 4);
for (let i = 0; i < width * height; i++) {
const o = i * 4;
const a = data[o + 3] / 255;
out[o] = Math.round(data[o] * a + bg.r * (1 - a));
out[o + 1] = Math.round(data[o + 1] * a + bg.g * (1 - a));
out[o + 2] = Math.round(data[o + 2] * a + bg.b * (1 - a));
out[o + 3] = 255;
}
return { width, height, data: out };
}
function round(v) {
return Math.round(v * 100) / 100;
}
//# sourceMappingURL=images-pdf.js.map
{"version":3,"file":"images-pdf.js","sourceRoot":"","sources":["../../../src/io/images-pdf.ts"],"names":[],"mappings":"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"}
/**
* Images → one multi-page PDF.
*
* The complement of `pixvec doc` (PDF → images): stitch a stack of photos or
* scans into a single PDF, one image per page. Each page embeds its image as a
* JPEG stream (`DCTDecode`) sized to the page, so the file stays small and every
* reader opens it. The PDF is assembled as raw bytes — a JPEG stream cannot
* survive a round-trip through a JS string — with a correct cross-reference
* table. Node-only: encoding the pages to JPEG uses the raster codec.
*/
import type { RasterImage } from '../types.js';
export interface ImagePdfOptions {
/** Pixels-per-inch used to size each page from its image. Default 96. */
dpi?: number;
/** JPEG quality for the embedded page images, 1–100. Default 85. */
quality?: number;
/** Background the pages are composited onto (images may have alpha). Default white. */
background?: {
r: number;
g: number;
b: number;
};
}
/** One already-encoded JPEG page and its pixel dimensions. */
export interface JpegPage {
jpeg: Uint8Array;
width: number;
height: number;
}
/** Encode images to JPEG and assemble them into a multi-page PDF. */
export declare function imagesToPdf(images: RasterImage[], opts?: ImagePdfOptions): Promise<Uint8Array>;
/** Assemble already-JPEG pages into a PDF (pure — no codec, exact byte offsets). */
export declare function assembleImagePdf(pages: JpegPage[], opts?: {
dpi?: number;
}): Uint8Array;
//# sourceMappingURL=images-pdf.d.ts.map
{"version":3,"file":"images-pdf.d.ts","sourceRoot":"","sources":["../../../src/io/images-pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAaxG;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,UAAU,CAyE3F"}
/**
* Images → one multi-page PDF.
*
* The complement of `pixvec doc` (PDF → images): stitch a stack of photos or
* scans into a single PDF, one image per page. Each page embeds its image as a
* JPEG stream (`DCTDecode`) sized to the page, so the file stays small and every
* reader opens it. The PDF is assembled as raw bytes — a JPEG stream cannot
* survive a round-trip through a JS string — with a correct cross-reference
* table. Node-only: encoding the pages to JPEG uses the raster codec.
*/
import { encodeRaster } from './encode.js';
/** Encode images to JPEG and assemble them into a multi-page PDF. */
export async function imagesToPdf(images, opts = {}) {
if (images.length === 0)
throw new Error('imagesToPdf needs at least one image.');
const quality = opts.quality ?? 85;
const bg = opts.background ?? { r: 255, g: 255, b: 255 };
const pages = [];
for (const img of images) {
// JPEG has no alpha; composite over the background so transparency reads as
// the page colour rather than the codec's default black.
const opaque = flattenOver(img, bg);
pages.push({ jpeg: await encodeRaster(opaque, { format: 'jpeg', quality }), width: img.width, height: img.height });
}
return assembleImagePdf(pages, { dpi: opts.dpi ?? 96 });
}
/** Assemble already-JPEG pages into a PDF (pure — no codec, exact byte offsets). */
export function assembleImagePdf(pages, opts = {}) {
if (pages.length === 0)
throw new Error('assembleImagePdf needs at least one page.');
const dpi = opts.dpi ?? 96;
const enc = new TextEncoder();
const chunks = [];
let pos = 0;
const put = (s) => {
const b = typeof s === 'string' ? enc.encode(s) : s;
chunks.push(b);
pos += b.length;
};
// Object numbering: 1 catalog, 2 pages, then per page i: page=3+3i,
// content=4+3i, image=5+3i.
const pageObjNum = (i) => 3 + i * 3;
const offsets = []; // offsets[objNum-1] = byte offset
const obj = (num, write) => {
offsets[num - 1] = pos;
put(`${num} 0 obj\n`);
write();
put('\nendobj\n');
};
put('%PDF-1.7\n');
put(new Uint8Array([0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a])); // binary marker
obj(1, () => put('<< /Type /Catalog /Pages 2 0 R >>'));
obj(2, () => {
const kids = pages.map((_, i) => `${pageObjNum(i)} 0 R`).join(' ');
put(`<< /Type /Pages /Kids [${kids}] /Count ${pages.length} >>`);
});
const ptPerPx = 72 / dpi;
pages.forEach((page, i) => {
const pw = round(page.width * ptPerPx);
const ph = round(page.height * ptPerPx);
const pageN = pageObjNum(i);
const contentN = pageN + 1;
const imageN = pageN + 2;
obj(pageN, () => put(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pw} ${ph}] ` +
`/Resources << /XObject << /Im0 ${imageN} 0 R >> >> /Contents ${contentN} 0 R >>`));
// Draw the image to fill the page. The cm maps the unit image square onto
// [0,0]-[pw,ph]; PDF images already run top-row-first, so it lands upright.
const content = `q ${pw} 0 0 ${ph} 0 0 cm /Im0 Do Q`;
obj(contentN, () => put(`<< /Length ${content.length} >>\nstream\n${content}\nendstream`));
obj(imageN, () => {
put(`<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} ` +
`/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpeg.length} >>\nstream\n`);
put(page.jpeg);
put('\nendstream');
});
});
const total = 2 + pages.length * 3; // highest object number
const xrefPos = pos;
let xref = `xref\n0 ${total + 1}\n0000000000 65535 f \n`;
for (let i = 1; i <= total; i++)
xref += `${String(offsets[i - 1] ?? 0).padStart(10, '0')} 00000 n \n`;
put(xref);
put(`trailer\n<< /Size ${total + 1} /Root 1 0 R >>\nstartxref\n${xrefPos}\n%%EOF\n`);
// Concatenate.
const out = new Uint8Array(pos);
let o = 0;
for (const c of chunks) {
out.set(c, o);
o += c.length;
}
return out;
}
/** Composite a (possibly transparent) image over a solid background → opaque RGBA. */
function flattenOver(img, bg) {
const { width, height, data } = img;
const out = new Uint8ClampedArray(width * height * 4);
for (let i = 0; i < width * height; i++) {
const o = i * 4;
const a = data[o + 3] / 255;
out[o] = Math.round(data[o] * a + bg.r * (1 - a));
out[o + 1] = Math.round(data[o + 1] * a + bg.g * (1 - a));
out[o + 2] = Math.round(data[o + 2] * a + bg.b * (1 - a));
out[o + 3] = 255;
}
return { width, height, data: out };
}
function round(v) {
return Math.round(v * 100) / 100;
}
//# sourceMappingURL=images-pdf.js.map
{"version":3,"file":"images-pdf.js","sourceRoot":"","sources":["../../../src/io/images-pdf.ts"],"names":[],"mappings":"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"}
+1
-1

@@ -10,3 +10,3 @@ import { type DecodeOptions } from './io/decode.js';

import { type TraceOptions } from './vectorize/trace.js';
export declare const VERSION = "1.26.0";
export declare const VERSION = "1.27.0";
export type VectorizeModeOption = VectorizeMode | 'auto' | 'lossless';

@@ -13,0 +13,0 @@ export type Preset = 'auto' | 'logo' | 'lineart' | 'poster' | 'photo' | 'detailed' | 'pixelart' | 'exact';

@@ -21,3 +21,3 @@ "use strict";

const trace_js_1 = require("./vectorize/trace.js");
exports.VERSION = '1.26.0';
exports.VERSION = '1.27.0';
const GENERATOR = `Generated by pixvec v${exports.VERSION}`;

@@ -24,0 +24,0 @@ /**

@@ -62,3 +62,3 @@ /**

/** Version of the package this build came from. */
export declare const VERSION = "1.26.0";
export declare const VERSION = "1.27.0";
//# sourceMappingURL=core.d.ts.map

@@ -194,3 +194,3 @@ "use strict";

/** Version of the package this build came from. */
exports.VERSION = '1.26.0';
exports.VERSION = '1.27.0';
//# sourceMappingURL=core.js.map

@@ -22,2 +22,3 @@ /**

export { isPdf, renderPdfPages, countPdfPages, type PdfRenderOptions, } from './io/pdf.js';
export { imagesToPdf, assembleImagePdf, type ImagePdfOptions, type JpegPage, } from './io/images-pdf.js';
export { convertOffice, findSoffice, buildSofficeArgs, OFFICE_FORMATS, type OfficeConvertOptions, type OfficeConvertResult, } from './io/office.js';

@@ -24,0 +25,0 @@ export { PRESETS, loadRaster, loadAnyAsRaster, vectorize, rasterize, verifySvg, measureFlatness, suggestTitle, type VectorizeOptions, type VectorizeInput, type VectorizeModeOption, type Preset, type RasterizeToBufferOptions, type RasterizeOutcome, } from './api.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,QAAQ,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}

@@ -29,3 +29,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.VERSION = exports.pixvecPlugin = exports.suggestTitle = exports.measureFlatness = exports.verifySvg = exports.rasterize = exports.vectorize = exports.loadAnyAsRaster = exports.loadRaster = exports.PRESETS = exports.OFFICE_FORMATS = exports.buildSofficeArgs = exports.findSoffice = exports.convertOffice = exports.countPdfPages = exports.renderPdfPages = exports.isPdf = exports.traceAnimation = exports.responsiveSet = exports.faviconSet = exports.extractEmbedded = exports.vectorizeEmbed = exports.baseDirFor = exports.rasterizeSvg = exports.isRasterExtension = exports.formatFromExtension = exports.encodeRaster = exports.looksLikeSvg = exports.decodeRaster = void 0;
exports.VERSION = exports.pixvecPlugin = exports.suggestTitle = exports.measureFlatness = exports.verifySvg = exports.rasterize = exports.vectorize = exports.loadAnyAsRaster = exports.loadRaster = exports.PRESETS = exports.OFFICE_FORMATS = exports.buildSofficeArgs = exports.findSoffice = exports.convertOffice = exports.assembleImagePdf = exports.imagesToPdf = exports.countPdfPages = exports.renderPdfPages = exports.isPdf = exports.traceAnimation = exports.responsiveSet = exports.faviconSet = exports.extractEmbedded = exports.vectorizeEmbed = exports.baseDirFor = exports.rasterizeSvg = exports.isRasterExtension = exports.formatFromExtension = exports.encodeRaster = exports.looksLikeSvg = exports.decodeRaster = void 0;
// Everything portable, re-exported so a single import works for Node users.

@@ -62,2 +62,6 @@ __exportStar(require("./core.js"), exports);

Object.defineProperty(exports, "countPdfPages", { enumerable: true, get: function () { return pdf_js_1.countPdfPages; } });
// --- Images → one multi-page PDF (Node-only) -------------------------------
var images_pdf_js_1 = require("./io/images-pdf.js");
Object.defineProperty(exports, "imagesToPdf", { enumerable: true, get: function () { return images_pdf_js_1.imagesToPdf; } });
Object.defineProperty(exports, "assembleImagePdf", { enumerable: true, get: function () { return images_pdf_js_1.assembleImagePdf; } });
// --- Office ⇄ PDF via the user's LibreOffice (nothing bundled; Node-only) ---

@@ -64,0 +68,0 @@ var office_js_1 = require("./io/office.js");

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;AAEH,4EAA4E;AAC5E,4CAA0B;AAE1B,6EAA6E;AAC7E,4CAKwB;AAJtB,yGAAA,YAAY,OAAA;AACZ,yGAAA,YAAY,OAAA;AAKd,6EAA6E;AAC7E,4CAKwB;AAJtB,yGAAA,YAAY,OAAA;AACZ,gHAAA,mBAAmB,OAAA;AACnB,8GAAA,iBAAiB,OAAA;AAInB,8EAA8E;AAC9E,kDAK2B;AAJzB,4GAAA,YAAY,OAAA;AACZ,0GAAA,UAAU,OAAA;AAKZ,+EAA+E;AAC/E,iDAM8B;AAL5B,0GAAA,cAAc,OAAA;AACd,2GAAA,eAAe,OAAA;AAMjB,8EAA8E;AAC9E,qDAKgC;AAJ9B,wGAAA,UAAU,OAAA;AAKZ,2DAKmC;AAJjC,8GAAA,aAAa,OAAA;AAKf,qDAIgC;AAH9B,4GAAA,cAAc,OAAA;AAKhB,8EAA8E;AAC9E,sCAKqB;AAJnB,+FAAA,KAAK,OAAA;AACL,wGAAA,cAAc,OAAA;AACd,uGAAA,aAAa,OAAA;AAIf,+EAA+E;AAC/E,4CAOwB;AANtB,0GAAA,aAAa,OAAA;AACb,wGAAA,WAAW,OAAA;AACX,6GAAA,gBAAgB,OAAA;AAChB,2GAAA,cAAc,OAAA;AAKhB,8EAA8E;AAC9E,mCAekB;AAdhB,iGAAA,OAAO,OAAA;AACP,oGAAA,UAAU,OAAA;AACV,yGAAA,eAAe,OAAA;AACf,mGAAA,SAAS,OAAA;AACT,mGAAA,SAAS,OAAA;AACT,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,sGAAA,YAAY,OAAA;AASd,6EAA6E;AAC7E,4CAA0E;AAAjE,uGAAA,YAAY,OAAA;AAErB,gFAAgF;AAChF,mCAAmC;AAA1B,iGAAA,OAAO,OAAA"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;AAEH,4EAA4E;AAC5E,4CAA0B;AAE1B,6EAA6E;AAC7E,4CAKwB;AAJtB,yGAAA,YAAY,OAAA;AACZ,yGAAA,YAAY,OAAA;AAKd,6EAA6E;AAC7E,4CAKwB;AAJtB,yGAAA,YAAY,OAAA;AACZ,gHAAA,mBAAmB,OAAA;AACnB,8GAAA,iBAAiB,OAAA;AAInB,8EAA8E;AAC9E,kDAK2B;AAJzB,4GAAA,YAAY,OAAA;AACZ,0GAAA,UAAU,OAAA;AAKZ,+EAA+E;AAC/E,iDAM8B;AAL5B,0GAAA,cAAc,OAAA;AACd,2GAAA,eAAe,OAAA;AAMjB,8EAA8E;AAC9E,qDAKgC;AAJ9B,wGAAA,UAAU,OAAA;AAKZ,2DAKmC;AAJjC,8GAAA,aAAa,OAAA;AAKf,qDAIgC;AAH9B,4GAAA,cAAc,OAAA;AAKhB,8EAA8E;AAC9E,sCAKqB;AAJnB,+FAAA,KAAK,OAAA;AACL,wGAAA,cAAc,OAAA;AACd,uGAAA,aAAa,OAAA;AAIf,8EAA8E;AAC9E,oDAK4B;AAJ1B,4GAAA,WAAW,OAAA;AACX,iHAAA,gBAAgB,OAAA;AAKlB,+EAA+E;AAC/E,4CAOwB;AANtB,0GAAA,aAAa,OAAA;AACb,wGAAA,WAAW,OAAA;AACX,6GAAA,gBAAgB,OAAA;AAChB,2GAAA,cAAc,OAAA;AAKhB,8EAA8E;AAC9E,mCAekB;AAdhB,iGAAA,OAAO,OAAA;AACP,oGAAA,UAAU,OAAA;AACV,yGAAA,eAAe,OAAA;AACf,mGAAA,SAAS,OAAA;AACT,mGAAA,SAAS,OAAA;AACT,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,sGAAA,YAAY,OAAA;AASd,6EAA6E;AAC7E,4CAA0E;AAAjE,uGAAA,YAAY,OAAA;AAErB,gFAAgF;AAChF,mCAAmC;AAA1B,iGAAA,OAAO,OAAA"}

@@ -1,1 +0,1 @@

{"version":3,"file":"office.d.ts","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,wFAAwF;AACxF,eAAO,MAAM,cAAc,iHAGjB,CAAC;AAEX,4FAA4F;AAC5F,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAW3C;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAyB9B"}
{"version":3,"file":"office.d.ts","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,wFAAwF;AACxF,eAAO,MAAM,cAAc,iHAGjB,CAAC;AAEX,4FAA4F;AAC5F,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAW3C;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA+B9B"}

@@ -60,5 +60,10 @@ "use strict";

throw new Error('The output path needs an extension, e.g. -o out.pdf');
// Resolve to an absolute path so LibreOffice never mistakes a filename that
// starts with '-' for an option, and so relative inputs work from any cwd.
const absInput = (0, node_path_1.resolve)(input);
if (!(0, node_fs_1.existsSync)(absInput))
throw new Error(`Input not found: ${input}`);
const tmp = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'pixvec-office-'));
try {
const args = buildSofficeArgs(input, targetExt, tmp);
const args = buildSofficeArgs(absInput, targetExt, tmp);
const run = opts.run ?? ((b, a) => spawnSoffice(b, a, opts.timeoutMs ?? 120_000));

@@ -68,7 +73,8 @@ await run(bin, args);

// path the caller actually asked for.
const produced = (0, node_path_1.join)(tmp, `${(0, node_path_1.basename)(input, (0, node_path_1.extname)(input))}.${targetExt}`);
const produced = (0, node_path_1.join)(tmp, `${(0, node_path_1.basename)(absInput, (0, node_path_1.extname)(absInput))}.${targetExt}`);
if (!(0, node_fs_1.existsSync)(produced)) {
throw new Error(`LibreOffice produced no ${targetExt.toUpperCase()} — the conversion from ` +
`${(0, node_path_1.extname)(input) || 'that format'} to .${targetExt} may be unsupported.`);
`${(0, node_path_1.extname)(absInput) || 'that format'} to .${targetExt} may be unsupported.`);
}
await (0, promises_1.mkdir)((0, node_path_1.dirname)((0, node_path_1.resolve)(outPath)), { recursive: true });
await (0, promises_1.writeFile)(outPath, await (0, promises_1.readFile)(produced));

@@ -75,0 +81,0 @@ return { output: outPath, engine: bin };

@@ -1,1 +0,1 @@

{"version":3,"file":"office.js","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"office.js","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"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"}

@@ -22,2 +22,8 @@ /**

export declare function isPdf(bytes: Uint8Array): boolean;
/**
* Which 0-based page indices a request resolves to: the given `pages` deduped,
* range-clamped to `count` and sorted, or every page when none are named.
* Exported so callers can label rendered pages by their real page number.
*/
export declare function resolvePageIndices(count: number, pages?: number[]): number[];
/** Render selected PDF pages to straight-RGBA {@link RasterImage}s. */

@@ -24,0 +30,0 @@ export declare function renderPdfPages(bytes: Uint8Array, opts?: PdfRenderOptions): Promise<RasterImage[]>;

@@ -1,1 +0,1 @@

{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4B3G;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtE"}
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI5E;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+B3G;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtE"}

@@ -47,2 +47,3 @@ "use strict";

exports.isPdf = isPdf;
exports.resolvePageIndices = resolvePageIndices;
exports.renderPdfPages = renderPdfPages;

@@ -60,2 +61,12 @@ exports.countPdfPages = countPdfPages;

}
/**
* Which 0-based page indices a request resolves to: the given `pages` deduped,
* range-clamped to `count` and sorted, or every page when none are named.
* Exported so callers can label rendered pages by their real page number.
*/
function resolvePageIndices(count, pages) {
return pages && pages.length
? [...new Set(pages)].filter((p) => p >= 0 && p < count).sort((a, b) => a - b)
: Array.from({ length: count }, (_, i) => i);
}
/** Render selected PDF pages to straight-RGBA {@link RasterImage}s. */

@@ -67,18 +78,23 @@ async function renderPdfPages(bytes, opts = {}) {

try {
const count = doc.countPages();
const wanted = opts.pages && opts.pages.length
? [...new Set(opts.pages)].filter((p) => p >= 0 && p < count).sort((a, b) => a - b)
: Array.from({ length: count }, (_, i) => i);
const wanted = resolvePageIndices(doc.countPages(), opts.pages);
const out = [];
for (const p of wanted) {
const page = doc.loadPage(p);
const pix = page.toPixmap(mupdf.Matrix.scale(scale, scale), mupdf.ColorSpace.DeviceRGB, true);
out.push({
width: pix.getWidth(),
height: pix.getHeight(),
// getPixels() is RGBA (alpha requested); copy into the owned buffer type.
data: new Uint8ClampedArray(pix.getPixels()),
});
pix.destroy?.();
page.destroy?.();
// Own each page/pixmap in its own scope so a mid-loop render failure on one
// page still frees that page's native (WASM) memory instead of leaking it.
let page;
let pix;
try {
page = doc.loadPage(p);
pix = page.toPixmap(mupdf.Matrix.scale(scale, scale), mupdf.ColorSpace.DeviceRGB, true);
out.push({
width: pix.getWidth(),
height: pix.getHeight(),
// getPixels() is RGBA (alpha requested); copy into the owned buffer type.
data: new Uint8ClampedArray(pix.getPixels()),
});
}
finally {
pix?.destroy?.();
page?.destroy?.();
}
}

@@ -85,0 +101,0 @@ return out;

@@ -1,1 +0,1 @@

{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"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"}

@@ -10,3 +10,3 @@ import { type DecodeOptions } from './io/decode.js';

import { type TraceOptions } from './vectorize/trace.js';
export declare const VERSION = "1.26.0";
export declare const VERSION = "1.27.0";
export type VectorizeModeOption = VectorizeMode | 'auto' | 'lossless';

@@ -13,0 +13,0 @@ export type Preset = 'auto' | 'logo' | 'lineart' | 'poster' | 'photo' | 'detailed' | 'pixelart' | 'exact';

@@ -11,3 +11,3 @@ import { basename } from 'node:path';

import { trace, TRACE_DEFAULTS } from './vectorize/trace.js';
export const VERSION = '1.26.0';
export const VERSION = '1.27.0';
const GENERATOR = `Generated by pixvec v${VERSION}`;

@@ -14,0 +14,0 @@ /**

@@ -62,3 +62,3 @@ /**

/** Version of the package this build came from. */
export declare const VERSION = "1.26.0";
export declare const VERSION = "1.27.0";
//# sourceMappingURL=core.d.ts.map

@@ -91,3 +91,3 @@ /**

/** Version of the package this build came from. */
export const VERSION = '1.26.0';
export const VERSION = '1.27.0';
//# sourceMappingURL=core.js.map

@@ -22,2 +22,3 @@ /**

export { isPdf, renderPdfPages, countPdfPages, type PdfRenderOptions, } from './io/pdf.js';
export { imagesToPdf, assembleImagePdf, type ImagePdfOptions, type JpegPage, } from './io/images-pdf.js';
export { convertOffice, findSoffice, buildSofficeArgs, OFFICE_FORMATS, type OfficeConvertOptions, type OfficeConvertResult, } from './io/office.js';

@@ -24,0 +25,0 @@ export { PRESETS, loadRaster, loadAnyAsRaster, vectorize, rasterize, verifySvg, measureFlatness, suggestTitle, type VectorizeOptions, type VectorizeInput, type VectorizeModeOption, type Preset, type RasterizeToBufferOptions, type RasterizeOutcome, } from './api.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,OAAO,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,QAAQ,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}

@@ -29,2 +29,4 @@ /**

export { isPdf, renderPdfPages, countPdfPages, } from './io/pdf.js';
// --- Images → one multi-page PDF (Node-only) -------------------------------
export { imagesToPdf, assembleImagePdf, } from './io/images-pdf.js';
// --- Office ⇄ PDF via the user's LibreOffice (nothing bundled; Node-only) ---

@@ -31,0 +33,0 @@ export { convertOffice, findSoffice, buildSofficeArgs, OFFICE_FORMATS, } from './io/office.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,cAAc,WAAW,CAAC;AAE1B,6EAA6E;AAC7E,OAAO,EACL,YAAY,EACZ,YAAY,GAGb,MAAM,gBAAgB,CAAC;AAExB,6EAA6E;AAC7E,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,OAAO,EACL,YAAY,EACZ,UAAU,GAGX,MAAM,mBAAmB,CAAC;AAE3B,+EAA+E;AAC/E,OAAO,EACL,cAAc,EACd,eAAe,GAIhB,MAAM,sBAAsB,CAAC;AAE9B,8EAA8E;AAC9E,OAAO,EACL,UAAU,GAIX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,GAId,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,8EAA8E;AAC9E,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,GAGf,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,GAOb,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAE1E,gFAAgF;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4EAA4E;AAC5E,cAAc,WAAW,CAAC;AAE1B,6EAA6E;AAC7E,OAAO,EACL,YAAY,EACZ,YAAY,GAGb,MAAM,gBAAgB,CAAC;AAExB,6EAA6E;AAC7E,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,OAAO,EACL,YAAY,EACZ,UAAU,GAGX,MAAM,mBAAmB,CAAC;AAE3B,+EAA+E;AAC/E,OAAO,EACL,cAAc,EACd,eAAe,GAIhB,MAAM,sBAAsB,CAAC;AAE9B,8EAA8E;AAC9E,OAAO,EACL,UAAU,GAIX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,GAId,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,8EAA8E;AAC9E,OAAO,EACL,KAAK,EACL,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,8EAA8E;AAC9E,OAAO,EACL,WAAW,EACX,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,+EAA+E;AAC/E,OAAO,EACL,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,GAGf,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,GAOb,MAAM,UAAU,CAAC;AAElB,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAE1E,gFAAgF;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}

@@ -1,1 +0,1 @@

{"version":3,"file":"office.d.ts","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,wFAAwF;AACxF,eAAO,MAAM,cAAc,iHAGjB,CAAC;AAEX,4FAA4F;AAC5F,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAW3C;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAyB9B"}
{"version":3,"file":"office.d.ts","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,wFAAwF;AACxF,eAAO,MAAM,cAAc,iHAGjB,CAAC;AAEX,4FAA4F;AAC5F,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAW3C;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA+B9B"}

@@ -17,5 +17,5 @@ /**

import { existsSync } from 'node:fs';
import { readFile, writeFile, rm, mkdtemp } from 'node:fs/promises';
import { readFile, writeFile, rm, mkdtemp, mkdir } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { basename, extname, join } from 'node:path';
import { basename, dirname, extname, join, resolve } from 'node:path';
/** A representative set of formats LibreOffice converts among (for help/validation). */

@@ -55,5 +55,10 @@ export const OFFICE_FORMATS = [

throw new Error('The output path needs an extension, e.g. -o out.pdf');
// Resolve to an absolute path so LibreOffice never mistakes a filename that
// starts with '-' for an option, and so relative inputs work from any cwd.
const absInput = resolve(input);
if (!existsSync(absInput))
throw new Error(`Input not found: ${input}`);
const tmp = await mkdtemp(join(tmpdir(), 'pixvec-office-'));
try {
const args = buildSofficeArgs(input, targetExt, tmp);
const args = buildSofficeArgs(absInput, targetExt, tmp);
const run = opts.run ?? ((b, a) => spawnSoffice(b, a, opts.timeoutMs ?? 120_000));

@@ -63,7 +68,8 @@ await run(bin, args);

// path the caller actually asked for.
const produced = join(tmp, `${basename(input, extname(input))}.${targetExt}`);
const produced = join(tmp, `${basename(absInput, extname(absInput))}.${targetExt}`);
if (!existsSync(produced)) {
throw new Error(`LibreOffice produced no ${targetExt.toUpperCase()} — the conversion from ` +
`${extname(input) || 'that format'} to .${targetExt} may be unsupported.`);
`${extname(absInput) || 'that format'} to .${targetExt} may be unsupported.`);
}
await mkdir(dirname(resolve(outPath)), { recursive: true });
await writeFile(outPath, await readFile(produced));

@@ -70,0 +76,0 @@ return { output: outPath, engine: bin };

@@ -1,1 +0,1 @@

{"version":3,"file":"office.js","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"office.js","sourceRoot":"","sources":["../../../src/io/office.ts"],"names":[],"mappings":"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"}

@@ -22,2 +22,8 @@ /**

export declare function isPdf(bytes: Uint8Array): boolean;
/**
* Which 0-based page indices a request resolves to: the given `pages` deduped,
* range-clamped to `count` and sorted, or every page when none are named.
* Exported so callers can label rendered pages by their real page number.
*/
export declare function resolvePageIndices(count: number, pages?: number[]): number[];
/** Render selected PDF pages to straight-RGBA {@link RasterImage}s. */

@@ -24,0 +30,0 @@ export declare function renderPdfPages(bytes: Uint8Array, opts?: PdfRenderOptions): Promise<RasterImage[]>;

@@ -1,1 +0,1 @@

{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4B3G;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtE"}
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI5E;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+B3G;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtE"}

@@ -21,2 +21,12 @@ /**

}
/**
* Which 0-based page indices a request resolves to: the given `pages` deduped,
* range-clamped to `count` and sorted, or every page when none are named.
* Exported so callers can label rendered pages by their real page number.
*/
export function resolvePageIndices(count, pages) {
return pages && pages.length
? [...new Set(pages)].filter((p) => p >= 0 && p < count).sort((a, b) => a - b)
: Array.from({ length: count }, (_, i) => i);
}
/** Render selected PDF pages to straight-RGBA {@link RasterImage}s. */

@@ -28,18 +38,23 @@ export async function renderPdfPages(bytes, opts = {}) {

try {
const count = doc.countPages();
const wanted = opts.pages && opts.pages.length
? [...new Set(opts.pages)].filter((p) => p >= 0 && p < count).sort((a, b) => a - b)
: Array.from({ length: count }, (_, i) => i);
const wanted = resolvePageIndices(doc.countPages(), opts.pages);
const out = [];
for (const p of wanted) {
const page = doc.loadPage(p);
const pix = page.toPixmap(mupdf.Matrix.scale(scale, scale), mupdf.ColorSpace.DeviceRGB, true);
out.push({
width: pix.getWidth(),
height: pix.getHeight(),
// getPixels() is RGBA (alpha requested); copy into the owned buffer type.
data: new Uint8ClampedArray(pix.getPixels()),
});
pix.destroy?.();
page.destroy?.();
// Own each page/pixmap in its own scope so a mid-loop render failure on one
// page still frees that page's native (WASM) memory instead of leaking it.
let page;
let pix;
try {
page = doc.loadPage(p);
pix = page.toPixmap(mupdf.Matrix.scale(scale, scale), mupdf.ColorSpace.DeviceRGB, true);
out.push({
width: pix.getWidth(),
height: pix.getHeight(),
// getPixels() is RGBA (alpha requested); copy into the owned buffer type.
data: new Uint8ClampedArray(pix.getPixels()),
});
}
finally {
pix?.destroy?.();
page?.destroy?.();
}
}

@@ -46,0 +61,0 @@ return out;

@@ -1,1 +0,1 @@

{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/io/pdf.ts"],"names":[],"mappings":"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"}
{
"name": "pixvec",
"version": "1.26.0",
"version": "1.27.0",
"description": "Measurable raster <-> SVG conversion. Pixel-exact lossless vectorization, quality-targeted Bezier tracing, and exact SVG rasterization - with built-in PSNR/SSIM/CIEDE2000 verification. Reads PNG, JPEG, WebP, AVIF, TIFF, GIF, BMP, ICO, PNM and TGA.",

@@ -5,0 +5,0 @@ "keywords": [

@@ -415,2 +415,3 @@ # Pixvec

pixvec office report.docx -o report.pdf # Word/Excel/PPT ⇄ PDF (uses your LibreOffice)
pixvec pdf page1.png page2.jpg -o album.pdf # combine images into one multi-page PDF
pixvec centerline drawing.png -o strokes.svg # single-stroke medial-axis paths

@@ -467,2 +468,4 @@ pixvec gcode drawing.png --tool laser --feed 800 # ready-to-run laser/plotter G-code

**Images → one PDF** — `pixvec pdf scan1.png scan2.jpg -o album.pdf` stitches a stack of photos or scans into a single multi-page PDF, one image per page, sized at any `--dpi`. The PDF is assembled from raw bytes with a correct cross-reference table (each page embedded as a `DCTDecode` JPEG), so it stays small and opens everywhere — the natural complement to `pixvec doc` (PDF → images). `imagesToPdf()` / `assembleImagePdf()` are exported.
**Office documents ⇄ PDF** — `pixvec office report.docx -o report.pdf` (and the reverse, `scan.pdf -o out.docx`, plus Excel, PowerPoint, ODF, RTF, HTML, CSV — any pair LibreOffice bridges). Faithfully rendering Word/Excel/PowerPoint needs a full office engine, so — exactly as with PDFs — pixvec **bundles nothing** and drives your **local LibreOffice** through a plain child process: **zero added dependencies, the install stays tiny, and your documents never leave the machine** (no cloud upload, unlike most converters). The target format is inferred from the output extension; if LibreOffice isn't found the error tells you how to install it or points `PIXVEC_SOFFICE` at the binary. `convertOffice()` is exported for programmatic use.

@@ -469,0 +472,0 @@

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display