Thank you for the suggestions!

 

Cheers,

Jeff

 

 

From: Action Request System discussion list(ARSList) 
[mailto:[email protected]] On Behalf Of Andrew Hicox
Sent: Thursday, June 25, 2015 3:11 PM
To: [email protected]
Subject: Re: Field HTML Contents to Text Attachment

 

** 

This is a slightly different approach that I recently discovered, that kinda 
sorta does the same thing.

IF you have an HTML document in a char field, AND IF your intention is to 
render that HTML for the user (for instance, by using a set-fields action to 
place the HTML document in an iFrame (oops 'View Field' in remedy-land) ... AND 
IF, what your users REALLY want is just a way to export that HTML document into 
something they can edit and/or save (for instance Word, Excel, Txt, etc) ...

Well then, I have a pretty darn cool trick for you:

1.      Include the jQuery javascript library in your HTML document header

the Mid-Tier itself actually already has a copy of this library that it uses 
for it's own purposes. Unfortunately, I've not figured out any decent way of 
creating a static link to it for the purposes of constructing an HTML include, 
it's just too much of a mess, and Mid-tier doesn't seem to want to serve files 
anyhow, unless you go and hack around in the tomcat config. For that reason, I 
usually just include it straight from google (like pretty much everyone else on 
the internet):

<script 
src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js";></script>
 
2.      Include the FileSaver jQuery plugin

It is available here https://github.com/eligrey/FileSaver.js
Unfortunately, there's no public CDN the likes of which google puts out for 
jQuery, however, there's a brute force way around that. Just download the js 
file, remove the line breaks, and insert it into your HTML document, like so:

<script type="text/javascript">var saveAs=saveAs||"undefined"!=typeof 
navigator&&navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator)||function(e){"use
 strict";if("undefined"==typeof navigator||!/MSIE 
[1-9]\./.test(navigator.userAgent)){var t=e.document,n=function(){return 
e.URL||e.webkitURL||e},o=t.createElementNS("http://www.w3.org/1999/xhtml","a";),r="download"in
 o,i=function(n){var 
o=t.createEvent("MouseEvents");o.initMouseEvent("click",!0,!1,e,0,0,0,0,0,!1,!1,!1,!1,0,null),n.dispatchEvent(o)},a=e.webkitRequestFileSystem,c=e.requestFileSystem||a||e.mozRequestFileSystem,s=function(t){(e.setImmediate||e.setTimeout)(function(){throw
 t},0)},u="application/octet-stream",f=0,d=500,l=function(t){var 
o=function(){"string"==typeof 
t?n().revokeObjectURL(t):t.remove()};e.chrome?o():setTimeout(o,d)},v=function(e,t,n){t=[].concat(t);for(var
 o=t.length;o--;){var r=e["on"+t[o]];if("function"==typeof 
r)try{r.call(e,n||e)}catch(i){s(i)}}},p=function(t,s){var 
d,p,w,y=this,m=t.type,S=!1,h=function(){v(y,"writestart progress write 
writeend".split(" 
"))},O=function(){if((S||!d)&&(d=n().createObjectURL(t)),p)p.location.href=d;else{var
 o=e.open(d,"_blank");void 0==o&&"undefined"!=typeof 
safari&&(e.location.href=d)}y.readyState=y.DONE,h(),l(d)},b=function(e){return 
function(){return y.readyState!==y.DONE?e.apply(this,arguments):void 
0}},g={create:!0,exclusive:!1};return 
y.readyState=y.INIT,s||(s="download"),r?(d=n().createObjectURL(t),o.href=d,o.download=s,i(o),y.readyState=y.DONE,h(),void
 
l(d)):(/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)&&(t=new
 
Blob(["",t],{type:t.type})),e.chrome&&m&&m!==u&&(w=t.slice||t.webkitSlice,t=w.call(t,0,t.size,u),S=!0),a&&"download"!==s&&(s+=".download"),(m===u||a)&&(p=e),c?(f+=t.size,void
 c(e.TEMPORARY,f,b(function(e){e.root.getDirectory("saved",g,b(function(e){var 
n=function(){e.getFile(s,g,b(function(e){e.createWriter(b(function(n){n.onwriteend=function(t){p.location.href=e.toURL(),y.readyState=y.DONE,v(y,"writeend",t),l(e)},n.onerror=function(){var
 e=n.error;e.code!==e.ABORT_ERR&&O()},"writestart progress write abort".split(" 
").forEach(function(e){n["on"+e]=y["on"+e]}),n.write(t),y.abort=function(){n.abort(),y.readyState=y.DONE},y.readyState=y.WRITING}),O)}),O)};e.getFile(s,{create:!1},b(function(e){e.remove(),n()}),b(function(e){e.code===e.NOT_FOUND_ERR?n():O()}))}),O)}),O)):void
 O())},w=p.prototype,y=function(e,t){return new p(e,t)};return 
w.abort=function(){var 
e=this;e.readyState=e.DONE,v(e,"abort")},w.readyState=w.INIT=0,w.WRITING=1,w.DONE=2,w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null,y}}("undefined"!=typeof
 self&&self||"undefined"!=typeof 
window&&window||this.content);"undefined"!=typeof 
module&&module.exports?module.exports.saveAs=saveAs:"undefined"!=typeof 
define&&null!==define&&null!=define.amd&&define([],function(){return 
saveAs});</script>
3.      Not necessarily required, but my users specifically wanted Microsoft 
Word export, so this handy library is what I used:
https://github.com/markswindoll/jQuery-Word-Export

again, I just downloaded the js file, stripped the line breaks and manually 
inserted it into my HTML document as such:

<script type="text/javascript">if (typeof jQuery !== "undefined" && typeof 
saveAs !== "undefined") { (function($) { $.fn.wordExport = function(fileName) { 
fileName = typeof fileName !== 'undefined' ? fileName : "jQuery-Word-Export"; 
var static = { mhtml: { top: "Mime-Version: 1.0\nContent-Base: " + 
location.href + "\nContent-Type: Multipart/related; 
boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type:
 text/html; charset=\"utf-8\"\nContent-Location: " + location.href + 
"\n\n<!DOCTYPE html>\n<html>\n_html_</html>", head: "<head>\n<meta 
http-equiv=\"Content-Type\" content=\"text/html; 
charset=utf-8\">\n<style>\n_styles_\n</style>\n</head>\n", body: 
"<body>_body_</body>" } }; var options = { maxWidth: 624 }; var markup = 
$(this).clone(); markup.each(function() { var self = $(this); if (self.is 
<http://self.is> (':hidden')) self.remove(); }); var images = Array(); var img 
= markup.find('img'); for (var i = 0; i < img.length; i++) { var w = 
Math.min(img[i].width, options.maxWidth); var h = img[i].height * (w / 
img[i].width); $('<canvas>').attr("id", "jQuery-Word-export_img_" + 
i).width(w).height(h).insertAfter(img[i]); var canvas = 
document.getElementById("jQuery-Word-export_img_" + i); canvas.width = w; 
canvas.height = h; var context = canvas.getContext('2d'); 
context.drawImage(img[i], 0, 0, w, h); var uri = canvas.toDataURL(); 
$(img[i]).attr("src", img[i].src); img[i].width = w; img[i].height = h; 
images[i] = { type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")), 
encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")), location: 
$(img[i]).attr("src"), data: uri.substring(uri.indexOf(",") + 1) }; 
canvas.parentNode.removeChild(canvas); } var mhtmlBottom = "\n"; for (var i = 
0; i < images.length; i++) { mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n"; 
mhtmlBottom += "Content-Location: " + images[i].contentLocation + "\n"; 
mhtmlBottom += "Content-Type: " + images[i].contentType + "\n"; mhtmlBottom += 
"Content-Transfer-Encoding: " + images[i].contentEncoding + "\n\n"; mhtmlBottom 
+= images[i].contentData + "\n\n"; } mhtmlBottom += "--NEXT.ITEM-BOUNDARY--"; 
var styles = ""; var fileContent = static.mhtml.top.replace("_html_", 
static.mhtml.head.replace("_styles_", styles) + 
static.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom; var blob = 
new Blob([fileContent], { type: "application/msword;charset=utf-8" }); 
saveAs(blob, fileName + ".doc"); }; })(jQuery); } else { if (typeof jQuery === 
"undefined") { console.error("jQuery Word Export: missing dependency 
(jQuery)");  } if (typeof saveAs === "undefined") { console.error("jQuery Word 
Export: missing dependency (FileSaver.js)");};}</script>
4.      Create a link somewhere in your HTML document ... this is the link the 
user clicks to download the HTML document as a word document (CSS style it like 
a remedy button if you're feeling cheeky)
Here's the link I put in my document:

<a href="javascript:void(0);" class="button word-export">Export as Word 
Document</a>

note: I put the link in the "word-export" class. That's important in a second
5.      Somewhere in the header of your document, insert the standard jQuery 
document.ready() function, and and insert the hook for your WordExport link:

<script type="text/javascript">
    $(document).ready(function() {
        // bind click to the word-export thang
        $("a.word-export").click(function(event) {
                $("#page-content").wordExport();
        });
    });
</script>
6.      ... and this is slick as all hell ... tell wordExport.js which part of 
the document you'd like to export.

Note this part of the function from step #5: $("#page-content").wordExport();
That's basically telling jQuery: "export the HTML element with an id of 
'page-content' as a word document". So, basically find the part of the document 
you want to let the user download and name it "page-content" (or you know 
whatever ... just make sure your name matches what you state in the function). 
So in my case, it was just one big old:

<div id="page-content">
   <!-- literally everything in the document -->
</div>

boom ... done! 
Users load up a record on my form, an active link  fires off and populates an 
HTML template in AR System Resource Definitions, which gets placed in a view 
field, and there's a link right there to download it as a word document, no 
additional monkey business required!

Now ... why in the heck doesn't BMC just do this to generate print views 
instead of monkeying around with BIRT??

I know the above looks like a lot, but believe me ... it's truly dead simple, 
especially in comparison to dorking around with BIRT.

 

-Andy






On Jun 25, 2015 9:39 AM, "Jeff Lockemy" <[email protected] 
<mailto:[email protected]> > wrote:

Good Morning,

I am looking to see if anyone has done something like this before and what
method they may have used.

I have a Remedy character field that contains a large amount of HTML text.
I want to create a text file that contains the contents of that character
field, name it "RequestID.html", and then place it into a Remedy attachment
field.  We have tried a few things but neither is clean or has been without
issues:

- Build the file using DOS command within a filter Run Process (ECHO to a
file)
- Build the file using a filter Notify mechanism of Other (then rename the
resulting .ARN notification file and attach it)

Any other ideas or suggestions on how we might accomplish this is
appreciated.

Best regards,
Jeff

_______________________________________________________________________________
UNSUBSCRIBE or access ARSlist Archives at www.arslist.org 
<http://www.arslist.org> 
"Where the Answers Are, and have been for 20 years"

_ARSlist: "Where the Answers Are" and have been for 20 years_ 


_______________________________________________________________________________
UNSUBSCRIBE or access ARSlist Archives at www.arslist.org
"Where the Answers Are, and have been for 20 years"

Reply via email to