.NET библиотека для набора документов (PDF или аналогичная)? - PullRequest
8 голосов
/ 12 апреля 2011

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

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

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

Сценарий 1:

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

Сценарий 2:

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

Примечание для второго сценария: У меня есть текст с некоторыми частями в верхнем индексе - пример AAA{v-superscript text}BBB (где текст в {} фигурных скобках - верхний индекс). Библиотека должна иметь возможность печатать этот текст, используя правильный kerning . Без правого кернинга между последним 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, которая удовлетворяет указанным выше требованиям, также будет отличным решением.

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

Ответы [ 7 ]

4 голосов
/ 12 апреля 2011

Вы можете посмотреть Docotic.Pdf Library (отказ от ответственности: я работаю на 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 () приведет к неверным результатам.

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

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

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

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

Поддерживается. Посмотрите на образцы:

http://bitmiracle.com/pdf-library/help/graphics.aspx

http://bitmiracle.com/pdf-library/help/images.aspx


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

2 голосов
/ 13 апреля 2011

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

float width = ColumText.getWidth(phrase);

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

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


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

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

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

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

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

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

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

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

Правильно.

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

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

Мне кажется, вам нужно использовать BaseFont.getWidthPointKerned(String text, float fontSize).Верхний индекс, нижний индекс или обычный, это все о размере шрифта и шрифте.А если вы используете Absolutely Insist, вы можете использовать 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();
1 голос
/ 22 апреля 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

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

1 голос
/ 21 апреля 2011

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

1 голос
/ 12 апреля 2011

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

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

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

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

1 голос
/ 12 апреля 2011

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

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

0 голосов
/ 12 апреля 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 - самый простой из всех возможных способов.Вы можете делать то, что вы хотите во всех них, но у каждого из них есть свои плюсы и минусы.

...