56 lines
1.3 KiB
JavaScript
56 lines
1.3 KiB
JavaScript
|
// Find all JPEG-2000 images and turn them into regular images.
|
||
|
|
||
|
var doc = new PDFDocument(scriptArgs[0]);
|
||
|
|
||
|
function isJPXImage(ref) {
|
||
|
if ("Filter" in ref) {
|
||
|
var filter = ref.Filter;
|
||
|
if (filter == "JPXDecode")
|
||
|
return true;
|
||
|
if (filter.isArray())
|
||
|
for (var i = 0; i < filter.length; ++i)
|
||
|
if (filter[i] == "JPXDecode")
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
var i, n, ref;
|
||
|
|
||
|
var jpxList = {};
|
||
|
var smaskList = {};
|
||
|
|
||
|
// Preload and destroy all JPX images.
|
||
|
n = doc.countObjects();
|
||
|
for (i=1; i < n; ++i) {
|
||
|
ref = doc.newIndirect(i, 0);
|
||
|
if (isJPXImage(ref)) {
|
||
|
print("Loading JPX image:", i)
|
||
|
jpxList[i] = doc.loadImage(ref);
|
||
|
if ("SMask" in ref)
|
||
|
smaskList[i] = ref.SMask;
|
||
|
ref.writeObject(null); // make sure we don't reuse the JPX image resource
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i in jpxList) {
|
||
|
ref = doc.newIndirect(i, 0);
|
||
|
var jpx = jpxList[i];
|
||
|
var pix = jpx.toPixmap();
|
||
|
var raw = new Image(pix);
|
||
|
|
||
|
// Create a new image, then copy the data to the old object, then delete it.
|
||
|
print("Decompressed image:", i);
|
||
|
var img = doc.addImage(raw);
|
||
|
if (i in smaskList)
|
||
|
img.SMask = smaskList[i];
|
||
|
ref.writeObject(img.resolve());
|
||
|
ref.writeRawStream(img.readRawStream());
|
||
|
doc.deleteObject(img);
|
||
|
|
||
|
// Invoke the GC to free intermediate pixmaps and images.
|
||
|
gc();
|
||
|
}
|
||
|
|
||
|
doc.save(scriptArgs[1], "compress,garbage=compact");
|