如果我的 Angular Controller 中有一个 PDF 文件的 BLOB 表示,我将按以下方式在我的 HTML 页面中公开该文件:
//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>
如果我想在浏览器中显示文档的某些部分时对其进行屏蔽,我有哪些选择?这种情况包括我能想到的(顺便说一句,只是想证明这是可能的):
- Hiding the 2nd page of a document
- Overlapping a image to hide some Width x Height space
关于如何实现这些的任何想法?如果不是来自 BLOB 格式,是否有可能?我必须满足什么要求才能完成这样的任务。
最佳答案
你可以用这个来做https://github.com/akrennmair/ng-pdfviewer和 https://github.com/mozilla/pdf.js .之前我对指令做了一些更改并完成了这个任务。我不会深入,但我为你做了例子。创建了 Plunker 但不知何故无法运行它 https://plnkr.co/edit/xOIYGvTFJ2bU2rawg9Wc?p=preview .这是完整的例子 https://drive.google.com/open?id=0Bzls0-jRP-7GMHFnQWJwUUxRYWs .只需在您的服务器上运行它即可。
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;
}
]);
关于javascript - 从 BLOB 格式 -Angular 实现 PDF 预览或在网页中隐藏部分 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36296220/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO