Thursday, August 12, 2010

SharePoint 2010 forces users to save PDFs – Solution Found!

We’ve recently deployed SP2010 at a new client .Things are dandy, except the users are complaining that they are prompted to save PDFs when they click on them, instead of the PDF opening up in Adobe Acrobat. What?? That seems insane, but it turns out it is “by design” as I found out on Sean’s blog: http://blog.brainlitter.com/archive/2010/05/19/sharepoint-2010-treats-pdf-and-other-file-types-as-insecure.aspx




This worked on the top level site collection ,but not on doc libs on other site collections in the web application, so I saw within this forum post: http://social.technet.microsoft.com/Forums/en-US/sharepoint2010setup/thread/80365b88-937a-4188-85ef-45cbdc2cd10d that someone suggested the following:

“The http header X-Download-Options: noopen is added by the Browser File Handling and the two setting that are in it.  But the Read-only and Edit prompt are driven by SharePoint and a setting in the DOCICON.XML file. If you have added PDF as a Document extension inside the DOCICON.XML you will need to also add an additional attribute in the line and that is opencontrol=”” this seems to stop SharePoint from applying it's header to open the document. <Mapping Key="pdf" Value="icpdf.gif" OpenControl=""/> “





I did this as well but we were still getting prompted.  Oddly enough, if you checked out the document, then you could open the PDF directly. Also, NEW doc libraries on these sites would open PDFs correctly. This is all very strange.




I then tried changing the document library setting to force documents to open in the the client application. (Settings > Advanced Settings > Opening Files in the Browser). Still no luck.




At this point, my instinct was that some setting on the document library, that I could not see from the UI, was not getting properly set when I changed the web application level setting. 


Well, thanks to Todd Klindt’s blog, http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=214, plus some Powershell wrangling, I was able to find a way to go to the properties of the doc lib and verify that it’s BrowserFileHandling property was still set to “Strict”! 




PS C:\ > Add-PSSnapin Microsoft.SharePoint.Powershell
PS C:\> $site = Get-SPSite(“http://mysubsitecollectionurl”)
PS C:\> $web = $site.OpenWeb()
PS C:\>  $list = $web.GetList(“http://mysubsitecollectionurl/List”);
PS C:\>  $list.browserfilehandling
Strict




No wonder we were still having issues! Using powershell, I was able to set this property to “Permissive”, and my PDFs immediately began opening in Adobe. Whoo hoo!




PS C:\> $list.browserfilehandling = “Permissive” ; $list.update();
PS C:\> $list.browserfilehandling
Permissive




Now I want to be able to go through all my existing doc libs and switch that property. Unfortunately there wasn’t any way to filter out which libraries needed to be switched (manually created ones) and ones that did not (default SharePoint doc libs), so I ended up going through the sites on a case by case basis, mostly driven off the doc lib names b/c we had used site templates to deploy the same doc libs to the different sites.




PS C:> foreach ($list in $rsrWeb.Lists) { if($list.title -match "Documents") { if($list.browserfilehandling -eq "Strict") { $list.browserfilehandling = "Permissive"; $list.update(); $site.url, $list.title, $list.browserfilehandling} }  }


Use the line above to copy into your Powershell window, but let me break it out down below:
foreach ($list in $web.Lists)
   
     if($list.title -match "Documents")     //return any lists with a title containing “Documents”   
    {        
          if($list.browserfilehandling -eq "Strict")  //if the profile is set to strict       
         {            
               $list.browserfilehandling = "Permissive";            
               $list.update();            
               $site.url, $list.title, $list.browserfilehandling  //print the list url/name for verification        
          }    
     } 
}


Woo hoo!! Hope this helps you out when dealing with WHY THE HECK is SharePoint hating on PDFs??!!
FreakingSharePoint

14 comments:

tBlog said...

I am trying our your method on my sites, but I cannot seem to work with any site other than the top-level site in the site collection. This script will not allow me to get into lists within subsites of that site collection to make necessary changes.

cookie said...

Yes, this script is to go on a site by site basis. So if you start out by setting $site = Get-SPSite([Enter your subsite url here]) you should be able to get to your subsite lists.

I did this on a site by site basis b/c my lists were different on different sites. You could probably write a powershell script to recursively go through all the subsites in a site and all the lists in each subsite. I just did not do this b/c I did not need to at the time.

The 200 and Counting said...

I tried this, but when I got to the last PS command (to show the current browserfilehandling), it didn't give any feedback. Any suggestions?

cookie said...

@The 200 - if you type

$list.Title

do you get anything back? Want to ensure you actually loaded the list.

observative said...

Thanks for posting this...very informative and helpful.

mike said...

Thanks for the info, I was banging my head against the wall trying to figure out why I was not in permissive.

mike said...

Thanks for the information. I was banging my head against the wall trying to figure out why I was not in permissive.

The Author said...

Sharepoint appears to be determined to shred my sanity one point at a time.

Everything in the system says this should work. The admin site says it's set to permissive. The library reports permissive at the PowerShell. And yet it still prompts me to save every single PDF in the library rather than just opening it. I've checked IE's settings, Acroread's settings. Chrome saves the file, Firefox gives you the option to open or save.

I've even tried rebooting the Sharepoint server.

Any thoughts?

The Author said...

Right. Definitely failed a SAN check somewhere there. 3 site collections, guess which one I'd not set to Permissive.

So, note for the future. Even if the library itself reports permissive when you check, that gets over-ridden if you've not set the site collection to permissive.

Aarrgh!

cookie said...

Wow, nice find. Sorry I couldn't help ya before, but thanks for reporting your solution here!

SCOTT said...

Thanks so much for the help. I have not been able to find where we can set a site collection to Permissive? Can someone help??

Thanks

Roland said...

Hi There,

I set the site collection to permissive, i ran the powershell commands and it says that the library is also permissive.

Still no luck.

Do i have to take some more steps ?

Thanks in advance!

Adnan said...

I have read this was fixed in the december sharepoint 2010 cumulative update, can anyone confirm that?

Fadi Ahmad Abdulwahab said...

Nice ^-^ this solved my problems