Quantcast
Channel: Experiencing Adobe Experience Manager (AEM, CQ)
Viewing all articles
Browse latest Browse all 526

AEM Cloud Service - Assets Open PDF in new browser tab

$
0
0

Goal

AEM Cloud Version :  2021.3.5026.20210309T210727Z-210225 (March 09, 2021)

Add a button Open PDF in Tab to the Assets Console tool bar for inline opening the selected PDF in a new browser tab

Demo | Package Install | Github


Open PDF Button


PDF In New Tab


Solution

1) Add a proxy servlet apps.experienceaem.assets.core.servlets.PDFProxyServlet to set the content disposition of PDF stream to inline, so user can view the PDF pages in browser...

package apps.experienceaem.assets.core.servlets;

import com.day.cq.dam.api.Asset;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@Component(
name = "Experience AEM Proxy Servlet",
immediate = true,
service = Servlet.class,
property = { "sling.servlet.methods=GET", "sling.servlet.paths=/bin/eaem/proxy" })
public class PDFProxyServlet extends SlingAllMethodsServlet {
private static final Logger log = LoggerFactory.getLogger(PDFProxyServlet.class);

@Override
protected final void doGet(final SlingHttpServletRequest request, final SlingHttpServletResponse response)
throws ServletException, IOException {
try {
final String pdfPath = request.getParameter("path");

if (StringUtils.isEmpty(pdfPath)) {
return;
}

Resource pdfRes = request.getResourceResolver().getResource(pdfPath);

streamPDF(response, pdfRes);
} catch (final Exception e) {
log.error("Could not get response", e);
response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}

private void streamPDF(final SlingHttpServletResponse response, final Resource pdfRes) throws Exception {
String fileName = pdfRes.getPath().substring(pdfRes.getPath().lastIndexOf("/") + 1);

response.setContentType("application/pdf");
response.setHeader("Content-disposition", "inline; filename=" + fileName);

Asset asset = pdfRes.adaptTo(Asset.class);
final InputStream in = asset.getOriginal().getStream();

final OutputStream out = response.getOutputStream();

IOUtils.copy(in, out);

out.close();

in.close();
}
}


2) Create the button configuration in /apps/eaem-assets-open-pdf/clientlibs/open-pdf-new-tab/open-pdf-but

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/collection/action"
activeSelectionCount="single"
icon="filePDF"
target=".cq-damadmin-admin-childpages"
text="Open PDF in Tab"
title="Open PDF in new tab"
variant="actionBar"/>


3) Create a clientlib /apps/eaem-assets-open-pdf/clientlibs/open-pdf-new-tab/clientlib with categories=dam.gui.actions.coral for adding the button in Assets Console action bar and open the PDF in new tab when clicked

(function ($, $document) {
"use strict";

var _ = window._,
initialized = false,
ASSETS_PAGE = "/assets.html", $openPDFBut,
BESIDE_ACTIVATOR = "cq-damadmin-admin-actions-create-activator",
PROXY_PDF_URL = "/bin/eaem/proxy?path=",
OPEN_PDF_BUT_URL = "/apps/eaem-assets-open-pdf/clientlibs/open-pdf-new-tab/open-pdf-but.html";

if (!isAssetsPage()) {
return;
}

$document.on("foundation-contentloaded", addActionBarButtons);

$document.on("foundation-selections-change", ".foundation-collection", enableOpenPDFButton);

function enableOpenPDFButton(){
if(!$openPDFBut){
return;
}

var $selections = $(".foundation-selections-item");

if ($selections.length !== 1) {
$openPDFBut.addClass("foundation-collection-action-hidden");
return;
}

var mimeType = $selections.find(".foundation-collection-assets-meta").data("asset-mimetype");

if(mimeType !== "application/pdf"){
return;
}

$openPDFBut.removeClass("foundation-collection-action-hidden");
}

function addActionBarButtons(){
if (initialized) {
return;
}

initialized = true;

$.ajax(OPEN_PDF_BUT_URL).done(addOpenPDFButton);
}

function addOpenPDFButton(html) {
html = html || "";

if(!html.trim()){
return;
}

var $eActivator = $("." + BESIDE_ACTIVATOR);

if ($eActivator.length == 0) {
return;
}

$openPDFBut = $("<coral-actionbar-item>" + html + "</coral-actionbar-item>")
.insertAfter($eActivator.closest("coral-actionbar-item"));

$openPDFBut = $openPDFBut.find("button");

$openPDFBut.click(openPDFInNewTab);
}

function openPDFInNewTab() {
var $selections = $(".foundation-selections-item"),
assetPath = $selections.data("foundationCollectionItemId");

window.open(PROXY_PDF_URL + assetPath, '_blank');
}

function isAssetsPage() {
return (window.location.pathname.indexOf(ASSETS_PAGE) >= 0);
}
}(jQuery, jQuery(document)));



Viewing all articles
Browse latest Browse all 526

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>