Библиотека .NET для набора документов (PDF или аналогичный)?

РЕДАКТИРОВАТЬ: Лучшее объяснение: Прежде чем установить вознаграждение за этот вопрос, я хочу яснее указать, что мне нужно:

Мне нужна библиотека .NET для создания документов для печати. Пользователи должны иметь возможность распечатать точно такой же документ, который они видят, либо с помощью моего приложения, либо с помощью внешнего инструмента (например, Adobe Acrobat Reader). Это не обязательно должна быть библиотека для создания PDF-документов, подойдет любой формат документа, удовлетворяющий вышеуказанному условию.

Мне нужна библиотека для поддержки следующих сценариев:

Сценарий 1:

  1. Я создаю текст в некотором шрифте и цвете.
  2. Я спрашиваю у библиотеки ширину, если этот текст напечатан.
  3. Я вычисляю позицию (координаты [X, Y] на странице) этого текста на основе информации из 2. и имею библиотеку для печати в этой позиции на странице.

Сценарий 2:

  1. Я создаю текст с некоторыми его частями в надстрочном индексе. Все части текста (обычный и надстрочный) набраны одинаковым (но переменным) шрифтом.
  2. Спрашиваю у библиотеки, какой ширины будет этот текст при печати. Я получаю правильный ответ, который также учитывает kerning между обычным текстом и надстрочным индексом.
  3. Я вычисляю положение (координаты [X, Y]) на странице, где этот текст должен быть напечатан (используя его ширину из шага 2). Я позволил библиотеке напечатать его в этой позиции. Напечатанный на странице, он имеет именно ту ширину, которую вернула библиотека на предыдущем шаге.

Примечание для второго сценария: у меня есть текст с некоторыми частями в надстрочном индексе — пример AAA{v-superscript text}BBB (где текст в {} фигурных скобках является надстрочным индексом). Библиотека должна иметь возможность печатать этот текст, используя правильный кернинг. Без правого кернинга между последним A и первым надстрочным индексом v будет такой же разрыв, как и между последним надстрочным индексом t и первым B. Для пользователя это будет выглядеть так, будто между A и надстрочным индексом v есть пробел, но после последней надстрочной буквы пробела нет. Так текст будет выглядеть некрасиво. Если библиотека должна обрабатывать это правильно, у нее будет метод для печати всего текста AAA{v-superscript text}BBB сразу с указанием того, что часть его находится в надстрочном индексе. Тогда он будет использовать правильный кернинг между обычным текстом и надстрочным индексом.

Сценарий 3:

  1. Я хочу напечатать изображение, состоящее из линий, кругов, закрашенных кругов, букв и кривых Безье в точной точке на странице. Мне нужно указать ширину линий и кругов. Все формы должны быть напечатаны с точностью до пикселя.

Библиотека должна быть бесплатной, а не GPL (LGPL в порядке). Есть ли что-то, что позволяет мне делать то, что мне нужно? Можно ли это сделать с помощью iTextSharp (версия 4.1.6, то есть LGPL, а не AGPL)? Или, возможно, с фиксированным документом? Спасибо за любые предложения.


Исходный вопрос:

Мне нужно набрать сложные документы в приложении .NET (C#) для пользователя. Основное использование этих документов будет для печати.

Документы будут содержать текст и простую сгенерированную графику. Компоновка текста и графики будет сложной и должна быть вычислена (другими словами, положение текста в документе должно контролироваться моим кодом, это не будет сделано автоматически выбранной библиотекой).

Вот мои требования к API:

  1. функция, которая возвращает точную ширину для данной строки и заданного шрифта, в котором должен отображаться текст
  2. возможность позиционировать текст в точное положение на странице
  3. иметь текст с некоторой его частью в суперсценарии
  4. функция для получения точной ширины некоторого текста, часть которого находится в надстрочном индексе
  5. возможность добавлять изображения или, что еще лучше, рисовать простую графику (линия заданной толщины, закрашенный круг заданного радиуса/диаметра)

Это не обязательно должна быть библиотека для создания PDF-документов — подойдет любой другой формат документа «что видишь, то и напечатаешь». Если есть компонент WPF, который может отображать такие документы, это преимущество. Я знаю, что существует iTextSharp, но выполнить 4. требование с помощью iTextSharp непросто. Конечно, некоторая библиотека для создания PDF-файлов, которая удовлетворяет вышеуказанным требованиям, также будет отличным решением.

Спасибо за ЛЮБЫЕ предложения, я также рад предоставить подробную информацию или более четкое объяснение.


person Rasto    schedule 12.04.2011    source источник
comment
Вы смотрели на XPS/XpsDocumentWriter/etc. пока что?   -  person Logan Capaldo    schedule 12.04.2011
comment
@Logan Capaldo: это имя кажется мне знакомым ... Если это тот формат, который имеет встроенный элемент управления WPF для его отображения, то я просматривал его некоторое время назад. Но я не понял, есть ли простой способ генерировать такие документы в WPF. У меня есть вопрос, на который нет ответов: stackoverflow.com /questions/4634445/how-to-work-with-fixedpage .   -  person Rasto    schedule 12.04.2011
comment
@Logan Capaldo: Но документ XPS не исправлен, верно? Таким образом, он не отображает точно такой же макет, как будет напечатан?   -  person Rasto    schedule 12.04.2011
comment
@drasto: В Википедии говорится, что XPS, как и формат PDF от Adobe Systems, представляет собой формат документа с фиксированным макетом, предназначенный для сохранения точности документа и обеспечивающий внешний вид документа, не зависящий от устройства. Похоже на то, что вы просили.   -  person R. Martinho Fernandes    schedule 12.04.2011
comment
@Martinho Fernandes: да, похоже. Просто не знаю, предлагает ли он также API для создания документов, который позволяет мне делать все, что описано в моем вопросе...   -  person Rasto    schedule 12.04.2011
comment
Я немного погуглил, и кажется, что нет учебника или какого-либо ресурса о том, как создавать документы. На SO есть несколько ответов, которые показывают, как создавать документы XPS из некоторых FixedPage, но я до сих пор не знаю, как создать FixedPage с некоторым содержимым в .NET. Мой вопрос stackoverflow.com/questions/4634445/how-to -work-with-fixedpage все еще остается без ответа.   -  person Rasto    schedule 12.04.2011
comment
Редактирую мой ответ снова.   -  person Mark Storer    schedule 22.04.2011


Ответы (7)


Вы можете просмотреть библиотеку Docotic.Pdf (отказ от ответственности: я работаю в Bit Miracle). Он имеет удобный API и хороший набор образцов, которые вы можете просматривать онлайн или запускать в приложении для просмотра образцов.

Также он удовлетворяет вашим требованиям:

  • функция, которая возвращает точную ширину для данной строки и заданного шрифта, в котором должен отображаться текст

Для этого можно использовать метод PdfCanvas.MeasureText().

  • возможность позиционировать текст в точное положение на странице

Существует множество перегрузок, позволяющих отображать текст в произвольном месте или области.
http://bitmiracle.com/pdf-library/help/pdfcanvas.drawstring.aspx
http://bitmiracle.com/pdf-library/help/pdfcanvas.drawtext.aspx

  • иметь текст с некоторой его частью в суперсценарии

Свойство PdfCanvas.TextRise позволяет отображать надстрочный текст. Вы можете использовать его в сочетании со свойством PdfCanvas.FontSize для управления размером надстрочного текста. Образец: http://bitmiracle.com/pdf-library/help/text-rise.aspx

  • функция для получения точной ширины некоторого текста, часть которого находится в надстрочном индексе

Если вы будете использовать другой шрифт или размер шрифта для надстрочного текста, прямой вызов метода PdfCanvas.MeasureText() приведет к неправильным результатам.

Есть обходные пути:

- измерьте каждую часть строки, нарисованной разными шрифтами, отдельно, а затем просуммируйте все значения ширины.

- если вы хотите получить ширину нарисованного текста, вы можете просто вычесть начальную позицию текста из конечной позиции текста после рисования.

  • возможность добавлять изображения или, что еще лучше, рисовать простую графику (линия заданной толщины, закрашенный круг заданного радиуса/диаметра)

Поддерживается. Посмотрите на эти примеры:
https://github.com/BitMiracle/Docotic.Pdf.Samples/tree/master/Samples/Graphics
https://github.com/BitMiracle/Docotic.Pdf.Samples/tree/master/Samples/Images


Компонент для просмотра PDF-файлов находится в наших планах, но в настоящее время Docotic.Pdf не предлагает такой функциональности.

Обновление. Теперь с помощью Docotic.Pdf можно растрировать, визуализировать или печатать PDF-документы. Ознакомьтесь со следующими статьями:
https://bitmiracle.com/pdf-library/convert-pdf-to-image.aspx
https://bitmiracle.com/pdf-library/draw-print-pdf.aspx

person Vitaliy Shibaev    schedule 12.04.2011
comment
Есть ли место, где я могу увидеть вывод этого примера для предоставленного вами надстрочного индекса: bitmiracle.com/pdf-library/help/text-rise.aspx ? У вас есть бесплатная пробная/демонстрационная/GPL-версия или что-то, что я могу попробовать перед оплатой? - person Rasto; 22.04.2011
comment
Конечно. Вы можете скачать и оценить Docotic. Он поставляется со средством просмотра образцов и набором образцов для Visual Studio 2005-2010. Пробная версия имеет некоторые ограничения, вы можете прочитать подробности здесь - person Vitaliy Shibaev; 22.04.2011

Вместо того, чтобы искать другие библиотеки, как насчет поиска лучшего способа вычисления ширины текста смешанного размера/стиля?

float width = ColumText.getWidth(phrase);

Phrase расширяет ArrayList различными функциями и атрибутами макета текста. Абзац расширяет фразу. Каждый фрагмент имеет определенный Font с собственным цветом, размером и базовым шрифтом PDF. Каждый фрагмент имеет собственное «подъем текста» для настройки базовой линии.

Какую версию iText вы используете? ColumnText существует уже довольно давно.


Итак, вы хотите кернинг между обычными и надстрочными буквами? Мне это кажется не очень хорошей идеей. Кернинг — это корректировка, поэтому, например, «T» может выступать за «j». Значения кернинга предполагают общую базовую линию и размер шрифта. Вы никогда не будете использовать общий базовый уровень и почти наверняка будете иметь разные размеры шрифта при работе с надстрочным текстом. И даже если вы решите, что использовать эти значения — хорошая идея (и я бы не согласился), вы учитываете размер основного текста или размер шрифта надстрочного индекса?

Я хочу сказать, что я думаю, что ваша цель здесь (обозначенные границы текста надстрочного/подстрочного индекса с обычным текстом) приведет к ухудшению макета, а не к лучшему.

Или я вас неправильно понимаю? Позвольте мне перечитать ваш комментарий:

Но если вы также хотите разместить этот текст, который включает верхний индекс на странице, вам нужно использовать PdfContentByte.

Не совсем уверен, что вы имеете в виду там. Если вы хотите разместить текст в произвольном месте на странице, да, вам в значительной степени необходимо использовать PdfContentByte.

При его использовании я не нашел способа сразу печатать сложный текст, включающий верхний индекс.

Весь текст в заданной команде «показать текст» должен иметь одинаковый шрифт/размер/цвет/и т. д. Так работает PDF, а не какое-то ограничение iText.

Я думаю, что это позволяет печатать только один фрагмент текста за раз.

Правильный.

Поэтому я не могу измерить текст с надстрочным индексом с учетом кернинга, а затем поместить его в какую-то позицию на странице.

Вам нужно сложить все ширины разных кусков вместе. Я не могу поверить, что кернинг между обычным текстом и надстрочным текстом — хорошая идея, но образец PDF, показывающий проблему, может убедить меня в обратном.

Мне кажется, вам нужно использовать BaseFont.getWidthPointKerned(String text, float fontSize). Верхний индекс, нижний индекс или обычный, все зависит от размера точки и шрифта. И если вы абсолютно настаиваете, вы можете использовать BaseFont.getKerning(int c1, int c2), чтобы получить значение кернинга между любыми двумя буквами в пределах одного шрифта и использовать его для определения кернинга между фрагментами.


Другой способ рисования текста с помощью iText и PdfContentByte — это ColumnText. Я считаю, что iText использует ColumnText при размещении абзацев, но мне нужно посмотреть код, чтобы убедиться.

Во всяком случае, ваш код может выглядеть примерно так:

ColumnText colTx = new ColumnText(contByte);
// paragraphs are phrases.
colTx.addText(phraseWithSuperAndSubScriptStuff);
colTx.setSimpleColumn(llx, lly, urx, ury);
colTx.go();
person Mark Storer    schedule 12.04.2011
comment
@Mark Storer: Моя проблема с iTextSharp заключается в том, что когда вы хотите, чтобы текст в надстрочном индексе следовал за текстом, который не находится в надстрочном индексе. iTextSharp делает правильный кернинг, когда вы используете его стандартным способом. Но если вы также хотите разместить этот текст, который включает верхний индекс на странице, вам нужно использовать PdfContentByte. При его использовании я не нашел способа сразу печатать сложный текст, включающий верхний индекс. Я думаю, что это позволяет печатать только один фрагмент текста за раз. Поэтому я не могу измерить текст с надстрочным индексом с учетом кернинга, а затем поместить его в какую-то позицию на странице... - person Rasto; 14.04.2011
comment
...без разделения на куски и печати отдельных кусков на странице. Но таким образом я теряю кернинг между этими фрагментами (на границе между надстрочным и не надстрочным текстом). Итак, в результате текст либо выглядит плохо (без кернинга перед надстрочным индексом), но я могу его измерить и распечатать в указанной позиции, либо он выглядит хорошо, и я могу его измерить, но я не могу напечатать его в произвольной позиции на странице ( Я не могу использовать ColumText с PdfContentByte). Я могу скачать последнюю версию iTextSharp, это не проблема. Сейчас я использую версию, которой около 1 года. - person Rasto; 14.04.2011
comment
@Mark Storer, только сейчас я упомянул, что вы отредактировали свой ответ. Вы правильно поняли мои комментарии. Там была опечатка, но вы правильно поняли. О кернинге между обычным текстом и надстрочным текстом: В прошлый раз, когда я тестировал, как печатать текст, содержащий нормальную и надстрочную части с PdfContentByte (чтобы я мог печатать его в произвольном месте), я сделал следующее: напечатал обычный текст Normal text в [30, 30]. Измерено Normal text с помощью BaseFont.getWidthPointKerned. Допустим, возвращенное значение было 101. Поэтому я напечатал надстрочную часть superscript text в [131, 30], используя то же самое... - person Rasto; 22.04.2011
comment
... семейство шрифтов, но меньшего размера с некоторым набором высоты текста. Но результат не выглядел хорошим. В частности, это было не то же самое, что результат, полученный, когда я использовал не PdfContentByte, а Paragraph, который состоял из 2 фрагментов (Normal text и superscript text, где второй фрагмент был установлен как верхний индекс - есть способ сделать это, но я не помню названия методов...). Результат, полученный при использовании Paragraph вместо PdfContentByte, выглядел хорошо, и на самом деле это было то, что я хотел. Между Normal text и superscript text был меньший разрыв. Я думал, что это потому, что... - person Rasto; 22.04.2011
comment
...Paragraph использовал кернинг для вычисления расстояния между этими фрагментами (Normal text и superscript text). Но Paragraph нельзя использовать с PdfContentByte, по крайней мере, я не нашел способа сделать это. Поэтому я не могу напечатать Paragraph в произвольной позиции. Вот почему я хотел кернинг между обычным текстом и надстрочным индексом. Если уродливый текст был там по другой причине, я просто хочу получить те же результаты (как и с Paragraph) в произвольном месте. - person Rasto; 22.04.2011
comment
@Mark Storer: Что ж, я хочу присудить награду, и ваше последнее редактирование вполне может быть решением, которое я ищу. У меня нет времени проверять, действительно ли он делает то, что я хочу — щедрость заканчивается через 8 минут. Я проверю ваше предложение и предложения других позже и, возможно, приму какой-то ответ или установлю новую награду, если проблема не будет решена. Спасибо, а также спасибо всем, кто разместил ответы. - person Rasto; 22.04.2011

Вот статья о создании объектов FixedDocument в MSDN.

Если вы используете WPF и хотите создавать документы качества печати, вам, вероятно, следует изучить встроенные технологии FixedDocument и XPS. И поскольку вы можете в конечном итоге получить доступ ко всему FixedDocument в объектной модели, он также может сообщить вам ваши значения ширины. Я еще не экспериментировал с этим.

person Dave White    schedule 12.04.2011
comment
Прежде чем я решу его использовать, мне нужно знать, что с ним можно делать то, что мне нужно. Поэтому мне нужно знать, как получить информацию о ширине текста и как можно набрать суперскрипт. И как можно измерить текст суперскрипта. - person Rasto; 21.04.2011

Я думаю, что вы, возможно, слишком много думаете о своей проблеме, в то время как WPF обладает отличными возможностями печати. Вы можете распечатать любой визуальный элемент (визуальные элементы — это почти все классы WPF) точно так, как вы видите их на экране, очень простым способом. Здесь есть хороший учебник: http://www.switchonthecode.com/tutorials/printing-in-wpf

person Martín Coll    schedule 21.04.2011
comment
Выглядит хорошо, но как мне получить текст с надстрочным индексом в WPF? Я не думаю, что возможно иметь Label с некоторыми частями текста в надстрочном индексе (и с кернингом). И как тогда мне измерять текст? просто получив значение AcctualWidth из Label? - person Rasto; 21.04.2011
comment
Привет, я сам не пробовал, но думаю, что вот решение для надстрочного индекса, смешанного с обычным текстом: stackoverflow.com/questions/2095583/. А по ширине, да, это более-менее просто. WPF может измерять ширину любого визуального элемента, и вы получаете его из его свойств. Я закодировал что-то подобное, но у меня его нет. Дома проверю позже. удачи! - person Martín Coll; 24.04.2011
comment
@tinchou: Хорошая ссылка! Опять же, мне это нравится все больше и больше ... Я почти решил использовать iTextSharp и попытаться заставить работать предложения Марка Сторера, но теперь я пересматриваю это. Любой код, который вы могли бы предоставить, был бы чрезвычайно полезен. Визуальные элементы тоже можно преобразовать в FixedDocument, верно? - person Rasto; 25.04.2011
comment
привет еще раз, драсто. Я думаю, вы должны попробовать это, это не займет много времени, чтобы увидеть, насколько это просто. хотя есть некоторые ограничения с вариантами опечаток: во-первых, вам нужны шрифты открытого типа (например, палатино). вы можете прочитать описание здесь: msdn.microsoft .com/en-us/library/ и, к сожалению, есть ужасная ошибка: connect.microsoft.com/VisualStudio/feedback/details/545057/ Я также проверил свой код и просто использовал форматированный текст свойство ширины - person Martín Coll; 26.04.2011
comment
и, наконец, поскольку вы будете использовать обычное окно печати Windows, у вас будет возможность печатать в документ XPS. (У меня были некоторые проблемы с полями при печати в xps, но я так и не решил их, потому что мое приложение предназначалось для реальной печати, и все прошло хорошо). (извините, я понимаю, что пишу ужасно плохо и коротко!) - person Martín Coll; 26.04.2011
comment
@tinchou +1 Если бы я получил этот ваш комментарий вчера, это сэкономило бы мне 3 часа экспериментов, поиска и т. д. :( Однако мне удалось получить эффект «верхнего индекса», имея Span внутри TextBlock, содержащий весь мой текст. Я просто установил BaselineAlignment="Top" на это Span и я устанавливаю его FontSize меньше окружающего текста. Он работает для всех шрифтов и даже для одиночных чисел, но выглядит не совсем так, как я хочу. Я задам отдельный вопрос об этом позже (если вы хотите просто проверяйте мой профиль время от времени и фильтруйте вопросы по тегу надстрочный индекс). - person Rasto; 26.04.2011
comment
@tinchou Также я не понимаю, для чего нужен FormattedText, и не знаю, как его использовать. Я видел несколько примеров, которые выглядели действительно сложными. Я не понял. Похоже, это очень низкий API, которого я обычно стараюсь избегать. - person Rasto; 26.04.2011

Похоже, вам нужно получить некоторый опыт работы с GDI+.

Я работал в ипотечной компании, и они очень разборчивы в том, как они хотят изложить свои отчеты. Вплоть до точности пикселей. К сожалению, GDI+ не очень хорошо измеряет текст. Поэтому вашей лучшей альтернативой будет использование Windows API.

[DllImport("gdi32.dll")]
static extern bool GetTextExtentPoint(IntPtr hdc, string lpString, 
                                      int cbString, ref Size lpSize);

вы передаете дескриптор растрового изображения, на котором вы рисуете. Гораздо точнее.

в качестве альтернативы вы можете изучить использование TextRenderer

http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer(v=VS.80).aspx

Я не могу претендовать на то, насколько он точен.

person The Lazy Coder    schedule 22.04.2011
comment
+1 Спасибо, выглядит красиво, но, как и в случае с другими ответами, я не вижу, как выполнить сценарий 2 из моего ответа с GDI+. Вы предоставили ответ о том, как измерять и печатать обычный текст, как измерять и печатать надстрочный текст, но не можете измерить и распечатать их вместе и вместе (см. примечание к сценарию 2). Если есть способ, который я не вижу, предоставьте простой пример кода/ссылку на метод/описание, как это сделать. - person Rasto; 22.04.2011
comment
Я предполагаю, что разница в тексте заключается в том, что текст (супер/суб)сценарий имеет размер, отличный от обычного текста. GDI+ предоставляет инструменты для рисования. Вам нужно будет выполнить синтаксический анализ запросов и измерить ваши строки, после чего вы сможете рисовать их там, где хотите. Моя рекомендация: нарисуйте первый набор обычного текста, затем надстрочный или подстрочный текст и, наконец, следующий набор обычного текста. Я считаю, что это то, что сделает любое другое приложение. Но это даст вам максимальный контроль над вашим продуктом. - person The Lazy Coder; 22.04.2011

Наш продукт, PDFOne .NET, может соответствовать вашим требованиям. Он поставляется с бесплатной коммерческой лицензией.

  1. функция, которая возвращает точную ширину для заданной строки и заданного шрифта, в котором должен отображаться текст
    Для этого можно использовать метод PDFFont.GetTextWidth().
  2. возможность позиционировать текст в точном положении на странице
    Для этого можно использовать одну из многочисленных перегрузок PDFDocument.WriteText()
  3. иметь текст с некоторой его частью в суперсценарии
    PDF не имеет такой концепции в своих текстах. То, что кажется нам суперстрокой, — это просто еще одна строка с другим размером шрифта и положением. Вам просто нужно вызвать другой textout для этого.
  4. функция для получения точной ширины некоторого текста, часть которого находится в надстрочном индексе
    См. предыдущий ответ.
  5. возможность добавлять изображения или, что еще лучше, рисовать простую графику (линия заданной толщины, закрашенный круг заданного радиуса/диаметра) - PDFOne .NET имеет изображения для рендеринга, квадраты, прямоугольники, дуги, кривые Безейра, эллипсы, круги, прямоугольники, полилинии, многоугольники, прямоугольники, водяные знаки, штампы, несколько типов аннотаций,...

PDFOne .NET также поставляется с компонентом принтера PDF и компонентом просмотра PDF.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю на Gnostice.

person BZ1    schedule 12.04.2011
comment
+1 хороший ответ. Однако, когда вы пишете в 3., что то, что появляется как верхний индекс, является просто другим текстом в другой позиции, я думаю, что это не то, чего я хочу. Если я добавлю только меньший текст, немного сдвинутый вверх в качестве надстрочного индекса, это будет выглядеть некрасиво, потому что между обычным текстом и надстрочным индексом не будет кернинга. Учитывая пример A^v, между A и верхним индексом v будет много пробелов. В другом случае E^b места будет гораздо меньше, чем в предыдущем случае. Поэтому мне не нужно правильно позиционировать верхний индекс без информации о кернинге. И затем мне также нужна эта информация, чтобы измерить ее. - person Rasto; 12.04.2011
comment
Я должен исправить себя относительно надстрочных и подстрочных текстовых сообщений. Я передал этот вопрос нашим разработчикам (пост-ответ), и они говорят, что PDF не требует отдельных текстов, т. е. это может быть достигнуто одним текстом. Мы добавим поддержку таких строк в следующих версиях. В настоящее время для наших продуктов потребуются отдельные текстовые сообщения. - person BZ1; 13.04.2011

  1. LaTeX: LaTeX для создания PDF-файлов в производстве
  2. Для платных библиотек, таких как Aspose: http://www.aspose.com/categories/.net-components/aspose.pdf-for-.net/default.aspx
  3. простой HTML с хорошим CSS тоже может работать очень хорошо.
  4. Microsoft Open XML: http://msdn.microsoft.com/en-us/library/bb448854.aspx

Что бы это ни стоило, я думаю, что iTextSharp — самый простой из всех. Вы можете делать все, что хотите, во всех них, но у каждого из них есть свои плюсы и минусы.

person Milimetric    schedule 12.04.2011
comment
Латекс: мне нужен программный доступ к ширине строк, которые будут в моем документе, для вычисления макета. Это невозможно сделать с латексом. Html: где я могу получить ширину строк? Open XML - см. предыдущие комментарии к исходному вопросу. - person Rasto; 12.04.2011
comment
Я далек от эксперта в LaTeX, но я уверен, что вы можете делать все, что захотите. Вы можете указать ширину узла, как обсуждается здесь: sequence-p" title="tikz программно применяет ширину к узлам и неопределенная управляющая последовательность p">tex.stackexchange.com/questions/7660/ Html: управление шрифтами с помощью css и вычисление ширины строк на основе длины и шрифта Информация. Open XML: SDK, который я связал, очень богат, я уверен, что вы можете делать то, что вам нужно. Как я уже сказал, вы можете делать то, что вам нужно, со всеми библиотеками, это может потребовать некоторого творчества и тяжелой работы. Я не думаю, что здесь есть легкий выход. - person Milimetric; 12.04.2011
comment
Я очень хорошо знаю, что можно сделать в LaTeX, а что нельзя. Вы можете использовать информацию о ширине некоторой строки внутри самого LaTeX, но вы не можете получить к ней доступ извне из кода .NET. Я не могу позволить LaTeX делать макет самостоятельно без .NET, потому что мой макет слишком сложен для LaTeX - мне нужен полнофункциональный язык программирования для его вычисления. И НЕТ, вы НЕ МОЖЕТЕ делать все, что хотите, в LaTeX. Это то, что вы не можете сделать: stackoverflow.com/questions/2599644/ . И именно поэтому я не могу его использовать. - person Rasto; 12.04.2011
comment
Я до сих пор не понимаю, как получить ширину строк в HTML... На основе какой информации о шрифте? Если я использую информацию из шрифта .NET, ширина никогда не будет такой же, как показано в html. Я не уверен на 100%, но держу пари, что, по крайней мере, есть другой кернинг ... И Html не является хорошим решением для программно сгенерированных документов и для печати в любом случае. - person Rasto; 12.04.2011
comment
Например, вы можете измерить, насколько широка строка font-size: 12px courier new hello world, а затем основывать свои расчеты на этом. Тем не менее, я дал несколько других вариантов. Надеюсь, они помогли. - person Milimetric; 12.04.2011