Как добавить изображение в канал плашечного цвета для документа PDF с помощью ABCpdf? - PullRequest
2 голосов
/ 11 октября 2019

При программном использовании ABCpdf я обнаружил необходимость добавить новое изображение в определенный канал пользовательских цветов (известный как плашечные цвета) в файле PDF. Обычно эти типы каналов используются в полиграфической промышленности для добавления специальных цветов, таких как золото, серебро и т. Д. На печатный материал, и дают указание печатной машине использовать специальные чернила во время процесса. Каждый канал плашечных цветов может содержать только 1 цвет (с различной интенсивностью в зависимости от их альфа-значения).

Проблема заключается в том, чтобы выяснить, как это легко сделать с помощью ABCpdf. Хотя в документации есть пример кода для этого с использованием функции AddColorSpaceSpot в сочетании с функцией AddText, нет указаний на то, как этого добиться, используя изображение. Любая попытка заменить AddText на AddImage бесполезна, поскольку она добавляет изображение только как обычный объект RGB или CMYK.

Пример кода из документации гласит:

Doc theDoc = new Doc();
theDoc.Rect.Inset(20, 20);
theDoc.FontSize = 300;
theDoc.ColorSpace = theDoc.AddColorSpaceSpot("GOLD", "0 0 100 0");
for (int i = 1; i <= 10; i++) {
  theDoc.Color.Gray = 255 / i;
  theDoc.AddText(theDoc.Color.Gray.ToString());
  theDoc.Rect.Move(25, -50);
}
theDoc.Save(Server.MapPath("docaddcolorspacespot.pdf"));
theDoc.Clear();

На основании вышеизложенногокод Я попробовал следующее в консольном приложении:

Doc theDoc = new Doc();
theDoc.Rect.Inset(10, 10);
theDoc.ColorSpace = theDoc.AddColorSpaceSpot("Gold", "0 0 100 0");
theDoc.FontSize = 300;
theDoc.Color.Gray = 255;
theDoc.AddText("My Text");
theDoc.Save($"output/spot_test_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.pdf");
theDoc.Clear();

До сих пор все работало хорошо, текст «My Text» присутствует в выходном файле PDF в правильном канале «Gold», который был добавлен.

Поэтому я заменяю строку theDoc.AddText("My Text"); на theDoc.AddImage("images/gradient_alpha.png")', ожидая, что она добавит это изображение в текущее цветовое пространство, которое я создал, но это не сработало.

Создание нового вручнуюцветовое пространство, объект изображения и объект растрового изображения также не работали:

Doc theDoc = new Doc();

var cs = new ColorSpace(theDoc.ObjectSoup, ColorSpaceType.Separation);
cs.Doc.Color.String = "0 0 100 0";
cs.Doc.Color.Name = "Gold";
theDoc.ColorSpace = cs.ID;

var image = new XImage();
image.SetFile("images/gradient_alpha.png");
PixMap px = PixMap.FromXImage(theDoc.ObjectSoup, image);
px.Recolor(cs);

theDoc.AddImage(px.GetBitmap());

Итак, как правильно добавить изображение в канал плашечного цвета? Прочитайте ответ ниже, чтобы узнать!

1 Ответ

2 голосов
/ 11 октября 2019

Для этого вам необходимо добавить изображение в качестве объекта в документ через AddImageObject и извлечь его в виде PixMap из контейнера ObjectSoup документа и применить Recolor кPixMap с целевым цветовым пространством.

Вот последний код, который мне удалось успешно использовать:

Doc theDoc = new Doc();
theDoc.ColorSpace = theDoc.AddColorSpaceSpot("Gold", "0 0 100 0");
ColorSpace goldSpotColor = (ColorSpace)theDoc.ObjectSoup[theDoc.ColorSpace];

XImage image = XImage.FromFile("images/gradient_alpha.png", new XReadOptions());

int theID = theDoc.AddImageObject(image, true);
int imageID = theDoc.GetInfoInt(theID, "XObject");
PixMap thePM = (PixMap)theDoc.ObjectSoup[imageID];

thePM.Recolor(goldSpotColor);

theDoc.Save($"output/spot_test_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.pdf");
theDoc.Clear();

На первый взгляд кажется слишком много шагов для достижения того, чего мы хотим, но ABCpdf - это малобиблиотека PDF уровня манипулирования, которая является очень мощной. Документация обширна, но не всегда явна, поэтому ожидается много чтения и экспериментов.

...