Какой подход лучше всего подходит для создания PostScript на C#?

Мне нужно создать вывод PostScript из нашей системы. Наша система создает сильно отформатированные документы в различных форматах, и мне нужно добавить .ps в качестве дополнительного формата.

Одна странность: весь наш код написан на Java, и мы используем IKVM для .net-версии нашей библиотеки. У нас есть около 5% кода, написанного на C#, а остальное — это Java, преобразованная с помощью IKVM.

Я создаю файлы .ps на стороне Java, используя библиотеку, которая позволяет мне писать в объект Graphics2D, который она предоставляет. К сожалению, в .NET (через IKVM) это ужасно медленно.

Итак, чтобы решить эту проблему, я думаю:

  1. Go into the IKVM code and see if I can speed this up. It makes no sense that it is so slow.
    • Advantage, if it works it’s probably the fastest resolution. And now future Graphics2D libraries can be used.
    • Недостаток, если я не могу, я теряю время. Кроме того, в будущем у нас будет собственный филиал IKVM.
  2. Investigate oreasoft – if that works, use that with a PostScriptBuilder
    • Advantage, this should be pretty fast and fully & correctly handle .ps.
    • Недостаток, это решает проблему только для .ps. Также 5 тысяч в год за формат, в котором мы можем не получить много продаж.
    • В этом случае я бы сделал GraphicsBuilder для вывода растровых изображений и .wmf — это было бы быстро и легко.
  3. Create a .net Graphics object based library for .ps. And then just like the Graphics2DOutputBuilder in Java, create a GraphicsOutputBuilder in .net
    • Advantage, this is the cleanest correct-est way to do this. And we can easily add bitmap & .emf output this way (they have a Graphic object way to write to them).
    • Недостатком является то, что это существенная работа, и у нас могут возникнуть небольшие проблемы, поскольку мы изучаем все детали PostScript.
  4. Rewrite the Apache xml-graphics library to use .net calls instead of Java calls for the code in it.
    • Advantage, this is probably a bit less work than the Graphics approach.
    • Недостаток в том, что когда мы закончим, у нас будет это, но любые будущие форматы, такие как SVG, нам также придется полностью переписывать.

Я ценю любые отзывы о решении этой проблемы.


person David Thielen    schedule 31.05.2018    source источник
comment
Вариант пятый: использовать IPC для передачи данных из .NET в Java и выполнять рендеринг .ps в Java?   -  person glenebob    schedule 31.05.2018
comment
@glenebob - я почти уверен, что мы получили бы отпор от некоторых, если бы сказали, что на их серверах должна быть Java. И если бы мы пошли по этому пути, может быть, JNI был бы лучше?   -  person David Thielen    schedule 31.05.2018


Ответы (1)


Мы создадим ветку IKVM (предварительное название Windward MVKI) и выложим ее на NuGet.

Проблема, которую мы обнаружили, заключается в convert.cs — C2J.ConvertShape(). Он обращается к path.PathPoints[i]. Проблема в том, что при каждом вызове он создает массив точек. Перемещение вызова PathPoints за пределы цикла for и последующий доступ к копии массива, созданного один раз для доступа, ускоряет его — намного.

Другими словами:

for (int i = 0; i < points.Length; i++) {
PointF point = path.PathPoints[i];

Изменяется на:

PointF[] points = path.PathPoints;
for (int i = 0; i < points.Length; i++) {
PointF point = points[i];
person David Thielen    schedule 31.05.2018