Late answer but it might help other people.
I am working on a Windows 8.1 x64 machine.
My task was to enable users to view PDF documents on the device (Tablet with Windows OS). After much of a research I couldn't find any feasible solution, or what I should say using WindowsFormsHost just feels dirty!
What I have done is to use a WebBrowser control like so:
<WebBrowser Source="pack://siteoforigin:,,,/path/to/your/file.html"/>
Note:
The pack://siteoforigin:
refers to a location when your application is running. So make sure your .html
files are set to Content
and Copy Always
.
Now that your html has been set up you need to now either download or just copy and paste the following .js
code:
/*
PDFObject v1.2.20111123
https://github.com/pipwerks/PDFObject
Copyright (c) Philip Hutchison
MIT-style license: http://pipwerks.mit-license.org/
*/
/*jslint browser: true, sloppy: true, white: true, plusplus: true */
/*global ActiveXObject, window */
var PDFObject = function (obj) {
if (!obj || !obj.url) { return false; }
var pdfobjectversion = "1.2",
//Set reasonable defaults
id = obj.id || false,
width = obj.width || "100%",
height = obj.height || "100%",
pdfOpenParams = obj.pdfOpenParams,
url,
pluginTypeFound,
//declare functions
createAXO,
hasReaderActiveX,
hasReader,
hasGeneric,
pluginFound,
setCssForFullWindowPdf,
buildQueryString,
get,
embed;
/* ----------------------------------------------------
Supporting functions
---------------------------------------------------- */
createAXO = function (type) {
var ax;
try {
ax = new ActiveXObject(type);
} catch (e) {
//ensure ax remains null
ax = null;
}
return ax;
};
//Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
hasReaderActiveX = function () {
var axObj = null;
if (window.ActiveXObject) {
axObj = createAXO("AcroPDF.PDF");
//If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
if (!axObj) { axObj = createAXO("PDF.PdfCtrl"); }
//If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true
if (axObj !== null) { return true; }
}
//If you got to this point, there's no ActiveXObject for PDFs
return false;
};
//Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers
hasReader = function () {
var i,
n = navigator.plugins,
count = n.length,
regx = /Adobe Reader|Adobe PDF|Acrobat/gi;
for (i = 0; i < count; i++) {
if (regx.test(n[i].name)) {
return true;
}
}
return false;
};
//Detects unbranded PDF support
hasGeneric = function () {
var plugin = navigator.mimeTypes["application/pdf"];
return (plugin && plugin.enabledPlugin);
};
//Determines what kind of PDF support is available: Adobe or generic
pluginFound = function () {
var type = null;
if (hasReader() || hasReaderActiveX()) {
type = "Adobe";
} else if (hasGeneric()) {
type = "generic";
}
return type;
};
//If setting PDF to fill page, need to handle some CSS first
setCssForFullWindowPdf = function () {
var html = document.getElementsByTagName("html"),
html_style,
body_style;
if (!html) { return false; }
html_style = html[0].style;
body_style = document.body.style;
html_style.height = "100%";
html_style.overflow = "hidden";
body_style.margin = "0";
body_style.padding = "0";
body_style.height = "100%";
body_style.overflow = "hidden";
};
//Creating a querystring for using PDF Open parameters when embedding PDF
buildQueryString = function (pdfParams) {
var string = "",
prop;
if (!pdfParams) { return string; }
for (prop in pdfParams) {
if (pdfParams.hasOwnProperty(prop)) {
string += prop + "=";
if (prop === "search") {
string += encodeURI(pdfParams[prop]);
} else {
string += pdfParams[prop];
}
string += "&";
}
}
//Remove last ampersand
return string.slice(0, string.length - 1);
};
//Simple function for returning values from PDFObject
get = function (prop) {
var value = null;
switch (prop) {
case "url": value = url; break;
case "id": value = id; break;
case "width": value = width; break;
case "height": value = height; break;
case "pdfOpenParams": value = pdfOpenParams; break;
case "pluginTypeFound": value = pluginTypeFound; break;
case "pdfobjectversion": value = pdfobjectversion; break;
}
return value;
};
/* ----------------------------------------------------
PDF Embedding functions
---------------------------------------------------- */
embed = function (targetID) {
if (!pluginTypeFound) { return false; }
var targetNode = null;
if (targetID) {
//Allow users to pass an element OR an element's ID
targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID : document.getElementById(targetID);
//Ensure target element is found in document before continuing
if (!targetNode) { return false; }
} else {
targetNode = document.body;
setCssForFullWindowPdf();
width = "100%";
height = "100%";
}
targetNode.innerHTML = '<object data="' + url + '" type="application/pdf" width="' + width + '" height="' + height + '"></object>';
return targetNode.getElementsByTagName("object")[0];
};
//The hash (#) prevents odd behavior in Windows
//Append optional Adobe params for opening document
url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
pluginTypeFound = pluginFound();
this.get = function (prop) { return get(prop); };
this.embed = function (id) { return embed(id); };
this.pdfobjectversion = pdfobjectversion;
return this;
};
Which has been used from gihub repository
Now once you have that set up you need now to install Adobe Reader
Your html
page should look like this (for testing):
<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<head>
<title></title>
<link rel="javascript" href="js/pdfObject.js" />
</head>
<body style="border: 0; margin: 0; padding: 0">
<embed src="..\path\to\your\file.pdf" width="600px" height="500px" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html">
</body>
Now the tricky part.
You need to get this html
page to display in your WebBrowser
control, if successful you will be prompted to install an update for your acrobat reader.
After the update has been successful restart the application and your file should now appear on your page!
Happy coding!