在 MigraDoc Table 中制作整个单元格 Link
Make an Entire Cell in a MigraDoc Table a Link
MigraDoc 中有没有办法将整个 table 单元格变成 link?我有一个表格 table 的内容,页码很难点击。如果整个单元格都可以单击以导航到指定页面,我会更喜欢。这是我的代码示例:
// 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
恐怕没有简单的方法可以让整个单元格都可以点击。我自己没试过,但是你可以在超链接中添加图像(可见或透明)或文本。
这将使可点击区域更大 - 如果您使用例如带有蓝色下划线的文本会有一个视觉提示,表明该文本是可点击的。
我的灵感来自 PDFsharp 团队的回答,尝试用空白的 hyperlink 图像填充单元格,并在 hyperlink 上添加文本。由于我的最终目标实际上是使整行成为 hyperlink,因此我提出了以下解决方案。
首先,在 table 中您希望成为超级 link 的第一列之前添加一个额外的零宽度列。接下来,向每个零宽度单元格添加段落、hyperlink 和透明的 1 像素图像。指定要填充的图像高度和宽度,无论您希望成为 link 的多少 table 个单元格。另外,务必将包含 link 的段落的字体大小设置为几乎为零(零会引发异常,但图像在字体基线上对齐,因此您需要一个非常小的数字以防止段落被比图片大)。
请注意,即使有边框,零宽度列在查看生成的 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);
上述代码的结果是一个包含 table 的文档,其中包含 2 行、3 个可见列,其中最后一行中的最后两个单元格全部是一个 hyperlink 到"MyBookmarkName"。仅供参考,我确实根据建议 here 修改了 PDFSharp 源代码以删除 hyperlinks 周围的边框,这在 Adobe Acrobat Reader.[= 的某些缩放级别下看起来很不稳定。 12=]
MigraDoc 中有没有办法将整个 table 单元格变成 link?我有一个表格 table 的内容,页码很难点击。如果整个单元格都可以单击以导航到指定页面,我会更喜欢。这是我的代码示例:
// 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
恐怕没有简单的方法可以让整个单元格都可以点击。我自己没试过,但是你可以在超链接中添加图像(可见或透明)或文本。
这将使可点击区域更大 - 如果您使用例如带有蓝色下划线的文本会有一个视觉提示,表明该文本是可点击的。
我的灵感来自 PDFsharp 团队的回答,尝试用空白的 hyperlink 图像填充单元格,并在 hyperlink 上添加文本。由于我的最终目标实际上是使整行成为 hyperlink,因此我提出了以下解决方案。
首先,在 table 中您希望成为超级 link 的第一列之前添加一个额外的零宽度列。接下来,向每个零宽度单元格添加段落、hyperlink 和透明的 1 像素图像。指定要填充的图像高度和宽度,无论您希望成为 link 的多少 table 个单元格。另外,务必将包含 link 的段落的字体大小设置为几乎为零(零会引发异常,但图像在字体基线上对齐,因此您需要一个非常小的数字以防止段落被比图片大)。
请注意,即使有边框,零宽度列在查看生成的 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);
上述代码的结果是一个包含 table 的文档,其中包含 2 行、3 个可见列,其中最后一行中的最后两个单元格全部是一个 hyperlink 到"MyBookmarkName"。仅供参考,我确实根据建议 here 修改了 PDFSharp 源代码以删除 hyperlinks 周围的边框,这在 Adobe Acrobat Reader.[= 的某些缩放级别下看起来很不稳定。 12=]