Многостраничный pdf

Статус
Закрыто для дальнейших ответов.

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Пишу скрипт, который открывает многостраничный пдф следующим образом:
1. Открывает 1 страницу pdf
2. Сохраняет в eps.
3. Закрывает pdf.
4. Открывает 2 страницу pdf
5. Сохраняет в eps.
6. Закрывает pdf.
и т.д. до последней страницы
(я в это время спокойно занимаюсь другими делами =) )
Про акробат ничего говорить не надо, потому как охота открывать pdf в иле.

И всё бы клёво, но только вот такая беда:
1.
Код:
fileRef = open(fileRef,DocumentColorSpace.CMYK);
- по идее, открываемая страница pdf, должна автоматом конвертиться в CMYK-пространство, но ничего подобного не происходит. Почему? Намекните,
пожалуйста.

2.
Я так понял, что из скрипта, выбор цветового пространства, в котором откроется документ, возможно произвести только при открытии документа, потом уже шиш. Хотя в самом иле можно даже после открытия документа тупо выбрать CMYK он или RGB. Правильно ли это?

3. Когда открываешь многостраницный pdf, то появляется окно с выбором страницы. Как сделать, чтобы окно не открывалось каждый раз - это я понял, но вот, где ил хранит кол-во страниц открываемого pdf мне не догнать. Help.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Анализируя кол-во камментов, пришел к такому выводу:
- либо нафиг кого эта тема интересует.
- либо никто не понял в чём собственно дело.
- либо очень мало кто пишет скрипты под ил.

Вообщем, грустняк.
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Да пишем, иногда... ;-)

Наверное имелось в виду не open, а app.open? Да? Далее. Метод app.open возвращает вовсе не ссылку на файл (fileRef), а DocumentObject. Ну примерно так:

var FileToOpen = new File("MyMultyPage.pdf");
var SinglePageDoc = app.open(FileToOpen, DocumentColorSpace.CMYK);

Я прям сам вот сейчас не пробовал, но в описании обычным ангельским языком написано:

If you open a pre-Illustrator 9 document that contains both RGB and CMYK colors and documentColorSpace is supplied, all colors are converted to the specified color space. If the parameter is not supplied, Illustrator opens a dialog so the user can choose the color space.

Должно работать... ;-)

AirGraph.
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Я все попробовал, в CS2 работает без вопросов. Строго конвертит все в CMYK.

AirGraph
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

По пункту 2 - наверное на самом деле нельзя поменять цветовое пространство из скрипта, property documentColorSpace объекта Document имеет аттрибут ReadOnly. Ничего удивительного, аналогичная ситуация с объектами типа Brush. Их ни создать из скрипта, ни (что самое удивительное) удалить нельзя. А из панели Brushes - запросто! ;-)

По пункту 3 - количество страниц отрываемого документа PDF известно Illustrator_у поскольку он его читает, но вряд ли где хранит, особливо для использования разнообразными скриптами. ;-) Метод app.open имеет таинственный параметр [options] нигде и никак не описанный, что полностью соответствует стилю Adobe Illustrator Team. ;-) Типа нефига всяким юзерам давать в руки серьезные инструменты управления нашим чудом. До CS3 они и пользовательских диалогов то никаких не делали, опять же - нефига. ;-) Могу посоветовать 2 пути.

1. Поискать их Team_овские скрипты с использованием метода open, возможно они косвенно там рассекретили значение параметра [options] и он именно то, что и надо.

2. Открывать PDF скриптом и разбираться с количеством страниц по Page Tree. Ну тут, конечно, есть где поупражняться в программировании... ;-)

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
Наверное имелось в виду не open, а app.open? Да? Далее. Метод app.open возвращает вовсе не ссылку на файл (fileRef), а DocumentObject.


var FileToOpen = new File("MyMultyPage.pdf");
var SinglePageDoc = app.open(FileToOpen, DocumentColorSpace.CMYK);
AirGraph.

Про то что "возвращает вовсе не ссылку на файл (fileRef)" - это я знаю, просто в запаре описался =) =). А вот за "app.open" СПАСИБО!!! Усё заколбасилось. Без app - открывался док, но не конвертился в CMYK, а так всё заработало! Не понимаю, как это я про app забыл? Видать, пока экспериментировал случайненько стер буковки и вот =). СПАСИБО есчо раз.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

Кстати, вот пример из "Illustrator JavaScript Ref.pdf"

Код:
var pdfOptions = preferences.PDFFileOptions;
pdfOptions.pageToOpen = 2;
pdfOptions.pDFCropToBox = PDFBoxType.PDFBOUNDINGBOX;

var fileRef = File.openDialog( "Select a multi-page PDF file to open.");
if (fileRef != null) { var docRef = [COLOR=Red]open[/COLOR](fileRef, DocumentColorSpace.RGB); }

Никакого "app"! - Видимо это меня и попутало
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
Открывать PDF скриптом и разбираться с количеством страниц по Page Tree.
AirGraph.

А по-подробнее? Чё-то туплю...

Я думал, что ил, по достижению последней страницы pdf и при переходе на следующую (несуществующую) страницу в pdf выдаст ошибку и, типа, это можно как-то контролировать.
Но мой скрипт, успешно открывает все страницы, а затем тупо зацикливается на открытии последней страницы, т.е. открывает ее бесконечное число раз, хотя номер страницы в цикле увеличивается на единицу, т.е. никакого сообщения об ошибке (мол, чего ты делаешь! там нет больше никаких страниц!!!) не появляется. Таким образом, получаем скрипт, который работает, но через ж. =) , а именно, не так как хочется =(
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Что касается открытия последней страницы PDF - это дело ясное. Adobe Illustrator Team (как, впрочем, и я бы) рассуждала, вероятнее всего, примерно так: если тупой юзер задает номер страницы < 1, то загружаем 1 страницу, а если > последней, то последнюю. По одной простой причине - лень! Ну в лом приделывать еще один диалог, который бы сообщал юзеру о недопустимом вводе... ;-)

Что касается открытия PDF скриптом. А че подробнее, открываешь файл скриптом, не Illustrator_ом - app.open, а скриптом - FileToOpen.open, читаешь Trailer, находишь DocumentCatalog в нем есть словарь Pages, который и есть корень Page Tree, бежишь по дереву и считаешь "листья", сиречь страницы. Ну я примерно так это дело помню, а надо, конечно, взять спецификацию PDF и там все в лучшем виде подробненько написано как организован файл PDF.

Да, а можно еще круче! Из скрипта Illustrator открываешь выбранный файл Acrobat_ом, получаешь количество страниц, завершаешь Acrobat и продолжаешь скрипт Illustratora с уже известным количеством страниц PDF файла. Вот это будет круть! ;-)))

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
Да, а можно еще круче! Из скрипта Illustrator открываешь выбранный файл Acrobat_ом, получаешь количество страниц, завершаешь Acrobat и продолжаешь скрипт Illustratora с уже известным количеством страниц PDF файла. Вот это будет круть! ;-)))
AirGraph.

=) =) Жжошь! Тогда из этого же скрипта запустить скрипт в акробате и тупо экспортнуть все страницы в eps, закрыть акробат и уже илом открыть готовые епсы и выдать окно, мол, готово хозяин! =) =) =)

Лана, если долго мучиться чего-нибудь получится.
Вопрос. Не в курсе, в CS3, окошки диалоговые хоть стало возможным делать?
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Так правильно, значит надо изначально писать скрипт для Acrobat! Там функции скрипта, кстати, и в меню можно встроить и цветовое пространство поменять и сохранить каждую страницу как .eps и вообще все сделать там, зачем тебе Illustrator то?

Да, в CS3 в Illustrator_e сделаны пользовательские диалоги, причем по-человечески, со всевозможными CallBack_ами и т.п. Мало того, они стали универсальными внутри CS3 и я в своих скриптах написал в одном месте ресурсы, которые использую в диалогах скриптов Photoshop, Illustrator, InDesign, Bridge. Все стало по уму, не надо для скриптов PS делать диалоги так, для скриптов ID - по-другому, а для скриптов IL - вообще никак... ;-)

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
Да, в CS3 в Illustrator_e сделаны пользовательские диалоги, причем по-человечески, со всевозможными CallBack_ами и т.п.
AirGraph.

Блин, нада обновлять винду =) =). Мне CS3 не поставить - реестр так засорен, что просто кариес! Но ничего, скоро и до него доберусь =) =)

AirGraph сказал(а):
... и вообще все сделать там, зачем тебе Illustrator то?
AirGraph.

Надо же как-то тренироваться скрипты писать, вот поэтому... Да, и потом, всё равно этот пдф мне потом поправлять в иле нада. Просто в иле как-то быстрее (ИМХО) пдф ковырять, чем в акробате питстопом и т.п. штучками. Хотя питстоп - однозначно рулит.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

Кстати, когда открываешь пдф не скриптом и указываешь номер страницы, которой не существует, - ил выдает окошко об ошибке.

А вот когда открываешь скриптом, то такое окошко никак не отловить. =(

Я так понимаю, это из-за этой строчки в скрипте: app.userInteractionLevel=UserInteractionLevel.DONTDISPLAYALERTS.

А это, как раз, довольно-таки важная строчечка, без неё никак =(.

Получается замкнутый треугольник.

А иначе бы ошибочку легко можно было бы отловить конструкцией try{};
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

А как ты умудрился в скрипте указать страницу PDF, которую надо открывать, без вывода пользовательского диалога про номер страницы?

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
А как ты умудрился в скрипте указать страницу PDF, которую надо открывать, без вывода пользовательского диалога про номер страницы?

AirGraph.
Приветствую тебя!
Эх... придеться скрипт показать
no-1.gif
... На самом деле, ничего чудесного, все в руководстве описано.
Кстати, только что вернулся с форума на adobe.com - там тоже чуваки столкнулись с такой же ситуацией при открытии пдф. Так вот.
Один, тупо советует брать количество страниц из самого кода пдф (правда чувак не учел, что у пдф разной спецификации (хотя я тоже в этом ламер последний), соответственно и количество страниц в коде храниться в разных местах (я уже убедился на примере) То есть. это надо будет писать уже не скрипт, а нормальную программулину, а это уже не так модно.
ddude.gif

А второй, советует создать некую checksum и сравнивать ее с каждой страницей. (Правда у него другая ситуация, у него при вводе номера несуществующей страницы, открывается первая страница, а не последняя как у меня (ну, почему не у меня, я б уже давно скрипт дописал!!! =) ) и потом, я не совсем понял, какая checksum, например, у двух одинаковых по количеству и качеству информации страниц пдф)?
Фу-х-х... Короче, прям беда какая-то... Долбанные авторские права... Зачем давать юзерам в руки руководство по скриптингу, если хрен чего нормального наскриптить можно...
dontknow-1.gif


Ладно, вот скрипт, с light камментами... Предупреждаю: открывает многостраничный пдф, сохраняет каждую страницу в eps, но на последней странице зацикливается...
Код:
/* данная строка отключает вывод пользовательского диалога про номер страницы */
app.userInteractionLevel=UserInteractionLevel.DONTDISPLAYALERTS;
Opt = preferences.PDFFileOptions;
Opt.pDFCropToBox = PDFBoxType.PDFBOUNDINGBOX;

fileRef = File.openDialog("Select a multi-page PDF file to open");
if (fileRef != null)
  { 
   stput=fileRef.fsName;                           
   dd = stput.length;
   for (i = dd ; stput[i]!='\\' ; i-- ) {}
   newput=stput.substring(0, i+1);            /* путь, куда сохранять */

   pp=1;                                      /* номер страницы, которую надо открыть */

 try
 {
//------------------------------------------------------------------------------
   while (true) 
   {
    Opt.pageToOpen = pp; /* здесь, по-идее, должна возникать ошибка, при открытии несуществующей страницы*/
    docRef = app.open(fileRef,DocumentColorSpace.CMYK); /* чтобы файлы назывались не 1.eps, а 01.eps */
    if (pp > 9) {newpute=newput+pp+".eps";}         
     else
       {newpute=newput+"0"+pp+".eps";} 
    newFile = new File(newpute);
    saveOpts = new EPSSaveOptions();
    saveOpts.cmykPostScript = true;
    saveOpts.embedAllFonts = true;
    saveOpts.includeDocumentThumbnails = true;
    saveOpts.compatibility = Compatibility.ILLUSTRATOR11;
    saveOpts.preview = EPSPreview.TRANSPARENTCOLORTIFF;
    docRef.saveAs( newFile, saveOpts );
    docRef.close(); /*можно закамментить, чтобы странички не закрывались */
    pp++;
   }
//------------------------------------------------------------------------------
 }
 catch(err)
  {
   alert("здесь должно быть окончание работы скрипта, в связи с открытием несуществующей страницы. ");
  }
/* данная строка включает вывод пользовательского диалога про номер страницы */
app.userInteractionLevel=UserInteractionLevel.DISPLAYALERTS;
}
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Да, про pageToOpen я как-то и призабыл... ;-) Все проверил у себя, в CS2 открывает последнюю страницу при любом номере страницы, большем чем номер последней. Генерит ошибку если задать номер страницы 0 или меньше. Думаю, что на уровне скрипта IL решения нет. ;-(

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

блин.

Меня-то лично, пока и так устраивает. То есть с некоторыми поправками. У меня скрипт, вначале, спрашивает кол-во страниц открываемого пдф и далее работает нормально. Но, конечно же, хочется сделать скриптец универсальным, и похоже, что без сторонних приблуд не обойтись, а жаль. Ладно если чего придумаю, накалякаю...
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Вот тут http://www.prodtp.ru/index.php?showtopic=17567 народ совершенно справедливо отметил, что все это можно сделать постраничным экспортом EPS из акробата без всяких скриптов.

AirGraph.
 

qsedftghk

фея
Топикстартер
15 лет на форуме
Сообщения
2 032
Реакции
1 199
Ответ: Многостраничный pdf

AirGraph сказал(а):
Вот тут http://www.prodtp.ru/index.php?showtopic=17567 народ совершенно справедливо отметил, что все это можно сделать постраничным экспортом EPS из акробата без всяких скриптов.

AirGraph.
Там же, некто "banIDit" написал то. что я щас здесь напишу:

Мы легких путей не ищем.
trayning_cool-1.gif


Acrobat - это скучно, потому как понятно. Хочется, чтоб это мог делать ил.
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Многостраничный pdf

Ну если так, могу посоветовать следующее. Возьми мои скрипты (Jungle Software), в файле JS_CreativeSuiteLibrary.jsx ты найдешь функции работы с PDF, типа: JS_GetPDFTrailerCS, JS_GetPDFTrailerInfoCS. Из трейлера тебе надо не Info, а Document Catalog (по аналогии можно сделать быстро), который содержит PageTree. Ну а получив PageTree ты можешь посчитать количество листьев на нем ;-). Да, еще тебе понадобится документ по имени: PDFReference14.pdf - это спецификация PDF.

Удачи!

AirGraph.
 
Статус
Закрыто для дальнейших ответов.