Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Achieving a preview of a PDF or hiding parts of a PDF in a web page from BLOB format -Angular

If I have a BLOB representation of a PDF file I have in my Angular Controller that I am exposing in my HTML page in the following fashion:

 //controller
 function (data) {

        var fileBack = new Blob([(data)], { type: 'application/pdf' });
        var fileURL = URL.createObjectURL(fileBack);
        $scope.content = $sce.trustAsResourceUrl(fileURL);
 }

//html
<object ng-show="content" data="{{content}}" type="application/pdf" style="width: 100%; height: 400px;"></object>

What are my options if I wanted to mask parts of the document as it is being displayed in the browser? Such cases include that I can think of (just want to prove this is possible btw):

  - Hiding the 2nd page of a document
  - Overlapping a image to hide some Width x Height space

Any ideas on how any of this could be achieved? If not from a BLOB format is it possible at all? What requirements would I have to meet to accomplish a task such as this.

Successful example in browser: https://studysoup.com/western-kentucky-university/econ-202/one-week-of-notes/econ-202-notes-week-9?id=864095

like image 327
Pipeline Avatar asked Mar 29 '16 22:03

Pipeline


1 Answers

You can do with this https://github.com/akrennmair/ng-pdfviewer and https://github.com/mozilla/pdf.js. Previously I made some changes to the directive and did this task. I'm not going into the deep but i made example for you. Created Plunker but somehow not able to run it https://plnkr.co/edit/xOIYGvTFJ2bU2rawg9Wc?p=preview. Here is the complete example https://drive.google.com/open?id=0Bzls0-jRP-7GMHFnQWJwUUxRYWs . Just run it on your server.

 angular.module('ngPDFViewer', []).
 directive('pdfviewer', ['$parse', function ($parse) {
        var canvas = null;
        var instance_id = null;
        var excludedPages = [];
        return {
            restrict : "E",
            template : "<div class='make-scrollable'></div>",
            scope : {
                onPageLoad : '&',
                loadProgress : '&',
                src : '@',
                id : '=',
                excludedPages : '='
            },
            controller : ['$scope', function ($scope) {
                    $scope.pageNum = 1;
                    $scope.pdfDoc = null;
                    $scope.scale = 1.0;

                    $scope.documentProgress = function (progressData) {
                        if ($scope.loadProgress) {
                            $scope.loadProgress({
                                state : "loading",
                                loaded : progressData.loaded,
                                total : progressData.total
                            });
                        }
                    };

                    $scope.loadPDF = function (path) {
                        console.log('loadPDF ', path);
                        PDFJS.getDocument(path, null, null, $scope.documentProgress).then(function (_pdfDoc) {
                            $scope.pdfDoc = _pdfDoc;
                            $scope.renderPages($scope.pageNum, function (success) {
                                if ($scope.loadProgress) {
                                    $scope.loadProgress({
                                        state : "finished",
                                        loaded : 0,
                                        total : 0
                                    });
                                }
                            });
                        }, function (message, exception) {
                            console.log("PDF load error: " + message);
                            if ($scope.loadProgress) {
                                $scope.loadProgress({
                                    state : "error",
                                    loaded : 0,
                                    total : 0
                                });
                            }
                        });
                    };

                    $scope.renderPages = function (num, callback) {
                        $scope.$apply(function () {
                            $scope.onPageLoad({
                                page : $scope.pageNum,
                                total : $scope.pdfDoc.numPages
                            });
                        });
                        for (var num = 1; num <= $scope.pdfDoc.numPages; num++){
                            var exist = $.inArray(num, excludedPages);
                            if(exist===-1){
                                $scope.pdfDoc.getPage(num).then(function(page) {
                                    $scope.renderPage(page, num)
                                })
                            }
                        }
                    };

                    $scope.renderPage = function(page, num) {
                        var viewport = page.getViewport($scope.scale);
                        var canvas = document.createElement('canvas');
                        var ctx = canvas.getContext('2d');
                        canvas.height = viewport.height;
                        canvas.width = viewport.width;
                        $('.make-scrollable').append(canvas);
                        $('.make-scrollable').height(viewport.height - 100);
                        page.render({ canvasContext: ctx, viewport: viewport }).promise.then(
                            function() { 
                                console.log("Rendered");
                            }
                       )

                    }

                    $scope.$on('pdfviewer.nextPage', function (evt, id) {
                        if (id !== instance_id) {
                            return;
                        }

                        if ($scope.pageNum < $scope.pdfDoc.numPages) {
                            $scope.pageNum++;
                            $scope.renderPage($scope.pageNum);
                        }
                    });

                    $scope.$on('pdfviewer.prevPage', function (evt, id) {
                        if (id !== instance_id) {
                            return;
                        }

                        if ($scope.pageNum > 1) {
                            $scope.pageNum--;
                            $scope.renderPage($scope.pageNum);
                        }
                    });

                    $scope.$on('pdfviewer.gotoPage', function (evt, id, page) {
                        if (id !== instance_id) {
                            return;
                        }

                        if (page >= 1 && page <= $scope.pdfDoc.numPages) {
                            $scope.pageNum = page;
                            $scope.renderPage($scope.pageNum);
                        }
                    });
                }
            ],
            link : function (scope, iElement, iAttr) {
                canvas = iElement.find('canvas')[0];
                instance_id = iAttr.id;
                excludedPages = scope.$parent.excludePages;
                iAttr.$observe('src', function (v) {
                    console.log('src attribute changed, new value is', v);
                    if (v !== undefined && v !== null && v !== '') {
                        scope.pageNum = 1;
                        scope.loadPDF(scope.src);
                    }
                });
            }
        };
    }
]).
service("PDFViewerService", ['$rootScope', function ($rootScope) {

        var svc = {};
        svc.nextPage = function () {
            $rootScope.$broadcast('pdfviewer.nextPage');
        };

        svc.prevPage = function () {
            $rootScope.$broadcast('pdfviewer.prevPage');
        };

        svc.Instance = function (id) {
            var instance_id = id;

            return {
                prevPage : function () {
                    $rootScope.$broadcast('pdfviewer.prevPage', instance_id);
                },
                nextPage : function () {
                    $rootScope.$broadcast('pdfviewer.nextPage', instance_id);
                },
                gotoPage : function (page) {
                    $rootScope.$broadcast('pdfviewer.gotoPage', instance_id, page);
                }
            };
        };

        return svc;
    }
]);
like image 52
Arun Shinde Avatar answered Nov 15 '22 15:11

Arun Shinde