Как в пдф высветлить/затемнить все фото сразу?

  • Автор темы Автор темы Dorm
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Dorm

Топикстартер
10 лет на форуме
Сообщения
574
Реакции
1
Добрый день.

Собственно вопрос. Есть пдфы, которые необходимо сделать светлее (фото).

Спасибо
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

Экшенами в Фотошопе.
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

В предложенных темах обсуждается "перелив" краски. Мне необходимо высветлить...
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

В первой обсуждается "убледнить картинки"
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

А давайте сделаем ЭТО каким-нибудь новым прикольным способом, который мы еще не пробовали! По ссылкам выше мне все уже надоели : -(.

Допустим, "фото" у нас в модели CMYK.
Сначала мы удалим компрессию из нашего pdf, примерно так:
Код:
gswin32c -- pdfinflt.ps in.pdf out.pdf
У кого нету pdfinflt.ps, не расстраивайтесь! Можете скачать сорс гостскрипта, он там в папке toolbin. Заодно раскомментируйте в нем строки, отвечающие за декомпрессию jpeg.
Далее обработаем разжатый pdf как просто raw текст, вот так:
Код:
perl test.pl out.pdf
где скрипт будет такой:
Код:
my $c = 0;
sub bar {
foreach(@_) {$_ >>= 1};
return @_
}
sub foo {
print "Now processing image number ", ++ $c, "\n";
my $s = shift;
my $_ = '';
my $i = 0;
while (1) {
my @a = unpack("C*", substr($s, $i, 1000000));
$_ .= pack("C*", bar @a);
if ($#a < 999999) {return $_}
$i += 1000000
}
};
open(F, "+<", $ARGV[0]);
binmode(F);
local $/ = undef;
my $_ = <F>;
s/(\/Image.+?\/DeviceCMYK.+?stream\n)(.+?)(\nendstream)/$1.foo($2).$3/ges;
seek(F, 0, 0);
print(F $_);
Далее не мешает сжать результат, но уж это вы сами как-нибудь (pdftk "compress", например).
Я бы организовал вам все шаги в приятный скрипт или батник, в котором выход предыдущего шага идет на вход следующего, но чорт его знает, видимо pdfinflt.ps такая цаца, что хочет RA на выходе (лень копаться), так что получилось по отдельным шагам : -(.
Да, и ТС был несколько неконкретен, надо ли ему "убледнить" или "выбледнить". А это, сами понимаете, важно. Я предположил, что "убледнить", и просто поделил все краски пополам. Кому надо, отредактируйте блок в процедуре bar.
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

Думаю, regexp мы заменим на такой:
Код:
s/(<<.*?(?:(?:\/Subtype\ ??\/Image.+?\/ColorSpace\ ??\/DeviceCMYK)|(?:\/ColorSpace\ ??\/DeviceCMYK.+?\/Subtype\ ??\/Image)).+?stream\n)(.+?)(\nendstream)/$1.foo($2).$3/ges;

Не по теме:
Думаю также, читателям будет интересно узнать, что было у меня 2 файла формата А0, на 200 и 300 Мб. И компьютер с, увы, 2 Гб ОЗУ. Так вот, в WinXP обработка большего из них приводила к Out of Memory (шутка ли, такие объемы для regexp engine), при этом Perl отъедал не более 1,2 Гб, и в PF использовались 3 Гб. Тогда как в Linux файл обрабатывался успешно, вышеназванные величины составляли 1,9 и менее 0,1. И не менее успешно, если открыть FF c кучей закладок (отъедает 400 Мб ОЗУ - ??), VLC с кино и некстати внезапно возникший update manager. :-)
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?


Не по теме:
с тем же успехом можно было писать на арабском. Я в нем тоже ничего не понимаю...
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

Сочувствие мое безгранично. Но, я же не живодер. Переделал под чисто виндовый JS.
Код:
fso = new ActiveXObject("Scripting.FileSystemObject");
var s = fso.OpenTextFile("C:\\in.pdf", 1, false, -1).Read(100000000); // no ReadAll!
var n = 0;
fso.CreateTextFile("C:\\out.pdf", true, true).Write(s.replace(
/(<<(?:.|\n)*?(?:(?:\/Subtype\ ??\/Image(?:.|\n)+?\/ColorSpace\ ??\/DeviceCMYK)|(?:\/ColorSpace\ ??\/DeviceCMYK(?:.|\n)+?\/Subtype\ ??\/Image))(?:.|\n)+?stream\n)((?:.|\n)+?)(\nendstream)/g, 
function($0,$1,$2,$3,$4,$5) { 
	++n;
	var $22 = "";
	for (var i = 0; i < $2.length; i ++) { $22 += String.fromCharCode($2.charCodeAt(i)/2)};
	return($1+$22+$3);
} ));
WScript.echo("Number of images processed: " + n);
Файл д.б. несжатым, это ясно (как описано выше, или через pdftk, или при генерации дистиллером). Но в случае JS есть еще одна проблема, решение которой я дорасскажу завтра :-)
 
Ответ: Как в пдф высветлить/затемнить все фото сразу?

Хотел, было, добубнить про UCS-2 как внутренний формат текста jscript, и как выкручиваться, если надо считать (и, не менее важно, записать) произвольный файл в, скажем так, CP-28591, чтобы воспользоваться текстовым енджином jscript (собственно, никому это вроде не надо...). Как увидел прикольную тему, через забор у соседей: http://www.prodtp.ru/index.php?showtopic=25910

Вот и ответ на вопрос из (виртульного) зала: "Профессор, а вам не кажется, что вы занимаетесь никому не нужной муйней? У нас есть питстоп! И тулбокс!" Отвечаю. Если взять файл с Гансом и удалить из него компрессию так:
Код:
gswin32c -- pdfinflt.ps gans.pdf out.pdf
или так:
Код:
pdftk gans.pdf output out.pdf uncompress
и обработать результат так:
Код:
sub bar {
$_ = shift;
s/((?:\(.*?\)\-\d\d\d\.?\d?)+\(.*?\))/{$_ = $1; $n = length; s! !!g; $_ .' 'x($n - length)}/gse;
s/(?: (\)\d\d\d\.?\d?))/{')'.' 'x length $1}/gse;
return $_
}
sub foo {
$_ = shift;
s/(?<=\n\[)(.*?)(?=\]TJ\n)/bar $1/gse;
return $_
}
open(F, "+<", $ARGV[0]);
binmode(F);
my $_ = do {local $/ = undef; <F>};
s/(?<=stream)(.*?)(?=endstream)/foo $1/gse;
seek(F, 0, 0);
print(F $_);
то мы получим pdf-файл, из которого сказка вынимается без проблем, например через буфер так:
gans.png

Мораль в том, что, кому надо, найдет в этой теме прикольный (и мощный), и неописанный в этих ваших гуглях метод (я бы сказал, аутентичный и бонафайдный) для решения (не)простых задач :-)
 
Статус
Закрыто для дальнейших ответов.