Я пытаюсь добавить артефакт холста к каждому объекту пути, у которого его еще нет в существующем pdf. Единственный способ найти объект PathRenderInfo
был с этим классом IEventListener
.
Однако, когда я пытаюсь добавить свой CanvasArtifact
, выдается исключение.
Я видел некоторые другие вопросы, подобные этому, которые в основном говорят, что я должен переписать PDF: Управление путями, цвет и т. Д. c. в iText
Моя проблема с этим ответом состоит в том, что я не знаю, как это относится к объекту пути.
Есть ли другой способ (более удобный для записи) обнаружения, если PdfObject
(или что-нибудь) - это путь? Или, в качестве альтернативы, изменив PathRenderInfo
?
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Pdf.Canvas.Parser.Listener;
using System.Collections.Generic;
using System.Linq;
using iText.Kernel.Pdf.Canvas;
using iText.Kernel.Pdf;
public class PathWrapperEventListener : IEventListener
{
public void EventOccurred(IEventData data, EventType type)
{
var path = data as PathRenderInfo;
if (path != null)
{
var tags = path.GetCanvasTagHierarchy();
if (!tags.Any(x=>x.GetRole().ToString().ToLower().Contains("artifact")))
{
//this throw a System.NotSupportedException (Collection is read-only)
tags.Add(new CanvasArtifact());
}
}
}
public ICollection<EventType> GetSupportedEvents()
{
return new List<EventType>() { EventType.RENDER_PATH };
}
}
public class Example
{
public void Transform(string path)
{
var document = new PdfDocument(new PdfReader(path), new PdfWriter(path + ".temp"));
var processor = new PdfCanvasProcessor(new PathWrapperEventListener());
processor.ProcessPageContent(document.GetFirstPage());
}
}