Добавление метаданных в файл EPS с использованием Java - PullRequest
6 голосов
/ 11 июня 2019

Я сейчас читаю и пишу файл .EPS для манипулирования / добавления метаданных (Ключевые слова и теги) в файл.

PS: кодировка файла - Windows-1251 или Cp1251 -Russian-

Я читаю EPS-файл так: (String lines; - глобальная переменная)

try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "Cp1251"))) {
    String line;
    while((line = br.readLine()) != null) {
        if(line.contains("</xmpTPg:SwatchGroups>")) {
            lines.add(line);
            lines.add(descriptionKwrds);
        }
        else
            lines.add(line);
        System.out.println(line);
    }
} catch (FileNotFoundException ex) {
    Logger.getLogger(script.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedEncodingException ex) {
    Logger.getLogger(script.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(script.class.getName()).log(Level.SEVERE, null, ex);
}

Выше descriptionKwrds - метаданные (теги), которыми я хочу манипулировать с файлом EPS, например:

String descriptionKwrds = "<photoshop:AuthorsPosition>icon vector illustration symbol bubble sign</photoshop:AuthorsPosition>";

И записываем файл EPS так:

try {
    try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file.getName()), "Cp1251"))) {
        for(String s : lines)
            out.write(s + "\n");
        out.flush();
    }
} catch (FileNotFoundException ex) {
    Logger.getLogger(script.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(script.class.getName()).log(Level.SEVERE, null, ex);
}

Файл читает и пишет правильно, но когда я открываю вновь сгенерированный файл. Там написано, что файл поврежден.

Файлы до и после манипуляции: file1 и file2 соответственно. И используя ESP Converter , чтобы открывать файлы EPS онлайн.

Как мне этого добиться? Любой может помочь мне. Спасибо!

1 Ответ

9 голосов
/ 11 июня 2019

ОК, ваша проблема в том, что ваш файл EPS является «EPS с предварительным просмотром».В дополнение к реальной программе PostScript, существует растровое изображение, которое любое приложение, помещающее EPS на страницу, может использовать для отображения «предварительного просмотра» пользователю.

Файл имеет двоичный файл в начале, как это:

C5 D0 D3 C6 20 00 00 00 DC 49 05 00 00 00 00 00
00 00 00 00 FC 49 05 00 AE AC 4D 00 FF FF 00 00

Если вы прочитаете Техническую ноту Adobe 5002 "Спецификация формата инкапсулированного файла PostScript" и посмотрите на страницу 23, вы увидите, что она определяет заголовок двоичного файла DOS EPS, который начинаетсяhex C5D0D3C6, так же как и ваш файл.Таким образом, вы можете видеть, что ваш файл имеет заголовок DOS, который определяет предварительный просмотр.

Теперь байсы 4-7 определяют начало PostScript, а байты 8-11 определяют длину секции PostScript.12-15 - начало метафайла (0 для вашего случая, поэтому его нет), а 16-19 - длина байта, снова 0. Затем в байтах 20-23 начинается начало представления TIFF, а байты 24-27 длина TIFF.Наконец, есть контрольная сумма заголовка в оставшихся двух байтах;здесь у нас есть 0xFFFF, что означает «игнорировать контрольную сумму».В этом случае заголовок был дополнен двумя байтами (0x00), чтобы получить всего 32 байта, поэтому смещение секции PostScript составляет 0x20.

Ваша проблема в том, что вы добавили контент враздел PostScript (следовательно, его размер увеличивается), но , а не обновил заголовок файла, чтобы он содержал новую длину раздела PostScript или новую позицию предварительного просмотра, что любой потребитель EPS не сможетраздеть превью.Фактически вы повредили программу PostScript.

Необходимо либо обновить заголовок файла, либо удалить растровое изображение предварительного просмотра, удалив заголовок файла и обрезав растровое изображение до конца, чтобы получить «чистый» файл EPS (т.е. один без предварительного просмотра).

Я почти забыл добавить некоторые разъяснения;Вы не обновляете «ключевые слова» или «теги» в файле EPS.Вы добавляете программный код на языке PostScript, который выполняет операторы PostScript.В этом случае при запуске через интерпретатор PostScript типа «Disitller» (то есть тот, который генерирует PDF в качестве вывода), файл PDF будет иметь свои метаданные , измененные.Вы вообще не изменяете метаданные EPS (это делается с помощью комментариев в заголовке).Для потребителя PostScript, который не является Distiller, сделанные вами изменения не будут иметь никакого эффекта вообще.

[Update]

Изменение заголовка 'file2' (то есть файла, который имеетдобавил pdfmarks) вот так:

C5 D0 D3 C6 20 00 00 00 32 26 05 00 00 00 00 00
00 00 00 00 52 26 05 00 AE AC 4D 00 FF FF 00 00

Результат в рабочем файле.Кажется, что изменения на самом деле сделали файл короче.Исходный размер раздела PostScript был 0x0549DC, а смещение растрового изображения TIFF было 0x0549FC.После модификации размер секции PostScript составляет 0x052632, а смещение растрового изображения TIFF - 0x052652.

У меня есть подозрение, что это происходит из-за перевода CR / LF, и если это так, это также испортилоРастровое изображение TIFF, хранящееся в конце файла (я заметил, что двоичный файл в конце действительно выглядит другим).Вам нужно прочитать и записать этот файл как двоичный файл, а не как текст.

...