RadControls for ASP.NET AJAX Note |
|---|
Note that RadGrid will render as an XHTML table and will convert that table to a PDF document. That requires that the rendered grid output is valid XHTML. If it is not, you will receive an exception that the export cannot be completed.
The most common cause for bad XHTML are symbols like <,>,& that need to be replaced by the correct XHTML entity: & l t ;, & g t ;, & a m p ; respectively. Another frequent problem are unclosed tags.
|
PDF specific settings and events
Name | Description |
|---|
AllowAdd / AllowCopy / AllowModify / AllowPrinting |
Boolean properties that determines whether the corresponding action is allowed for the generated PDF file
|
Author / Creator / Keywords / Producer / Subject / Title | PDF document specific information
|
DefaultFontFamily |
Specifies the default font
|
PageTitle | Sets the page title (appears on the top of the page) |
PaperSize / PageWidth / PageHeight |
These properties are related to the size of the generated page. You can either use the PaperSize to supply a predefined value (A4, Letter, JIS B5, etc) or define the size manually using PageWidth/PageHeight.
|
PageBottomMargin / PageTopMargin / PageLeftMargin / PageRightMargin / PageFooterMargin / PageHeaderMargin | All the page margins could be controlled via these settings. |
UserPassword | Used to set a password and enable password protection for the exported file (introduced in RadControls for ASP.NET AJAX Q1 2010 SP2) |
CopyASPX
<ExportSettings>
<Pdf PageTitle="My Page" PaperSize="A4" />
</ExportSettings>
Note |
|---|
The default page orientation for the PDF file is Portrait. You can easily switch to Landscape by modifying the PageWidth / PageHeight properties manually.
|
OnPdfExporting event
The reason for having separate OnPdfExporting event is that by the time the
OnGridExporting
event is raised, the Pdf output is already generated and ready for adding to the response. Some cases where the OnPdfExporting event is helpful when you want to modify the output - as an alternative to the OnGridExporting event.
Although you can't modify the contents on OnGridExporting, you can use this event to achieve some other tasks. For example:
Appearance
RadGrid does not export any external styles. That means that your skins will not appear in the generated file. Still, the inline styles are preserved and should be used instead. Different approaches could be used depending where RadGrid will rebind before export (when IgnorePaging is set to true or when you rebind manually).
CopyC#
bool isExport = false;
protected void Button1_Click(object sender, EventArgs e)
{
isExport = true;
RadGrid1.MasterTableView.ExportToPdf();
}
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
if (e.Item is GridDataItem && isExport)
e.Item.Style["background-color"] = "#888888";
}
CopyVB.NET
Private isExport As Boolean = FalseProtected
Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
isExport = True
RadGrid1.MasterTableView.ExportToPdf()
End Sub
Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs)
If TypeOf e.Item Is GridDataItem AndAlso isExport Then
e.Item.Style("background-color") = "#888888"
End If
End Sub
In the cases, where Rebind won't be invoked you can apply the styles directly:
CopyC#
protected void Button1_Click(object sender, EventArgs e)
{
foreach (GridDataItem item in RadGrid1.Items)
item.Style["background-color"] = "#888888";
RadGrid1.MasterTableView.ExportToPdf();
}
CopyVB.NET
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
For Each item As GridDataItem In RadGrid1.Items
item.Style("background-color") = "#888888"
Next
RadGrid1.MasterTableView.ExportToPdf()
End Sub Note |
|---|
To center the text in the GridHeaderItem, you should set the appropriate style to each cell (TH element) instead of the whole row.
|
Hiding Columns
You can use the HideStructureColumns property to hide GridRowIndicatorColumn, GridExpandColumn and GridGroupSplitterColumn. For the other columns types, you can use the following approach:
CopyC#
protected void Button1_Click(object sender, EventArgs e)
{
RadGrid1.MasterTableView.GetColumn("C2").Visible = false;
RadGrid1.MasterTableView.ExportToPdf();
}
CopyVB.NET
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click()
RadGrid1.MasterTableView.GetColumn("C2").Visible = False
RadGrid1.MasterTableView.ExportToPdf()
End Sub
Hiding items
There are two common ways to hide an item.
CopyC#
protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e)
{
if (e.CommandName == RadGrid.ExportToPdfCommandName)
RadGrid1.MasterTableView.Items[2].Visible = false;
}
CopyVB.NET
Protected Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As GridCommandEventArgs) Handles RadGrid1.ItemCommand
If e.CommandName = RadGrid.ExportToPdfCommandName Then
RadGrid1.MasterTableView.Items(2).Visible = False
End If
End Sub
CopyC#
protected void Button1_Click(object sender, EventArgs e)
{
RadGrid1.MasterTableView.Items[2].Visible = false;
RadGrid1.MasterTableView.ExportToPdf();
}
CopyVB.NET
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
RadGrid1.MasterTableView.Items(2).Visible = False
RadGrid1.MasterTableView.ExportToPdf()
End Sub
CopyC#
bool isPdfExport = false;
protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e)
{
if (e.CommandName == RadGrid.ExportToPdfCommandName)
isPdfExport = true;
}
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
if (isPdfExport && e.Item.ItemIndex == 2)
e.Item.Visible = false;
}
CopyVB.NET
Private isPdfExport As Boolean = FalseProtected
Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As GridCommandEventArgs)
If e.CommandName = RadGrid.ExportToPdfCommandName Then
isPdfExport = True
End If
End Sub
Protected Sub RadGrid1_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs)
If isPdfExport AndAlso e.Item.ItemIndex = 2 Then
e.Item.Visible = False
End If
End Sub
Border support
By setting BorderType, BorderStyle and BorderColor properties you could customize the look of the grid's
border into the exported file. They could be set to ExportSettings-Pdf.
BorderType determines the border type that will be applied to the exported PDF file. The supported values
are: Separate, NoBorder, OuterBorders, AllBorders. The selected border type will be applied for both
flat and hierarchical RadGrids. Note that the Separate value is left to avoid breaking changes and
also because of the fact that this functionality has a minor performance impact. When the BorderType is
set to Separate, the BorderColor, and the BorderStyle
properties will have no effect.
BorderStyle determines the style of the borders that will be applied to the exported PDF file.
The supported values: Medium, Thick, Thin. Its default value is Medium.
And the last property BorderColor determines the color of the borders that will be applied to the
exported PDF file. It supports all color from Drawing.Color collection. Black
is the default color.
Additionally when Separate border type is used the following statements are applicable.
You can disable the RadGrid borders by settings the BorderStyle or GridLines properties - either in code-behind or in the markup.
CopyC#
RadGrid1.BorderStyle = BorderStyle.None;
CopyVB.NET
RadGrid1.BorderStyle = BorderStyle.None
If you apply the same approach to the MasterTableView (or other GridTableView) you will remove the outer table border only - when combined with the above mentioned approach you can hide all borders in RadGrid.
CopyC#
RadGrid1.MasterTableView.BorderStyle = BorderStyle.None;
CopyVB.NET
RadGrid1.MasterTableView.BorderStyle = BorderStyle.None
Fonts / Unicode support
RadGrid's PDF exporting engine supports all languages that use left-to-right orientation when the appropriate Unicode font is set. Live demo that exports Japanese characters is available online. The most common international font is Arial Unicode MS because it covers all Unicode characters. Of course, you can use other language-specific fonts as Batang for Korean, SimSun for Chinese, MS Mincho for Japanese and etc.
The default font of the generated pages is specified by the DefaultFontFamily property:
CopyASPX
<ExportSettings>
<Pdf DefaultFontFamily="Arial Unicode MS" />
</ExportSettings>Also, you can dynamically set fonts to the row elements in the same manner used to set background-colors:
CopyC#
item["OriginalName"].Style["font-family"] = "Arial Unicode MS";
CopyVB.NET
item("OriginalName").Style("font-family") = "Arial Unicode MS"
Exporting HTML tables
There are a few rules that should be followed when exporting HTML tables to PDF:
The table should define <colgroup> and <col> elements
The number of col elements should be equal to the number of the columns in the table body
Width in pixels (or another absolute units) should be set to the table
CopyXML
<table width="300px">
<colgroup>
<col />
<col />
</colgroup>
<tr>
<td>
Cell1
</td>
<td>
Cell2
</td>
</tr>
</table>
Exporting images / using third-party image-processing tools
Our PDF engine can export all images nevertheless whether they use an absolute or relative path. The image can be stored on the local server or remotely. When using third-party image-processing tools like ImageResizer.dll or similar modules that use HttpHandlers and accept parameters via query strings, you should provide an absolute path to the resized image, otherwise RadGrid won't be able to find the image and will throw an error. Transparency is not supported.
You can use the following approach if you need to set a background image to your GridTableViews:
<MasterTableView style="background-image: url(yourimage)" />
Note |
|---|
In order to export images that are spanned over multiple columns you should invoke PrepareItemStyle on the corresponding grid item. Our PDF export demo uses the depicted approach.
|
Resizing columns
There are two ways to resize the columns - declarative (in the markup) and programmatic (in code-behind). The first one involves the HeaderStyle property:
CopyASPX
<telerik:GridBoundColumn DataField="ID">
<HeaderStyle width="20px" />
</telerik:GridBoundColumn>
It is also possible to set the widths dynamically - Page_PreRender event is suitable for this functionality:
CopyC#
protected void Page_PreRender(object o, EventArgs e)
{
GridColumn column = RadGrid1.MasterTableView.GetColumn("MyColumnName");
column.HeaderStyle.Width = Unit.Pixel(300);
}
CopyVB.NET
Protected Sub Page_PreRender(ByVal o As Object, ByVal e As EventArgs)
Dim column As GridColumn = RadGrid1.MasterTableView.GetColumn("MyColumnName")
column.HeaderStyle.Width = Unit.Pixel(300)
End Sub Note |
|---|
If you want the changes to be applied to the exported file only, you can use a boolean flag to distinguish whether the event is fired as a result of a button click (or manual invoking of the export method).
|
Text aligning
Text alignment could be set either to the row element or to the cell. The only exception is when the cell is part of the GridHeaderItem - the elements are not TD, but TH. In this case you should set the style (text-align) to each cell in the given row.
Page break
In RadControls for ASP.NET AJAX Q3 2009 Beta we introduced the possibility to use page-breaks. They can be added in many ways - declaratively, in code-behind or directly in the raw html.
The page-breaking tag is <?hard-pagebreak?>
CopyASPX
<columns>
<telerik:GridTemplateColumn>
<ItemTemplate>
FIRST COLUMN
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn>
<ItemTemplate>
LAST_COLUMN<?hard-pagebreak?>
</ItemTemplate>
</telerik:GridTemplateColumn>
</columns>
PDF Export Q & A
Below, you can find the answers of some commonly asked questions
Q: How to insert newline character - BR doesn't work?
A: You can use P instead of BR
Q: How to fit XX columns on my page?
A: Depending on your scenario, you can choose one or more suggestions from the following list:
Q: I want to export multiple RadGrids / I want to export nested RadGrids
A: Have a look at the following code-library project: Export multiple RadGrids
Q: The PDF file appears blank on my Mac
A: Please use Adobe Reader instead of the built-in Preview
Q: My PDF file is blank or I see the page title only
A: Disable the Scrolling/StaticHeaders functionality - don't forget to Rebind() the RadGrid control afterwards, otherwise the changes will not take effect.
Q: I have a RadChart control nested in my RadGrid. How to export it?
A: Although this is not supported out-of-the-box (since the RadChart image is served by a HttpHandler) you could use the following trick: Insert a regular (invisible) ASP.NET Image next to your RadChart control and then call the Save method on ItemDataBound event. Set this image to the ImageUrl property of the aforementioned image control. Of course, you will have to show (Visible="true") the image before export.
Unsupported features / scenarios
Although we are striving to constantly improve our products, there are some limitations in the current implementation of our PDF engine
Exceptions
Reason: Nested tables should have width in pixels
The default pager's RadComboBox uses special CSS approach that is unsupported by the PDF parser
Telerik.Web.Apoc.ApocException: fo:block must be child of fo:basic-link, fo:block, fo:block-container, fo:float, fo:flow, fo:footnote-body, fo:inline, fo:inline-container, fo:list-item-body, fo:list-item-label, fo:marker, fo:multi-case, fo:static-content, fo:table-caption, fo:table-cell or fo:wrapper not fo:table-header
This exception is probably result of a hardpagebreak, inserted in a wrong place - for example directly after the starting tag of a table
You are either using RTL fonts or mixing Korean characters with another language in the same element (rare scenario)
Most probably you have DIV element with specified dimensions or absolute positioning. Remove the relevant width/height/position attributes to avoid this exception.
RadGrid's PDF export engine doesn't work in medium trust.
PDF engine is trying to resolve empty anchorURL. Please note, that the anchor links are supported only when valid URL is supplied. Example:
The reason for this exception is that the number of col elements is the colgroup is not equal to the maximum number of cells per row. Put simply, if you have a table with two columns, you should put two col elements.
CopyASPX
<a href="#">text</a>
<%--ERROR--%>
<a href="http://www.w3.org/TR/REC-html40/struct/links.html#h-12.2">W3.ORG</a>
<%--VALID--%>