[ID CS4-CS6] Export Sections as PDF

  • Автор темы Автор темы densen
  • Дата начала Дата начала

densen

Топикстартер
20 лет на форуме
Сообщения
818
Реакции
737
Поискал скрипт по интернету - не нашел. Платить $8.90 - пожалел.
Ссылка в Ресурсах. Может быть, можно как-то более изящно, но я только учусь.


JavaScript:
// Экспорт разделов в PDF (Export Sections As PDF)

var myPDFExportPreset = "2540_150_CPL"; // Название PDF-пресета (PDF preset name)
var myPrefix = "Pages_"; // Префикс для добавления к именам файлов (Prefix to your files names)


var path = app.activeDocument.fullName.path;
for (i = 0; i < app.activeDocument.sections.length; i++) {
    var mySecFirstPage = app.activeDocument.sections[i].pageNumberStart;
    var mySecLastPage = mySecFirstPage + app.activeDocument.sections[i].length - 1;
    app.pdfExportPreferences.pageRange = mySecFirstPage + "-" + mySecLastPage;
    var mySecFirstPage = ("000" + mySecFirstPage).slice(-3);
    var mySecLastPage = ("000" + mySecLastPage).slice(-3);
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + myPrefix + mySecFirstPage + "-" + mySecLastPage + ".pdf"), false, app.pdfExportPresets.item(myPDFExportPreset));
    }

Вопрос к профессионалам. Даже при том, что скрипт работает безотказно во всех случаях, есть различие в алгоритме его работы.
1) Если страницы идут по порядку с первой до N-й, но порядок создания файлов строгий: 001-009, 010-024, 025-033, 034-046, 047-056, 057-057, 058-063, 064-071, 072-080, 081-090 и т.д.
2) Если в страницах есть пропущенные диапазоны страниц, то порядок создания файлов нарушается: 010-024, 034-046, 047-056, 058-063, 025-033, 072-080, 081-090, 091-104, 105-113.
Хочу узнать, почему так происходит и как с этим бороться. В данном случае разницы нет - файлы экспортируются, и порядок здесь неважен. Но у меня другой стрипт не работает корректно при аналогичном обращении к разделам документа и мне хочется его выправить.
 
Последнее редактирование:
  • Спасибо
Реакции: Slx1
Ты бы тестовые файлы в ресурсы тоже засунул, в idml...
В принципе если не углубляться каким макаром ID определяет порядок нумерации секций внутри объектной модели, то можно загонять номера страниц начала и конца секций в 2 массива, упорядочить, потом заняться сохранением.
 
Последнее редактирование:
  • Спасибо
Реакции: densen
Ты бы тестовые файлы в ресурсы тоже засунул, в idml...
Скрипт рабочий, поэтому тестовые файлы, наверное, лучше сюда положить? В архиве два файла: ru - с полным набором страниц, en - с пропусками некоторых диапазонов.
 

Вложения

JavaScript:
// Экспорт разделов в PDF (Export Sections As PDF)
// v.1 (27-05-2022)
var doc = app.activeDocument;
var myPDFExportPreset = "2540_150_CPL"; // Название PDF-пресета (PDF preset name)
var myPrefix = "Pages_"; // Префикс для добавления к именам файлов (Prefix to your files names)


var path = app.activeDocument.fullName.path;
var mySecFirstPage = [];
var mySecLastPage = [];
for (i = 0; i < app.activeDocument.sections.length; i++) {
    mySecFirstPage[i] = doc.sections[i].pageNumberStart;
    mySecLastPage[i] = mySecFirstPage[i] + doc.sections[i].length - 1;
};
mySecFirstPage.sort(function(a, b) {return a - b});
mySecLastPage.sort(function(a, b) {return a - b});
for (i = 0; i < mySecFirstPage.length; i++) {
    app.pdfExportPreferences.pageRange = mySecFirstPage + "-" + mySecLastPage;
    mySecFirstPage[i] = ("000" + mySecFirstPage[i]).slice(-3);
    mySecLastPage[i] = ("000" + mySecLastPage[i]).slice(-3);
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + myPrefix + mySecFirstPage[i] + "-" + mySecLastPage[i] + ".pdf"), false, app.pdfExportPresets.item(myPDFExportPreset));
};
//alert (mySecFirstPage + "\n" + mySecLastPage)
 
  • Спасибо
Реакции: densen

Не по теме:
Порядок экспорта правильный, и нумерация правильная, но во всех pdf-файлах содержится документ полностью, с 10 по 113 страницу (с пропусками диапазонов, конечно же).

Добавлено
Нашел, где подвох:
Вот так правильно.
JavaScript:
app.pdfExportPreferences.pageRange = mySecFirstPage[i] + "-" + mySecLastPage[i];

Спасибо!
 
Последнее редактирование:

Не по теме:
Порядок экспорта правильный, и нумерация правильная, но во всех pdf-файлах содержится документ полностью, с 10 по 113 страницу (с пропусками диапазонов, конечно же).

Добавлено
Нашел, где подвох:
Вот так правильно.
JavaScript:
app.pdfExportPreferences.pageRange = mySecFirstPage[i] + "-" + mySecLastPage[i];

Спасибо!
Когда засунул Ваш код, не все поправил. Но Вы сами разобрались, вот и хорошо :)
 
  • Спасибо
Реакции: densen
Коллеги, можно через это скрипт (или может как то еще)
организовать экспорт в PDF так сказать "своих" секции вручную?
Например 1, 2-3 стр со своим суффиксом, рядом 1, 4-5 стр со своим суффиксом
Естественно пресет PDF один на весь экспорт
 
Последнее редактирование:
Коллеги, можно через это скрипт (или может как то еще)
организовать экспорт в PDF так сказать "своих" секции вручную?
В твоем случае лучше воспользоваться модицикацией отличного скрипта от незабвенного Jongware по экспорту диапазонов страниц. Я сделал два набора, их можно сделать хоть пять подряд. Диапазоны страниц можно записывать в скрипт или вставлять их вручную каждый раз при запросе - без разницы. Префиксы поменять на нужные. Можно еще прописать жесткий путь к экспортным файлам, чтобы не засоряли директорию с рабочими файлами (я внутри написал пример, нужно убрать /* и */ и вписать свой путь).

JavaScript:
//DESCRIPTION:Export page ranges
// A Jongware Script 09-Dec-2019

prefix1 = "prefix1_"; // Префикс к первому набору страниц
pglist1 = prompt ("Первый набор страниц с префиксом " + prefix1, "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"); // Первый набор страниц

prefix2 = "prefix2_"; // Префикс ко второму набору страниц
pglist2 = prompt ("Второй набор страниц с префиксом " + prefix2, "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"); // Второй набор страниц

exportPreset = "2540_150_CPL"; // PDF preset

path = app.activeDocument.fullName.path;

/*
path = new Folder("/d/Work/My_Very_Important_Task/Output_PDF/");
    if (!path.exists) {
       path.create();
        }
*/

// Экспорт первого набора

pglist1 = pglist1.split(/,\s*/);
for (i=0; i<pglist1.length; i++)
{
    app.pdfExportPreferences.pageRange = pglist1[i];
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + prefix1 + pglist1[i] + '.pdf'), false, app.pdfExportPresets.item(exportPreset));
}

// Экспорт второго набора

pglist2 = pglist2.split(/,\s*/);
for (i=0; i<pglist2.length; i++)
{
    app.pdfExportPreferences.pageRange = pglist2[i];
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + prefix2 + pglist2[i] + '.pdf'), false, app.pdfExportPresets.item(exportPreset));
}
 
Последнее редактирование:
  • Спасибо
Реакции: sztaishuo, xenOnn и Slx1
В твоем случае лучше воспользоваться модицикацией отличного скрипта от незабвенного Jongware по экспорту диапазонов страниц. Я сделал два набора, их можно сделать хоть пять подряд. Диапазоны страниц можно записывать в скрипт или вставлять их вручную каждый раз при запросе - без разницы. Префиксы поменять на нужные. Можно еще прописать жесткий путь к экспортным файлам, чтобы не засоряли директорию с рабочими файлами (я внутри написал пример, нужно убрать /* и */ и вписать свой путь).

JavaScript:
//DESCRIPTION:Export page ranges
// A Jongware Script 09-Dec-2019

prefix1 = "prefix1_"; // Префикс к первому набору страниц
pglist1 = prompt ("Первый набор страниц с префиксом " + prefix1, "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"); // Первый набор страниц

prefix2 = "prefix2_"; // Префикс ко второму набору страниц
pglist2 = prompt ("Второй набор страниц с префиксом " + prefix2, "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"); // Второй набор страниц

exportPreset = "2540_150_CPL"; // PDF preset

path = app.activeDocument.fullName.path;

/*
path = new Folder("/d/Work/My_Very_Important_Task/Output_PDF/");
    if (!path.exists) {
       path.create();
        }
*/

// Экспорт первого набора

pglist1 = pglist1.split(/,\s*/);
for (i=0; i<pglist1.length; i++)
{
    app.pdfExportPreferences.pageRange = pglist1[i];
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + prefix1 + pglist1[i] + '.pdf'), false, app.pdfExportPresets.item(exportPreset));
}

// Экспорт второго набора

pglist2 = pglist2.split(/,\s*/);
for (i=0; i<pglist2.length; i++)
{
    app.pdfExportPreferences.pageRange = pglist2[i];
    app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + prefix2 + pglist2[i] + '.pdf'), false, app.pdfExportPresets.item(exportPreset));
}
Супер, спасибо!

Как сделать чтобы стр с например первого набора 1-2, 3-4 записывались в один файл?
Сейчас получается 2 файла: 1-2 и 3-4
И можно ли чтобы к исходному имени файла добавлялся не префикс, а суффикс набора в конце имени?

Спасибо!
 
В принципе и запрос на ручной ввод можно отключить)
 
В принципе и запрос на ручной ввод можно отключить)
Тогда строки будут иметь следующий вид:
JavaScript:
pglist1 = "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"; // Первый набор страниц
pglist2 = "10-16, 17-28, 29-34, 50-56, 57-64, 65-73, 85-96"; // Второй набор страниц
В кавычки вставлять номера нужных страниц.
 
prefix1 = "prefix1_"; // Префикс к первому набору страниц
pglist1 = pglist1 = "1-2, 3-4"; // Первый набор страниц

prefix2 = "prefix2_"; // Префикс ко второму набору страниц
pglist2 = "1-2, 5-6"; // Второй набор страниц

1653809043317.png


записывает 4 файла, причем во втором наборе вместо 5-6 экспортятся страницы 2-3 ((
 
Как сделать чтобы стр с например первого набора 1-2, 3-4 записывались в один файл?
И можно ли чтобы к исходному имени файла добавлялся не префикс, а суффикс набора в конце имени?
Так даже проще.
JavaScript:
//DESCRIPTION:Export page ranges
// A Jongware Script 09-Dec-2019

exportPreset = "2540_150_CPL";
path = app.activeDocument.fullName.path;

//Набор файлов 1

pglist1 = "11-20, 31-40";
suffix1 = "_Print1";
app.pdfExportPreferences.pageRange = pglist1;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + pglist1 + suffix1 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

//Набор файлов 2

pglist2 = "21-30, 41-50";
suffix2 = "_Print2";
app.pdfExportPreferences.pageRange = pglist2;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + pglist2 + suffix2 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));
 
Последнее редактирование:
  • Спасибо
Реакции: xenOnn и Slx1
Так даже проще.
JavaScript:
//DESCRIPTION:Export page ranges
// A Jongware Script 09-Dec-2019

exportPreset = "2540_150_CPL";
path = app.activeDocument.fullName.path;

//Набор файлов 1

pglist1 = "11-20, 31-40";
suffix1 = "_Print1";
app.pdfExportPreferences.pageRange = pglist1;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + pglist1 + suffix1 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

//Набор файлов 2

pglist2 = "21-30, 41-50";
suffix2 = "_Print2";
app.pdfExportPreferences.pageRange = pglist2;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + pglist2 + suffix2 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

Супер, спасибо!
Еще бы сделать чтобы вместо номеров страниц было бы имя файла....
имя _файла + suffix2 + ".pdf"
 
Еще бы сделать чтобы вместо номеров страниц было бы имя файла....
JavaScript:
exportPreset = "2540_150_CPL";

var myFile = File(app.activeDocument.fullName);
var myFileName = myFile.name.replace(/.[^.]+$/,'');
File.prototype.fileName = function(){
    return this.name.replace(/.[^.]+$/,'');
}
var name = myFile.fileName();
path = app.activeDocument.fullName.path;

//Набор файлов 1

pglist1 = "11-20, 31-40";
suffix1 = "_Print1";
app.pdfExportPreferences.pageRange = pglist1;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + name + suffix1 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

//Набор файлов 2

pglist2 = "21-30, 41-50";
suffix2 = "_Print2";
app.pdfExportPreferences.pageRange = pglist2;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + name + suffix2 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));
 
  • Спасибо
Реакции: xenOnn и Slx1
JavaScript:
exportPreset = "2540_150_CPL";

var myFile = File(app.activeDocument.fullName);
var myFileName = myFile.name.replace(/.[^.]+$/,'');
File.prototype.fileName = function(){
    return this.name.replace(/.[^.]+$/,'');
}
var name = myFile.fileName();
path = app.activeDocument.fullName.path;

//Набор файлов 1

pglist1 = "11-20, 31-40";
suffix1 = "_Print1";
app.pdfExportPreferences.pageRange = pglist1;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + name + suffix1 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

//Набор файлов 2

pglist2 = "21-30, 41-50";
suffix2 = "_Print2";
app.pdfExportPreferences.pageRange = pglist2;
app.activeDocument.exportFile(ExportFormat.PDF_TYPE, File(path + "/" + name + suffix2 + ".pdf"), false, app.pdfExportPresets.item(exportPreset));

Идеально!
Большое спасибо!
 
А у меня вот что происходит при попытке запуска. В чем может быть дело?

1684847679388.png
 
А у меня вот что происходит при попытке запуска. В чем может быть дело?
В теле скрипта должен быть записан реально существующий PDF-пресет.

var myPDFExportPreset = "2540_150_CPL"; // Название PDF-пресета (PDF preset name)
 
Ага, так заработало, спасибо!