Сделать всю ячейку в таблице 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

2 ответа

Решение

Ответ команды 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.

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

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

Другие вопросы по тегам