Sharepoint 2010 Custom SharePoint Libray/List menu action and Word Convert To PDF

0_1310003405FnYA.gif

在这个document library中的document的dropdown menu下多了个”Save as PDF”.我们在真实项目中经常也会碰到要做一些特殊menu的需求。下面就简单的介绍一下这个dropdown menu是怎么做出来的。


A, 新建一个SharePoint 空项目。

B, 在Feature地方加一个新的feature。

C, 在当前项目中加一个element.

在Element加入CustomAction部分。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction Id="{F2ACC1B0-0D93-4E45-B1AF-ED13903CF8CA}"
              RegistrationId="101"
              RegistrationType="List"
              Location="EditControlBlock"
              Title="Save as PDF"
                GroupId="ActionsMenu"
                 Sequence="100" ImageUrl="/_layouts/images/DOC16.gif">
    <UrlAction Url="{SiteUrl}/_layouts/ConvertToPDF/ConvertToPDF.aspx?List={ListId}&amp;ID={ItemId}"/>
  </CustomAction>
</Elements>

到这里,这个Action Menu就已经做好了,Deploy时就会出现前面提到的画面。但是如果我们想做事情,就要在它跳转后的页面里做啦。下面我简单的说下Convert to PDF.


D, 现在在project下加一个layouts,在它下面就可以直接添加web page了。

     web page的URL:   <UrlAction Url="{SiteUrl}/_layouts/ConvertToPDF/ConvertToPDF.aspx?List={ListId}&amp;ID={ItemId}"/>

E, 现在开始在ConvertToPDF这个web page里实现所需功能。

由于要使用Office API中自带的convert doc/docx to PDF的功能,所以要引入它的DLL。

0_1310003900RV3Z.gif

F, 功能的实现。

public partial class ConvertToPDF : LayoutsPageBase//System.Web.UI.Page
    {
        SPSite siteCollection = null;
        Guid listId = Guid.Empty;
        int itemId = 0;
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                siteCollection = SPContext.Current.Site;
                SPWeb web = SPContext.Current.Web;
                listId = new Guid(Server.UrlDecode(Request.QueryString["List"]));
                itemId = int.Parse(Request.QueryString["ID"]);
                SPDocumentLibrary docLibrary = web.Lists[listId] as SPDocumentLibrary;
                SPListItem item = docLibrary.GetItemById(itemId);
                if (item.Name.EndsWith(".doc") || item.Name.EndsWith(".docx"))
                {
                    string new_name = "";
                    if (item.Name.EndsWith(".docx"))
                    {
                        new_name = item.Name.Replace(".docx", ".pdf");
                    }
                    else
                    {
                        new_name = item.Name.Replace(".doc", ".pdf");
                    }
                    //docx file
                    string file = web.Url + "/" + item.Url;
                    //pdf file
                    string new_file = file.Replace(".docx", ".pdf");
                    //schedule the conversion
                    string wordAutomationServiceName = "Word Automation Services";
                    Word.Conversions.ConversionJob conversionJob = new Word.Conversions.ConversionJob(wordAutomationServiceName);
                    conversionJob.Name = "Proposal Conversion";
                    SPSecurity.RunWithElevatedPrivileges(delegate()
                    {
                        web.AllowUnsafeUpdates = true;
                        conversionJob.UserToken = siteCollection.UserToken;
                        conversionJob.AddFile(file, new_file);
                        conversionJob.Start();
                        web.AllowUnsafeUpdates = false;
                    });
                    /*ConversionJobStatus status = new ConversionJobStatus(wordAutomationServiceName, conversionJob.JobId, null);
                    bool isSuccess = false;
                    while (true)
                    {
                        Thread.Sleep(5000);
                        status = new ConversionJobStatus(wordAutomationServiceName, conversionJob.JobId, null);
                        if (status.Count == status.Succeeded)
                        {
                            isSuccess = true;
                            break;
                        }
                        else if (status.Count == status.Failed)
                        {
                            break;
                        }
                    }
                    if (isSuccess)
                    {*/

                    //}
                    lblMessage.Visible = false;
                    Response.Write("<script language='javascript'>history.go(-1);</script>");
                }
                else
                {
                    lblMessage.Visible = true;
                    lblMessage.Text = "The action can not support the current format.";
                }
            }
            catch (Exception ex)
            {
                 Response.Write("<script language='javascript'>history.go(-1);</script>");
            }
        }
        private void Download(string fileName,byte [] content)
        {
            Response.ClearHeaders();
            Response.Clear();
            Response.Expires = 0;
            Response.Buffer = true;
            Response.AddHeader("Accept-Language","en-us");
            Response.AddHeader("Content-Disposition", "Attachment;FileName=" + System.Web.HttpUtility.UrlEncode(fileName,System.Text
                .Encoding.UTF8));
            Response.ContentType = "APPLICATION/octet-stream";
            Response.BinaryWrite(content);
            Response.Close();
        }
    }

----------------------aspx

<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">

</asp:Content>

<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
<asp:Label ID="lblMessage" runat="server" /> 
</asp:Content>

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
Save as PDF
</asp:Content>

<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
Save as PDF
</asp:Content>

这里起的是一个TimeJob,如果发现要等很久才能生成PDF,我们可以把这个Time job的周期变短。

------------------------------------------------------------------------------------------------------------------------------------------

 Custom Ribbon button for Document library/SPList.

由于自定义Ribbon button和自定义Item action menu基本一样我就不详细写了,我说一下他们的区别。

主要是Element内容不同。

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <CustomAction Id="Ribbon.ListItem.Actions.BuildCustomerDocuments"

              Location="CommandUI.Ribbon"

              RegistrationId="105"

              RegistrationType="List"

              Title="Build Customer Document">

    <CommandUIExtension>

      <CommandUIDefinitions>

        <CommandUIDefinition

           Location="Ribbon.ListItem.Actions.Controls._children">

          <Button Id="Ribbon.ListItem.Actions.BuildCustomerDocumentsButton"

                  Image16by16="/_layouts/images/DOC16.gif"

                  Image32by32="/_layouts/images/DOC32.gif"

                  LabelText="Build Customer Doc"

                  Sequence="100"

                  TemplateAlias="o1"

                  Command="HelloCommand" />

        </CommandUIDefinition>

      </CommandUIDefinitions>

      <CommandUIHandlers>

        <CommandUIHandler

           Command="HelloCommand"

           CommandAction="javascript:GoToPage('{SiteUrl}/_layouts/CustomerDocumentsFeature/BuildCustomerDoc.aspx?List={ListId}&ID={SelectedItemId}');"/>

      </CommandUIHandlers>

    </CommandUIExtension>

  </CustomAction>

</Elements>

转载于:https://www.cnblogs.com/Forest-zhu/archive/2011/07/07/2100138.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值