с внешностью.
ользую iTextSharp для рисования графики разметки в документах PDF, используя PdfAnnotation.CreateInk. Я пытаюсь нарисовать прямоугольники, передавая массив из пяти координат. Я знаю, что в iTextSharp есть специальная функция для рисования прямоугольников, но я пытаюсь использовать только один метод для рисования различных линий разметки, которые мне нужны, и кажется, что CeateInk должен это делать.
Проблема в том, что CreateInk рисует прямоугольник с кривыми, а не углами. Я не смог понять, как это изменить.Этот ответ предполагает, что решением может быть создание PdfAppearance; Я еще не выяснил, будет ли это работать. Вот мой код (первый бит преобразует список точек в массив массивов, который требуется для InkList):
public void MarkupInk(List<List<float>> InkList){
float[][] Coords = new float[InkList.Count][];
for (int i = 0; i < InkList.Count; i++) {
float[] thisarr = InkList [i].ToArray ();
Coords[i] = new float[InkList[i].Count];
System.Array.Copy (thisarr, Coords [i], InkList [i].Count);
}
using(MemoryStream ms = new MemoryStream ()){
PdfReader reader = new PdfReader (textmaster.pdfDocArr);
PdfStamper stamper = new PdfStamper (reader, ms);
pagerect = reader.GetPageSize (textmaster.currentfirstpage + 1);
PdfAnnotation an2 = PdfAnnotation.CreateInk (stamper.Writer, pagerect, "", Coords);
an2.Color = strokeColor;
an2.BorderStyle = new PdfBorderDictionary (strokeWeight, PdfBorderDictionary.STYLE_SOLID);
stamper.AddAnnotation (an2, textmaster.currentfirstpage+1);
stamper.Close ();
textmaster.pdfDocArr = ms.ToArray ();
reader.Close ();
}
}
Любые предложения очень ценятся. Спасибо!
РЕДАКТИРОВАТЬ: после кода @ mkl у меня теперь есть код, который создает PDF аннотации с внешними видами. И большинство этих аннотаций правильно отображаются в используемых мной программах просмотра. Но есть одно странное поведение, которое я не смог исправить.
Происходит то, что последняя созданная аннотация не отображается в приложениях для просмотра, пока я не создал другую аннотацию. Поэтому, если я создаю аннотацию A, она становится невидимой, пока я не создаю аннотацию B, в которой точка A появляется, а B - нет. Создание аннотации C приводит к появлению аннотации B и так далее.
Такое поведение сохраняется, даже если я закрываю файл PDF и приложение для просмотра и перезагружаюсь с диска. Таким образом, данные, описывающие последнюю созданную аннотацию, существуют как часть файла pdf, но они не отображаются, пока я не создал новую аннотацию.
Я подозреваю, что в коде, который я использую для создания аннотаций и pdfAppearances, мне все еще чего-то не хватает. Вот код, который создает однострочную аннотацию:
public void WriteLineAnnotation(List<float> polyCoords){
using (MemoryStream ms = new MemoryStream ()) {
PdfReader reader = new PdfReader (textmaster.pdfDocArr);
PdfStamper stamper = new PdfStamper (reader, ms) { AnnotationFlattening = true };
pagerect = reader.GetPageSize (textmaster.currentfirstpage + 1);
//Create the pdfAnnotation polyline
PdfAnnotation polyann = PdfAnnotation.CreatePolygonPolyline (stamper.Writer, pagerect, "", false, new PdfArray (polyCoords.ToArray ()));
polyann.Color = strokeColor;
polyann.BorderStyle = new PdfBorderDictionary (strokeWeight, PdfBorderDictionary.STYLE_SOLID);
polyann.Flags = iTextSharp.text.pdf.PdfAnnotation.FLAGS_PRINT;
//create the PdfAppearance and set attributes
PdfAppearance app = PdfAppearance.CreateAppearance (stamper.Writer, pagerect.Width, pagerect.Height);
app.SetColorStroke (strokeColor);
app.MoveTo (polyCoords [0], polyCoords [1]);
app.LineTo (polyCoords [2], polyCoords [3]);
app.Stroke ();
//set the annotation's appearance, add annotation, clean up
polyann.SetAppearance (PdfName.N, app);
stamper.AddAnnotation (polyann, textmaster.currentfirstpage + 1);
stamper.Close ();
reader.Close ();
//create bytearray from memorystream and send to pdf renderer
textmaster.pdfDocArr = ms.ToArray ();
}
}
[/код]
Есть ли что-то очевидное, чего мне не хватает? Заранее благодарю за любую помощь.