如何用 JSX 脚本修改 InDesign 框架中链接 PDF 的页码?
数据阿明
可以先设置 app.pdfPlacePreferences.pageNumber,再将同一个 PDF 文件重新置入原框架。原代码中的 updateImportedPage(4) 是伪代码,需要用这两个操作替代。
为什么不能直接修改现有 PDF 的页码?
已置入 PDF 的 pdfAttributes.pageNumber 是只读属性,可以读取当前页码,但不能直接赋值。Adobe 的 PDFAttribute 文档明确标注了这一点。
可写的 app.pdfPlacePreferences.pageNumber 用于指定接下来置入的 PDF 页面。设置该属性后,还需要调用 place() 重新置入 PDF。相关属性见 PDFPlacePreference 文档。
如何批量切换到第 4 页?
下面的示例适用于 InDesign 的 JSX/ExtendScript 环境。运行时选择目标 PDF,脚本会按文件路径筛选当前文档中的 PDF 对象,再在匹配对象的父框架中重新置入第 4 页。
脚本直接遍历 allGraphics,以区分 PDF 内容对象和父框架,避免对文本框等无关页面元素执行置入操作。
(function () {
if (app.documents.length === 0) {
alert("请先打开 InDesign 文档。");
return;
}
var sourceFile = File.openDialog("选择需要切换页码的 PDF 文件");
if (!sourceFile) {
return;
}
var targetPage = 4;
var graphics = app.activeDocument.allGraphics;
var prefs = app.pdfPlacePreferences;
var oldPrefs = {
pageNumber: prefs.pageNumber,
pdfCrop: prefs.pdfCrop,
transparentBackground: prefs.transparentBackground
};
var updated = 0;
try {
for (var i = 0; i < graphics.length; i++) {
var pdf = graphics[i];
if (!(pdf instanceof PDF)) {
continue;
}
var link = pdf.itemLink;
if (!link || !link.isValid) {
continue;
}
if (File(link.filePath).fsName !== sourceFile.fsName) {
continue;
}
var frame = pdf.parent;
prefs.pageNumber = targetPage;
prefs.pdfCrop = pdf.pdfAttributes.pdfCrop;
prefs.transparentBackground =
pdf.pdfAttributes.transparentBackground;
frame.place(sourceFile, false);
if (frame.pdfs[0].pdfAttributes.pageNumber !== targetPage) {
throw new Error("置入后的 PDF 页码与目标页码不一致。");
}
updated++;
}
alert("已更新 " + updated + " 个 PDF 对象。");
} finally {
prefs.properties = oldPrefs;
}
}());
pdf.parent 获取承载 PDF 的框架,frame.place(sourceFile, false) 在该框架中执行置入;第二个参数 false 表示不显示导入选项对话框。方法签名见 Adobe 的 Rectangle.place() 文档。
脚本会沿用每个 PDF 对象原有的裁剪方式和背景透明设置,并在结束或抛出异常时恢复应用原先的 PDF 置入首选项。
执行时需要注意什么?
targetPage = 4表示 PDF 文件中的第 4 页。请确认目标文件包含该页,不要将页面上印刷的页码文字当作文件页序。- 示例按文件路径匹配,会处理当前文档中所有匹配的 PDF 对象;路径不同但文件名相同的 PDF 不会被一起处理。
- 重新置入后,应检查内容的缩放、偏移和裁剪效果,尤其是在新旧页面尺寸不同或框架启用了自动适合时。
- 框架或所在图层被锁定、PDF 无法读取等情况可能导致置入失败。此示例遇到异常会停止,已经完成的替换不会自动回滚。
- 页码检查发生在置入之后;如果检查失败,当前框架中的内容也可能已经改变。建议先在文档副本中确认结果。
备注:内容仅供参考。
