четверг, 24 ноября 2011 г.

Создание PDF документов в C# с использованием библиотеки PDFSharp

По долгу службы мне приходится программировать на C#. Однажды передо мной встала задача написать модуль, который бы генерировал PDF документы "на лету". После сравнительного анализа различных библиотек я остановился на PDFSharp потому, что она позволяет вставлять картинки, работать с таблицами и, самое главное, в ней реализован компонент для просмотра сгенерированных документов.

воскресенье, 6 ноября 2011 г.

Таблицы с большим количеством текста

Обычно не возникает проблем с включением в ячейки таблиц большого количества текста. Тех сам растянет ячейки под нужный размер. Главное не забыть ограничить ширину ячеек указав вместо стандартного параметра c,l или r параметры p,m,b позволяющие указывать ширину ячейки.
Например:
\begin{tabular}{| p{0.5\linewidth} | c |}
\hline
Конгруэ́нтность (лат. congruens, -ntis — соразмерный, соответствующий) в широком смысле — равенство, адекватность друг другу различных экземпляров чего-либо (обычно — содержания, выраженного в различных формах, представлениях) или согласованность элементов системы между собой.
&
Конгруэ́нтность (лат. congruens, -ntis — соразмерный, соответствующий) в широком смысле — равенство, адекватность друг другу различных экземпляров чего-либо (обычно — содержания, выраженного в различных формах, представлениях) или согласованность элементов системы между собой.
\\ \hline
\end{tabular}  


Но вот если использовать объединение ячеек между рядами multirow, то стандартный механизм уже не работает. Высота полученной ячейки будет равна сумме высот объединенных ячеек. И в результате может получится что-то такое:
Видите? Текста слишком много и он накладывается на текст в других ячейках. Единственный, известный мне, способ этого избежать - увеличить высоту ячеек. Делается это следующим трюком:

\newlength{\rowA}
\setlength{\rowA}{8ex} % modify as needed
\newcommand{\strutA}{% no space before strut
\rule[-0.45\rowA]{0pt}{\rowA}% put text approx mid strut

}
    \begin{tabular}{|p{0.45\linewidth}|p{0.15\linewidth}|p{0.15\linewidth}|}
    \hline
    Вариант испытания&Ожидаемый логический уровень & Напряжение на выходе (В)\\ \hline
\multirow{2}{\linewidth}{Выход не имеет нагрузки} & 0&0\\ \cline{2-3}
                                        & 1& 1.27 -- 0 \\ \hline
\multirow{2}{\linewidth}{Выход имеет нагрузку, резистор 1000 Ом,
                подключенную к цепи GND }&0& 0 \strutA \\ \cline{2-3}
                                        &1 &0 \strutA \\ \hline
\multirow{2}{\linewidth}{Выход имеет нагрузку резистор 1000 Ом,
                подключенную к цепи питания VCC +5В} &0& 5 \strutA \\ \cline{2-3}
                                                    & 1&4.3\strutA \\ \hline
\multirow{2}{\linewidth}{Выход имеет нагрузку резистор 1000 Ом,
                подключенную к дополнительному источнику
                питания постоянного тока напряжением 3В. }&0&2.4\strutA \\ \cline{2-3}
                                                        & 1&3\strutA \\ \hline
\multirow{2}{\linewidth}{Выход имеет нагрузку резистор 1000 Ом,
                подключенную к дополнительному источнику
                питания постоянного тока напряжением 5В.}&0&4.3\strutA \\ \cline{2-3}
                                                        &1 &5 \strutA \\ \hline
\multirow{2}{\linewidth}{Выход имеет нагрузку резистор 1000 Ом,
                подключенную к дополнительному источнику
                питания постоянного тока напряжением 10В.}   &0& 9.2\strutA \\ \cline{2-3}
                                                            &1& 10\strutA \\ \hline
    \end{tabular}


Эту хитрость я нашел здесь: http://nepsweb.co.uk/docs/tableTricks.pdf