pdf-dejpx.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Find all JPEG-2000 images and turn them into regular images.
  2. var doc = Document.openDocument(scriptArgs[0]);
  3. function isJPXImage(ref) {
  4. if ("Filter" in ref) {
  5. var filter = ref.Filter;
  6. if (filter == "JPXDecode")
  7. return true;
  8. if (filter.isArray())
  9. for (var i = 0; i < filter.length; ++i)
  10. if (filter[i] == "JPXDecode")
  11. return true;
  12. }
  13. return false;
  14. }
  15. var i, n, ref;
  16. var jpxList = {};
  17. var smaskList = {};
  18. // Preload and destroy all JPX images.
  19. n = doc.countObjects();
  20. for (i=1; i < n; ++i) {
  21. ref = doc.newIndirect(i, 0);
  22. if (isJPXImage(ref)) {
  23. print("Loading JPX image:", i)
  24. jpxList[i] = doc.loadImage(ref);
  25. if ("SMask" in ref)
  26. smaskList[i] = ref.SMask;
  27. ref.writeObject(null); // make sure we don't reuse the JPX image resource
  28. }
  29. }
  30. for (i in jpxList) {
  31. ref = doc.newIndirect(i, 0);
  32. var jpx = jpxList[i];
  33. var pix = jpx.toPixmap();
  34. var raw = new Image(pix);
  35. // Create a new image, then copy the data to the old object, then delete it.
  36. print("Decompressed image:", i);
  37. var img = doc.addImage(raw);
  38. if (i in smaskList)
  39. img.SMask = smaskList[i];
  40. ref.writeObject(img.resolve());
  41. ref.writeRawStream(img.readRawStream());
  42. doc.deleteObject(img);
  43. // Invoke the GC to free intermediate pixmaps and images.
  44. gc();
  45. }
  46. doc.save(scriptArgs[1], "compress,garbage=compact");