Сделать всю ячейку в таблице MigraDoc ссылкой

Есть ли способ в MigraDoc сделать всю ячейку таблицы ссылкой? У меня есть табличное оглавление, и номер страницы трудно щелкнуть. Я бы предпочел, чтобы вся ячейка была доступна для перехода на указанную страницу. Вот пример моего кода:

// Create the table within the document
var document = new Document();
var section = document.AddSection();
var table = section.AddTable();

// Create a column in the table
var column = table.AddColumn();
column.Width = "2cm";

// Create a row in the table
var row = table.AddRow();
row.Height = "1cm";

// Add a hyperlink to the appropriate page
var paragraph = row.Cells[0].AddParagraph();
var hyperlink = paragraph.AddHyperlink("MyBookmarkName");
hyperlink.AddPageRefField("MyBookmarkName");

...
// Create the bookmark later in the document

person Jeff G    schedule 07.04.2015    source источник


Ответы (2)


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

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

person I liked the old Stack Overflow    schedule 07.04.2015
comment
Добавление прозрачного изображения за текст кажется интересной идеей... Не могли бы вы привести пример того, как добавить гиперссылку прозрачного изображения в ячейку, наложенную на абзац? Я не знаю, как размещать элементы друг над другом. - person Jeff G; 08.04.2015

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

Во-первых, добавьте дополнительный столбец нулевой ширины перед первым столбцом в таблице, который вы хотите использовать в качестве гиперссылки. Затем добавьте абзац, гиперссылку и прозрачное 1-пиксельное изображение в каждую ячейку нулевой ширины. Укажите высоту и ширину изображения, чтобы заполнить любое количество ячеек таблицы, которое вы хотите использовать в качестве ссылки. Кроме того, не забудьте установить размер шрифта абзаца, содержащего ссылку, почти равным нулю (ноль генерирует исключение, но изображения выравниваются по базовой линии шрифта, поэтому вам нужно очень маленькое число, чтобы абзац не был больше изображения). ).

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

// Declare some constants
var _rowHeight = new Unit(.75, UnitType.Centimeter);

// Create the document, section, and table
var document = new Document();
var section = document.AddSection();
var table = section.AddTable();

// Format the table
table.Rows.Height            = _rowHeight;
table.Rows.VerticalAlignment = VerticalAlignment.Center;

// Define the column titles and widths
var columnInfos = new[] {
    new { Title = "Non-Link Column", Width = new Unit(8, UnitType.Centimeter) },
    new { Title = ""               , Width = new Unit(0                     ) },
    new { Title = "Link Column 1"  , Width = new Unit(8, UnitType.Centimeter) },
    new { Title = "Link Column 2"  , Width = new Unit(8, UnitType.Centimeter) },
};

// Define the column indices
const int colNonLink   = 0;
const int colHyperlink = 1;
const int colLink1     = 2;
const int colLink2     = 3;

// Create all of the table columns
Unit tableWidth = 0;
foreach (var columnInfo in columnInfos)
{
    table.AddColumn(columnInfo.Width);
    tableWidth += columnInfo.Width;
}

// Remove the padding on the link column
var linkColumn = table.Columns[colHyperlink];
linkColumn.LeftPadding  = 0;
linkColumn.RightPadding = 0;

// Compute the width of the summary links
var linkWidth = tableWidth -
    columnInfos.Take(colHyperlink).Sum(ci => ci.Width);

// Create a row to store the column headers
var headerRow = table.AddRow();
headerRow.Height           = ".6cm";
headerRow.HeadingFormat    = true;
headerRow.Format.Font.Bold = true;

// Populate the header row
for (var colIdx = 0; colIdx < columnInfos.Length; ++colIdx)
{
    var columnTitle = columnInfos[colIdx].Title;
    if (!string.IsNullOrWhiteSpace(columnTitle))
    {
        headerRow.Cells[colIdx].AddParagraph(columnTitle);
    }
}

// In the real code, the following is done in a loop to dynamically add rows
var row = table.AddRow();

// Populate the row header
row.Cells[colNonLink].AddParagraph("Not part of link");

// Change the alignment of the link cell
var linkCell = row.Cells[colHyperlink];
linkCell.VerticalAlignment = VerticalAlignment.Top;

// Add a hyperlink that fills the remaining cells in the row
var linkParagraph = linkCell.AddParagraph();
linkParagraph.Format.Font.Size = new Unit(.001, UnitType.Point);
var hyperlink = linkParagraph.AddHyperlink("MyBookmarkName");
var linkImage = hyperlink.AddImage("Transparent.gif");
linkImage.Height = _rowHeight;
linkImage.Width  = linkWidth;

// Populate the remaining two cells
row.Cells[colLink1].AddParagraph("Part of link 1");
row.Cells[colLink2].AddParagraph("Part of link 2");

// Add a border around the cells
table.SetEdge(0, 0, columnInfos.Length, table.Rows.Count,
    Edge.Box | Edge.Interior, BorderStyle.Single, .75, Colors.Black);

Результатом приведенного выше кода является документ, содержащий таблицу с 2 строками и 3 видимыми столбцами, где все последние две ячейки в последней строке являются гиперссылкой на «MyBookmarkName». Просто для справки: я изменил исходный код PDFSharp в соответствии с советом здесь для удаления границ вокруг гиперссылок, которые выглядели шатко при определенных уровнях масштабирования в Adobe Acrobat Reader.

person Jeff G    schedule 09.04.2015