Pdf.js: pdf.js中的数字签名

创建于 2012-01-13  ·  174评论  ·  资料来源: mozilla/pdf.js

嗨! 我们对何时或是否要在PDF查看器(PDF.js)中实现签名数据视图(Xades,Pades和Cades)感兴趣。

亲切的问候

亚历杭德罗·派恩多(Alejandro Pinedo),
SOA-X

2-feature 4-annotations

最有用的评论

对于以上所有人员,请使用GitHub的新+1反应按钮,而不要在此处添加评论。

所有174条评论

当前尚没有实现此功能的迫在眉睫的计划。 我们还没有看到太多进展,因此并不是优先考虑的事情。 不过,我们一直在寻找更多的贡献者,因此我们欢迎任何补丁添加此功能。 如果您有兴趣添加,如有疑问,请随时通过我们的IRC频道(#pdfjs irc.mozilla.org)停止。

布伦丹

你好

此功能的实施现状如何?

谢谢

@ fermo111尚未实现,但是我很乐意指导愿意承担这项任务的人。

@yurydelendik我对实现在pdf.js中呈现PDF文件的数字签名的功能感兴趣。 我该如何联系您?

@wolvz,请在IRC irc.mozilla.org频道#pdfjs(最简单)上找到我,或参加我们的任何公开会议来协调工作。

我正在尝试在annotation.js中实现SigWidgetAnnotation(例如TextAnnotation,LinkAnnotation),以支持pdf.js中的数字签名。
签名显示在pdf查看器中,我已经可以提取并验证嵌入DER编码的PKCS7对象中的证书...
现在,我进入下一步,即验证文件的消息摘要。
为此,我需要访问文件内容...我不知道是否可以从annotation.js访问该文件,但是我无法弄清楚。 我能做的最好的事情是使用以下方法获取core.js中的内容:

var contentStreamPromise = this.pdfManager.ensure(this,'getContentStream',[]);
var dataPromises = Promise.all([contentStreamPromise]);
dataPromises.then(function(data){
var contentStream = data [0];
var contents = contentStream.str.bytes;
返回内容;
});

有人可以给我启发一下什么是在批注.js中获取文件内容的最佳方法吗?
提前致谢...

沃尔夫
在这方面有什么进展吗?

@yurydelendik @wolvz
我对数字签名显示功能非常感兴趣。 我克隆了wolvz的存储库并构建了代码,但是当我尝试使用它时,由于以下错误,我被诺言拒绝:“未定义需求”。 谁能解释会导致该错误的原因以及我该如何解决? 另外,我非常愿意继续进行此功能的工作。 我已经通过iText库在Java中使用pdf进行工作,但是我从未尝试过在javascript中使用pdf。 有人可以指导我一些指导我正确方向的文档/教程,以便当我尝试将此功能进一步深入领域时可以弄清楚从哪里开始?

我很迷惑。 我必须在pdf.js库中做什么才能在pdfJS中显示数字签名pdf

untitled

此签名和证书都显示在pdf ..中,但是当我在pdf.js中打开它时,它不会显示在其中。

@ mrpandya007 ,数字签名不会显示,因为开发人员选择隐藏它,直到他们具有签名验证功能。
如果我记得,如果您只想让他们显示出来,则必须在此处注释行389至392: https :
不过还不确定,我现在无法测试。

@wolvz ,感谢您的回复,但已经发表了评论。 请看一下,Crystal报表生成的pdf签名未显示,但DevExpress生成的pdf正确显示了它。

请回答我..我必须做的..我可以给你那个pdf来测试

目前尚无对数字签名的良好支持,因此必须予以实施。

解决此数字签名问题需要多少天,因为我们依赖于您的lib。

可能需要很长时间,因为此功能必须由某人开发,并且当前存在更高优先级的问题。

heading

下载文件后,为什么我只在pdf.js中遇到标题“ =”这样的问题。
请任何解决方案。 仅在telerik生成的pdf中才发生。

@ mrpandya007请不要在其他问题中发布无关的问题。 为该问题打开一个单独的问题。

我也遇到了同样的问题。 尽管我不一定需要签名验证,但就我而言足以显示签名图像。 也许直到实施签名验证而不是不显示图像之前,最好显示该图像并用小文字注释它,例如“未实现签名验证。未知的签名状态”? 因此,至少在视觉上,pdf会显示您的期望。

是否有时间表解决该问题的时间? 还是应该考虑其他产品?
pdfjsissue

据我所知,目前还没有人对此进行研究,因此,如果有人愿意对此进行研究,请随时提交PR。

你好
只能显示数字签名字段的PDF.JS版本对于许多用户来说应该足够了……是否有任何“叉子”可以做到这一点?
问候

@DORNINEM,您只需要注释掉隐藏签名注释的代码即可。
但是无论如何,这是您要求的叉子: https :

@wolvz !! 非常感谢。
我想知道为什么该功能没有在正式版本中,因为它工作得很好。 我测试了一些签名的PDF文件(从1到6个不同的签名字段),结果为perfec!
我真的确定,真正的需要是显示这些字段,而不是验证签名。 签名验证最好在服务器端完成,因为它有时需要未在本地证书存储库中安装的证书。

你好,

有人可以解释为允许pdf.js显示数字签名而必须注释或取消注释的行?

感谢您提供所有信息:)

@maximlefebvre根据https://github.com/wolvz/pdf.js/commit/7df3f4fe6e21b888358fd7718cb15e3c266ba066 ,应该足以让PDF.js显示签名。 但是请注意,PDF.js团队尚未将其验证为稳定的解决方案(因此,为什么它不在官方代码库中),但它可能是一个临时解决方案。

我们有兴趣实施签名验证。 @wolvz似乎对此进行处理,但尚未完成-您是否还有可以在上面进行处理的部分代码?

@wolvz ,请打个小字条以帮助您了解您的回购

我们已经实现了使用浏览器的PDF文件的签名和签名验证https://开头pkijs ,你可以看到一个早期签名验证演示在这里: https://pkijs.org/examples/PDFexample.html我们还没有与PDFjs集成,但将在不久的将来做到这一点。 我们的意图是将大多数内容作为OSS发行,并退还对PDFjs进行的所有更改,以使集成顺畅。

太好了,谢谢@rmhrisk! 但是,我不确定如何创建CA捆绑文件。 您是否有有关操作方法的详细信息? 我可以想象,当将它与pdf.js集成时,默认情况下Adobe Root CA随附它会更加“即插即用”,并且可以验证证书链,对吗? 您是否有预期的pdf.js集成时间表? 非常感谢您的工作!

这里有一个: http :

有一个工具可以在这里创建一个: https :

我目前无法共享ETA,我们的资源有限,这对我们很重要,但我们需要先完成一些更复杂的部分。

我尝试了所链接的证书,以及一些尝试使用Adobe Reader从PDF提取的证书,但始终收到错误“ TypeError:无法读取未定义的'signature_time_stamp'属性”(在Safari / Chrome稳定版/ Chrome中金丝雀)。

我恰好在下周有时间,所以请告诉我是否可以通过任何方式帮助您合并到pdf.js中。

该样本仅支持基本签名,目前不支持时间戳或LTV。 随时通过unmitigatedrisk dot com在rm ping我

知道了供参考,最后使用此CA捆绑包此PDF文件使其在Chrome / Firefox(但Safari,显然仅支持前缀WebCrypto )中无法工作。

没错,不仅是前缀问题,而且它们还仅支持足够的webcrypto来处理netflix drm案例。 例如,他们不允许您导出生成的密钥对的公共密钥! 这是verifing浏览器支持一个很好的资源- https://diafygi.github.io/webcrypto-examples/

@viveksjain您可以确认如何在Chrome / Firefox中运行它吗

我尝试在firefox中使用开发插件,但是它似乎仍然无法显示签名。
http://mozilla.github.io/pdf.js/extensions/firefox/pdf.js.xpi

@complience,他获得了位于https://pkijs.org/examples/PDFexample.html的示例代码,而不是PDFjs

@complience ,我在https://github.com/viveksjain/pdf.js/tree/sig-verify-support上有一个概念验证git clone --recursive https://github.com/viveksjain/pdf.js.git进行尝试。 要做更多的工作,应该准备向该存储库发出拉动请求,但是我还没有时间。

@viveksjain不错! 在准备拉取请求之前,还需要什么?

+1很高兴获得此功能。

是的,这将为社区带来巨大的价值,为许多用例打开大门。 谢谢!!

为此功能+1

为此功能+1

对于以上所有人员,请使用GitHub的新+1反应按钮,而不要在此处添加评论。

此功能+1

👍+1表示此功能

同样,请使用顶部评论上的GitHub反应按钮升级此功能,这将有助于我们确定问题的优先级。 添加“ +1”注释会对开发人员造成不必要的通知。

使用@viveksjain的分支“ TypeError:无法读取未定义的属性'signature_time_stamp'”

+1。 等待此功能!

该功能何时可用? Viveksjain的进度发生了什么?

@complience嗨,我有一个概念验证,工作在https://github.com/viveksjain/pdf.js/tree/sig-verify-support。 您可以使用git clone --recursive https://github.com/viveksjain/pdf.js.git进行尝试

@lexcorp不幸的是,在我上一封邮件之后,这已成为我的低优先级。 我会看看我能否解决这个问题,但不会做出我无法兑现的承诺……

我正在尝试编译此版本: https :
当我输入命令:节点使通用
我收到消息: ###获取扩展内部版本号
并且不执行编译过程

如何解决此错误?
我做错了什么?
为什么不结束编译?

@lexcorp如果仍然有兴趣,至少我的版本已更新到足以编译。 :+1:

嗨,Vivek,是的,我还是很感兴趣,谢谢...

2016-12-12 12:55 GMT-06:00 Gustavo Zambonin通知@ github.com:

@lexcorp https://github.com/lexcorp如果仍然有兴趣,请访问
至少我的版本已更新到足以编译。 👍

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/1076#issuecomment-266518165
或使线程静音
https://github.com/notifications/unsubscribe-auth/AFfB-LbmIVIrJLnxwJlm8aDITDKh5tWLks5rHZi5gaJpZM4BlvMP

嗨,古斯塔沃,谢谢...

2016-12-12 12:55 GMT-06:00 Gustavo Zambonin通知@ github.com:

@lexcorp https://github.com/lexcorp如果仍然有兴趣,请访问
至少我的版本已更新到足以编译。 👍

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/mozilla/pdf.js/issues/1076#issuecomment-266518165
或使线程静音
https://github.com/notifications/unsubscribe-auth/AFfB-LbmIVIrJLnxwJlm8aDITDKh5tWLks5rHZi5gaJpZM4BlvMP

为什么不将对数字签名的支持纳入pdf.js中会有问题吗?

请按照#7702中的讨论进行操作。

我很想听到人们关于他们在PDFjs中进行签名验证的用例的信息。 请把您的用例通过电子邮件发送给ryan,网址为peculiarventures.com。

如果您关心这种情况,我也想听听您的使用PDFjs签名的用例,我也想听听您的用例。

pdf.js的sig-verify-support分支不支持IE和Firefox,这完全导致无法获取WebCrypto,有什么想法要解决吗?

嗨,大家好-数字签名验证已经在起作用吗?

此处存在相同的问题:数字签名是否应该与可从https://mozilla.github.io/pdf.js/getting_started/#download下载的最新稳定版本一起使用?

FWIW:我已经测试了当前可用的beta版本,看不到任何签名。 我唯一注意到的是浏览器控制台中的以下行:

Warning: Unimplemented widget field type "Sig", falling back to base field type

否,尚未实施数字签名。 欢迎愿意为此工作的任何人提交请求请求。 谢谢。

我要使用此功能。 有人可以给我一些有关PDF.js内部组件的准则吗?

您可能可以使用上面提到的一些初始工作。 确保阅读Wiki以获取代码风格和测试说明。

@wolvz :嗨,

大多数用户虽然会使用稳定版本文件。

由于在发布Mozilla Firefox 59 ESR时将不再使用Adobe Acrobat插件,因此企业用户在pdf.js中确实需要显示数字签名之类的功能。

我们已经实现了基于PKIjs和PDFjs的数字签名解决方案,该解决方案能够验证和创建数字签名。 您可以在此处查看查看美国数字签名法的示例。

image

查看器当前信任eIDAS信任列表上的CA,以及Mozilla信任的S / MIME颁发者。

如果您遇到任何问题,请给我发送电子邮件[email protected]并提供示例文件。

@rmhrisk您可以为GitHub存储库提供示例代码吗?

@xrkolovos进行签名和验证工作所需的大部分工作都是开源的; 它包括https://github.com/PeculiarVentures/PKI.jshttps://github.com/PeculiarVentures/ASN1.jshttps://github.com/PeculiarVentures/xadesjs/https://github.com / PeculiarVentures / tl-createhttps://github.com/PeculiarVentures/webcrypto-liner。

我们还最终创建了自己的PDF库(尽管我们使用PDFjs进行渲染),因此我们可以创建PDF允许的多种不同类型的签名。 该图书馆最终将被公开,但目前尚未准备好供公众使用。

查看器的来源不会公开,但是使用上述库,有人可以在其自己的查看器中复制验证。 我们在此处提供了一个有关如何执行此操作的基本示例: https

何时将其与pdf.js合并?

在这一点上, @ Aarbel我不知道何时才能找到重构我们所拥有内容的时间,以便可以轻松地将其合并,但是我们希望看到在PDFjs中进行验证。 如此说来,由于必要的依赖关系,PDFjs团队先前已经对该功能将代表的大小表示担忧。 只要这是一个问题,那么花费工程时间进行这项工作就没有任何意义。

恕我直言,如果在Chrome 59或Edge可以读取数字签名的情况下未在Firefox 59(ESR)发布之前实施它,则意味着Firefox在企业中已结束。

@FrenchHope Firefox的Chrome都无法验证数字签名。

此功能有任何更新吗?

@Snuffleupagus @yurydelendik @timvandermeij吗? :)

正如我在https://github.com/mozilla/pdf.js/pull/7702#pullrequestreview -4866355中解释的那样,第一步将是创建一个抽象API,该API允许将任何自定义PKI / crypto与PDF.js集成。

@rmhrisk我不在乎Chrome用户。 我关心Firefox企业用户。 如果Firefox无法再使用Adobe Acrobat Reader插件验证数字签名,则许多人现在将使用Edge浏览器或Internet Explorer。

现在有许多公司迁移到Windows 10 ...

Edge或IE都不能。

@rmhrisk IE可以使用Adobe Acrobat Reader ActiveX。

编辑:Edge可以显示数字签名,但不能像Adobe Acrobat Reader那样通知您签名的有效性。

ActiveX已被弃用,最终将无法使用。

边缘不会下雪数字签名,无论签名的状态如何,它都会在批注中显示图像。

您好,此功能的当前状态是什么?

现在还没有开发,但是最近有人对IRC上的代码表现出了兴趣。 第一步实际上是https://github.com/mozilla/pdf.js/issues/1076#issuecomment -374244765。

嗨,您有没有像Dic 2018或2019这样的发布日期?
顺便感谢您的PDF查看器,效果很好

我想实现上面提到的简单修复程序...注释掉以下几行:

// Hide signatures because we cannot validate them.
          if (data.fieldType === 'Sig') {
              _this2.setFlags(AnnotationFlag.HIDDEN);
          }

但是,这会导致控制台错误(来自util.js:418)。 有谁知道导致此问题的原因(除了现在显示签名的事实以外)?

错误:

Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope': function nonSerializableClosure() {
          return nonSerializable; // creating closure on some variable
        } could not be cloned.
    at eval (http://localhost:8888/src/shared/util.js:418:20)

@brianholle
我试过了,如果你注释掉

 if (data.fieldType === 'Sig') {
      warn('unimplemented annotation type: Widget signature');
     // this.setFlags(AnnotationFlag.HIDDEN);
    }

在内置的pdf.worker.js中,则可以正常工作。

至少为此提供选项会很好。 例如,在我们的例子中,我们已经知道签名是有效的,因为我们之前已经验证了签名。

@strazovan谢谢,并同意。 我创建了一个可以在default_preferences.json中设置的标志。 如果您有兴趣,我可以发布这些更改!

@brianholle您好,我将按照您的示例。 带有此代码注释的chrome可以正常显示,但IE浏览器中经过数字签名的图像会遮盖文本。

@hanxiaodao您是在注释掉阻止代码时说的:

 if (data.fieldType === 'Sig') {
      warn('unimplemented annotation type: Widget signature');
      // this.setFlags(AnnotationFlag.HIDDEN);
 }

您在IE中显示有问题吗?

@brianholle谢谢您的答复。 我遵循您的示例,但是IE 11中存在问题。数字签名的红色章节遮盖了文本内容。
这是对铬的影响。
chrome pic
这是对IE11的影响。
ie11_pic

如果要在签名验证中付出任何努力,我们可以从维护者那里得到任何估计吗?

目前,这不是我们的优先事项,但是如果有人想为此做出贡献(请参阅上面的评论以了解如何实现),那么我们愿意考虑将其集成到PDF.js中。

我们也有兴趣展示无法验证的数字签名。 请参阅随附的示例。
Verpf-Erklärg-Bundesdatenschutz-Sig.pdf

当我评论:
如果(data.fieldType ==='Sig'){
// this.setFlags(AnnotationFlag.HIDDEN);
}

错误:

message_handler.js:87 Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope': #<DedicatedWorkerGlobalScope> could not be cloned.
    at eval (http://localhost:8888/src/shared/message_handler.js:87:21)

以及为什么不呈现“ div。注释图层”

哈哈,我知道这个……与#10350有关。 因此,您需要注释以下行:
// this.setFlags(AnnotationFlag.HIDDEN);
并在此之后添加以下行:
data.fieldValue = null;

如何配置pdf或pdf_viewer以启用控制图章显示开关的util.js? util.js文件中有一些AnnotationFlag选项,例如INVISIBLE 0x01,HIDDEN 0x02。 我将pdf.worker.js中的AnnotionFlag从HIDDEN修改为PRINT。 我可以不这样配置它们吗?

应该是一个非常不错的功能。 希望这将是一个功能!

任何人都知道任何可靠的解决方法吗? 编辑构建的文件只能在本地运行或用于测试目的,仅此而已。

pdfjs是一个死项目吗? 为什么他们这么多年来没有实现人们最想要的功能?

image

我想实现在PDF.js中的某个地方显示一个小的通知,通知您数字签名未通过验证。 我可以在Chrome上运行,但不能在其他浏览器上运行。 这与最佳情况相去甚远,但是我们确实希望显示这些签名,即使它们没有经过100%验证。 我试图在this.setFlags(AnnotationFlag.HIDDEN);处更改pdf.worker.js代码。 站立。 我添加了一个“ document.getElementbyId”结构,当有1个或多个签名时,我在其中显示我的容器。 但是,所有浏览器(Chrome浏览器除外)都无法识别“文档”。 是否可以选择在文档或其他内容上添加属性,然后在viewer.js中使用它? getElementbyId有更多构造。 任何帮助都是极好的。

最近,我们将支持签名验证的查看器包装到了Web组件和iframe中; 您可以在此处找到有关如何使用它的更多信息: https :

rmhrisk很棒!!!

@brianholle谢谢您的答复。 我遵循您的示例,但是IE 11中存在问题。数字签名的红色章节遮盖了文本内容。
这是对铬的影响。
chrome pic
这是对IE11的影响。
ie11_pic
我在IE中有同样的问题,您解决了吗?

我们的组织由2000多人组成。 他们都使用Chrome,而不是Firefox,因为Firefox无法正确显示PDF的签名。
我认为这应该是Mozilla的优先事项。

@wolvz :您这方面有进步吗?

+1

+1

最近,我们将支持签名验证的查看器包装到了Web组件和iframe中; 您可以在此处找到有关如何使用它的更多信息: https :

@rmhrisk
Ryan,您是否考虑过向社区开放此可视化工具的版本?

我们已经实现了基于PKIjs和PDFjs的数字签名解决方案,该解决方案能够验证和创建数字签名。 您可以在此处查看查看美国数字签名法的示例。

image

查看器当前信任eIDAS信任列表上的CA,以及Mozilla信任的S / MIME颁发者。

如果您遇到任何问题,请给我发送电子邮件[email protected]并提供示例文件。

@rmhrisk
Ryan,您是否考虑过向社区开放此可视化工具的版本?

@lexcorp我们制作了https:/verify.ink,因此您可以轻松地将我们的查看器嵌入为Web组件。

添加起来很简单:

<html>
  <body>
    <verify-viewer  url="https://verify.ink/assets/documents/electronic_records_and_signatures_in_commerce.pdf"  show-signature-if-present="true"  notify-if-not-signed="true"  sign="true"  download="true"></verify-viewer><script type="module" src="https://verify.ink/webcomponent/index.js"></script>
    </body>
</html>

我们最近还添加了对自定义根存储的支持:
https://verify.ink/guides#root -certificates

从与数字签名相关的各种线程中,我得到的印象是,缺少进度的主要原因是它无法验证签名作为显示它们的前提。

区分两个用例“验证签名”和“显示签名”是否有意义?

我认为在很多用例中,即使没有经过验证的签名显示(如果需要,并由特定项目团队添加警告)也足够了。 如果对代码进行少量修改就已经可以实现,那么为什么不能打开或关闭官方功能呢?

如果签名无效,则显示签名的问题是您给用户印象是有效的。

数字签名不同于人工合成的数字签名,旨在既表示签名的真实性,又表示与其相关的意图。

通过显示签名图像而不进行验证,就可以向用户建议该签名图像是真实的,但它可能只是图像的副本。

但是,并非所有有效的数字签名都会在PDF中具有视觉表示,对吗? 据我所知,PDF还允许在没有视觉表示的情况下签名。

库用户是否应该决定他的应用程序/用例是否允许显示有效/无效签名,或者是否需要采取其他措施(例如警告)? 我想到的一个用例是在PDF中标记区域,同时还要考虑签名区域。 尽管最终验证需要其他工具,但它仍然可以提供信息。 我没有看到将显示作为可选功能提供的缺点。

但是,并非所有有效的数字签名都会在PDF中具有视觉表示,对吗? 据我所知,PDF还允许在没有视觉表示的情况下签名。

两种说法都是正确的1)并非所有PDF都包含视觉表示(尽管大多数)。 2)PDF确实允许文档范围内的签名。 但是,在此错误中,我看到的是显示与数字签名相关联的可视签名而不是文档范围签名的兴趣。

可能存在另一个文件错误以支持文档范围的签名,该错误没有可视化表示,但是我不记得存在于数字签名中与PDFjs相关的任何错误中对此的单个请求。

库用户是否应该决定他的应用程序/用例是否允许显示有效/无效签名,或者是否需要采取其他措施(例如警告)?
我个人认为应用程序开发人员应该可以选择对应用程序执行任何操作。

但是,还有一个问题,像PDF.js这样的库也应该选择做什么。 我认为,暴露出一种不安全,容易被误解并会给图书馆的最终最终用户带来不良安全后果的选择,图书馆生产者应该不会轻易这么做。

想象一下,如果此功能完善,那么在隔离COVID-19的过程中会很有帮助,想象一下有多少交易,合同等。

他们本可以在家中进行的,但是我目睹了该功能已经停滞了多年,我不知道原因,但我认为与其他工具结合使用可能对协作工作,家庭办公,等等

我完全同意。 在未来几年中,数字签名将变得越来越有价值。 我的用例是用于医疗设备开发的工具。 没有数字签名,我们在家庭办公室的日常工作实际上将更加困难。 这就是为什么我将其留给项目使用库的原因,以便在风险和客户价值之间进行权衡或采取适合其特定用例的其他措施。

我也完全同意,数字签名确实是一个很大的缺失功能。

但是,还有一个问题,像PDF.js这样的库也应该选择做什么。 我认为,暴露出一种不安全,容易被误解并会给图书馆的最终最终用户带来不良安全后果的选择,图书馆生产者应该不会轻易这么做。

该库由开发人员实现,注意安全性。
就我而言,如果我具有该功能,那么我当然会显示签名,但还要检查并验证签名服务器端,以便在签名无效时显示警告。

@rmhrisk
您是否打算向社区开放源代码? 因为我没有一个唯一的案例,可以1 /允许文档在Internet上可用2 /允许第三方访问文档3 /允许第三者在用户浏览器中注入JavaScript。
那将是pdfjs的绝佳补充。

@rmhrisk
您是否打算向社区开放源代码? 因为我没有一个唯一的案例,可以1 /允许文档在Internet上可用2 /允许第三方访问文档3 /允许第三者在用户浏览器中注入JavaScript。
那将是pdfjs的绝佳补充。

我们将用于创建查看器的每个库都开源,其中有很多,很多都非常复杂。 例如,查看为查看器处理证书验证的PKIjs部分。 我们还提供商业许可证并提供支持。

我们不会开放观众资源,这会使这项工作花费大量时间和投资,并且时间很有价值。 但是,我们很乐意支持其他人使用我们创建的开源库来实现这一目标。

回复:1; 查看器不需要文档就可以在互联网上。

回复:2; 查看器不需要让第三方访问文档。

回复:3; 可以托管Web组件,以便您可以查看和控制对该组件的更新。

我也完全同意,数字签名确实是一个很大的缺失功能。

但是,还有一个问题,像PDF.js这样的库也应该选择做什么。 我认为,暴露出一种不安全,容易被误解并会给图书馆的最终最终用户带来不良安全后果的选择,图书馆生产者应该不会轻易这么做。

该库由开发人员实现,应该注意安全性。
就我而言,如果我具有该功能,那么我当然会显示签名,但还要检查并验证签名服务器端,以便在签名无效时显示警告。

“应该”和“是”是两个不同的东西。 当签名无效或不受信任时显示签名图像是一个很好的例子,说明人们可能在不完全了解后果的情况下做出的决定。

想象一下,如果此功能完善,那么在隔离COVID-19的过程中会很有帮助,想象一下有多少交易,合同等。

他们本可以在家中进行的,但是我目睹了该功能已经停滞了多年,我不知道原因,但我认为与其他工具结合使用可能对协作工作,家庭办公,等等

我完全同意,这就是为什么我们创建并开源所有使我们的查看器成为可能的库的原因。 这也是为什么我们让人们免费使用我们的查看器的原因。

归功于我们所做的工作,当然可以使某些人可以轻松地重新创建我们所做的查看器工作,并将相关的PR提交给PDFjs,我们甚至很乐意对这些PR进行代码编写。

我需要在我的Angular CLI应用程序中显示pdf,这是在签名的有效性无关紧要的情况下,唯一重要的部分是显示准确。
我的测试用例是带有Adobe数字签名的pdf示例。
当我已经尝试了许多答案时,我将在下面总结我的研究结果。

我看到的最常见的答案是在pdf.worker.js中注释以下几行(第48353至48355行):

if (data.fieldType === 'Sig') {
      //this.setFlags(AnnotationFlag.HIDDEN);
 }

但是,这没有用。

在注释中直接在pdfjs-dist中注释以下行也不行(第285到287行):

case 0:
        this.color = null;
        break;

即使我不知道如何放置给定的代码行,也行不通:
(<any>window).pdfWorkerSrc = '<path_to_file>/pdf.worker.js';

我试图至少在页面中获取注释,但是每个页面都返回一个空数组:

page.getAnnotations().then(function(annotations) {
     console.log('annotations loaded');
     console.log(annotations);
     for (let i = 0; i < annotations.length; i++) {
          console.log(annotations[i].subtype);
      }
 }, function (reason) {
     console.log(reason);
}); 

对于我的应用而言,按原样显示pdf很重要。 至少,我希望能够获得签名的边界矩形以代替它们显示一个占位符。
有人可以帮我吗?

我需要在我的Angular CLI应用程序中显示pdf,这是在签名的有效性无关紧要的情况下,唯一重要的部分是显示准确。
我的测试用例是带有Adobe数字签名的pdf示例。
当我已经尝试了许多答案时,我将在下面总结我的研究结果。

嗨,我认为您的第一次尝试就差不多了……您是否尝试过这个https://github.com/mozilla/pdf.js/issues/1076#issuecomment -446959325?

我只是试过了:什么都没有改变。
还有其他想法吗?

这个问题已经开放了一段时间,目前解决该问题的计划是什么,我们如何提供帮助?

如果我不能显示签名,至少,我想在应该放置的地方显示一个占位符矩形。
(只需知道x,y坐标以及签名的宽度和长度)

当然,显示签名仍然是最好的方案(再次,我不需要在我的特定用例中对其进行验证)。

是否可以添加一个渲染选项来显示未验证的签名?
这样,pdf.js的用户可以决定是否要承担显示它们的风险。

显示无效的加密签名与显示未正确验证的签名一样糟糕:
https://www.pdf-insecurity.org/

如果以前通过后端服务正确验证了签名怎么办?
这意味着签名是可以的,但仍无法在客户端应用程序中显示。

显示或不显示签名的渲染选项将使pdf.js的用户能够以某种方式验证签名,然后自行决定是否显示签名。
这也将减轻pdf.js开发人员的负担,使其根本无法提供签名验证,因为这可能不属于pdf渲染库的一部分。
完全不显示签名会限制pdf.js的用例。

如果以前通过后端服务正确验证了签名怎么办?
这意味着签名是可以的,但仍无法在客户端应用程序中显示。

显示或不显示签名的渲染选项将使pdf.js的用户能够以某种方式验证签名,然后自行决定是否显示签名。
这也将减轻pdf.js开发人员的负担,使其根本无法提供签名验证,因为这可能不属于pdf渲染库的一部分。
完全不显示签名会限制pdf.js的用例。

在服务器和客户端之间进行验证就可以了。 暴露一个标志以将签名显示为有效和已验证是脚枪。

在服务器和客户端之间进行验证就可以了。 暴露一个标志以将签名显示为有效和已验证是脚枪。

我们正在处理经过验证的签名,但无法使用pdf.js在客户端浏览器中显示它们(无黑客攻击)
那么,您建议在客户端浏览器中呈现PDF的其他方法是呈现已验证签名的视觉表示吗?

您可以在部署之前修补PDFjs,使其具有所需的行为?

这就是我所说的“黑客”的意思,而这正是我们目前被迫做的事情:-(

我不明白为什么我们仍在问有关问题本身的问题:“ hacks”甚至对我没有用,而我仍然有需要。

在我的用例中,签名的有效性不成问题。 但是,我需要显示它们,或者至少让用户知道那里有“东西”,而不仅仅是画布的空白部分。
我不在乎该API是否带有一个巨大的红色警告段落,说明未经验证的签名,或者它是否迫使我在法律上说无法进行验证,或者是否警告我该风险自担。
...我只需要显示签名。

至少,我真的希望在文档上具有签名的位置和大小,以便我可以在其位置显示一个灰色框,上面写着“嘿,用户,应该在那里有一个签名”。在他们。

当前,用户无法在该位置知道文档已签名。
这不是更坏的磨练方法吗?

如果有一个布尔值允许将文档的所有数字签名显示为透明的灰色模板框,那将足够满足,并且该功能不会引起任何道德/安全问题。

(我还要说的是,自2012年以来,仅在此线程中,该问题就一直在待解决,仅发表了100条评论。我不认为我是唯一等待该功能的人)

灰色框似乎更像是一个渲染错误,并且很可能会使提供的支持热线:-)超载
我们有一个可以使用的hack,目前可以正常运行,但是非常难看:

  1. 下载pdfjs-dist的当前,编译和缩小版本
  2. 在转译的版本中修补有问题的行。
  3. 作为新的私有软件包发布到内部npm-repo。
  4. 使用补丁包而不是原始的pdfjs-dist包。

丑陋吧? 但是它可以工作,并且可以很好地呈现嵌入的签名。

灰色框似乎更像是一个渲染错误,并且很可能会使提供的支持热线:-)超载

是的,是的,是的,我的意思是*可以包含*的pdf包含无法验证的数字签名的任何模板/图像/消息,因此不会显示。 如果消息解释了用户可以理解的任何内容。

  1. 在转译的版本中修补有问题的行。

我目前使用的是在我的node_modules中安装了pdfjs-dist的Angular CLI,但是我之前写过的任何解决方案都对我不起作用,而且也不起作用:

嗨,我想您第一次尝试就差不多了...您尝试过此#1076(评论)吗?

我错过了什么吗?还是我的案子太特殊了?

我们按照此线程中的说明进行操作。
https://github.com/mozilla/pdf.js/issues/4743#issuecomment -163953288

我们基本上更改了这一部分:

// Hide unsupported Widget signatures.
if (data.fieldType === 'Sig') {
   warn('unimplemented annotation type: Widget signature');
   this.setFlags(AnnotationFlag.HIDDEN);
}

对此:

// Hide unsupported Widget signatures.
if (data.fieldType === 'Sig') {
   warn('unimplemented annotation type: Widget signature');
}

我知道您可以删除整个“如果”,但我们需要尽可能小的补丁。

kes 那确实是对我不利的修复方法。
当我回到应用程序的pdf显示部分时,我会再试一次。
我还没有创建自己的程序包,但是上次尝试直接在node_modules / pdfjs-dist中更改文件并没有任何更改。

您是否同时更改了文件pdf.worker.jspdf.worker.min.js
这在我们的方法中是必要的。

您是否同时更改了文件pdf.worker.jspdf.worker.min.js
这在我们的方法中是必要的。

您提出了一个我可能忽略了的绝妙观点!
我今天会尽快尝试,看看是否可行。

嗨,我喜欢您的方法,但不幸的是,它对我没有用
我改变了这样的行:

我们按照此线程中的说明进行操作。
#4743(评论)

我们基本上更改了这一部分:

// Hide unsupported Widget signatures.
if (data.fieldType === 'Sig') {
   warn('unimplemented annotation type: Widget signature');
   this.setFlags(AnnotationFlag.HIDDEN);
}

对此:

// Hide unsupported Widget signatures.
if (data.fieldType === 'Sig') {
   warn('unimplemented annotation type: Widget signature');
}

我知道您可以删除整个“如果”,但我们需要尽可能小的补丁。

然后,我用gulp generic构建了它并使用了构建的资源。

您是否同时更改了文件pdf.worker.jspdf.worker.min.js
这在我们的方法中是必要的。

pdf.worker.js是构建的,但是您提到了pdf.worker.min.js ,它是如何构建的以及在哪里存储?
我想念什么?

在此先多谢

@ ll-priva我们不是自己构建pdf.js。
就像我在评论中说的https://github.com/mozilla/pdf.js/issues/1076#issuecomment -658601553我们实际上下载了已构建的pdfjs-dist版本并修补了捆绑的pdf.worker.js版本pdf.worker.min.js

我在https://github.com/mozilla/pdf.js/issues/1076#issuecomment -658609803中的解释可能不清楚,抱歉。
我们通过修补预构建的软件包https://www.npmjs.com/package/pdfjs-dist来实现上述解决方案
然后,我们使用pdf.worker.jspdf.worker.min.js这些修补版本将私有的pdfjs-dist软件包推送到我们的内部npm存储库中。
最后但并非最不重要的一点是,我们在生产代码中使用了此补丁版本,而不是正式的pdfjs-dist软件包。

我希望这会使我们的方法更清晰。

@PSpSynedra非常感谢。 这也对我有用

几周来我第一次回到这项任务,但它仍然无法正常工作。
目前,我还没有制作自己的私有软件包:只要不重建,直接修改node_modulespdfjs-dist中的文件就可以了(在本地,那么我实际上必须将修改后的pdf.js导入为资产或包装)。

在文件夹中搜索“ Sig”会给出4种不同的文件结果:

  • pdfjs-dist \ buildpdf.worker.js
  • pdfjs-dist \ buildpdf.worker.min.js
  • pdfjs-dist \ es5 \ buildpdf.worker.js
  • pdfjs-dist \ lib \ core \ annotation.js

我编辑了所有这4种情况,以删除“ if”的内容,该内容清除了签名字段并设置了一个标记以隐藏它,如上所述。
没什么不同:getAnnotations()返回一个空数组,并且现有签名仍然不显示。

我还在控制台中仍然收到此消息,甚至没有错误或警告(pdf.worker.js:2965:14):

警告:未实现的窗口小部件字段类型“ Sig”,回落到基本字段类型。

通过查看代码,这意味着注解.js将其包装在“基本” WidgetAnnotation中,这意味着消息似乎不是问题,仅是我删除的标志。

我想念什么吗? 我编辑了min.js文件以及js文件,它们都位于build文件夹中,因此应该是使用的文件,因此一切都应该正常工作...
@ ll- priva

@Epsiom这就是我刚刚做的,它在大约5分钟内为我工作: https :

您需要同时注释掉this.setFlags(AnnotationFlag.HIDDEN);以及添加data.fieldValue=null 。 我修改过的唯一文件是pdf.worker.js ,在我们的例子中是pdfjs-dist库中的文件,因此已经缩小了

@Epsiom和其他可能会在这里结束。
我遇到了同样的问题,无法编辑pdf工作文件。

就我而言,我正在使用https://github.com/VadimDez/ng2-pdf-viewer在有角度的应用程序中显示pdf。 该模块直接从cloudflare而非本地文件加载pdf worker。 因此,请检查该Web应用程序是否确实在使用修改后的pdf.worker.js文件。 您可以通过在控制台中单击“未实现的窗口小部件”字段中键入“ Sig”警告来进行检查,并将鼠标移至文件名。

@konum警告来自“ http:// localhost :4200 / assets / vendor / pdf.worker.js”,但是我已经注释掉了该文件的两行,如前所述:
if (data.fieldType === 'Sig') { //this.setFlags(AnnotationFlag.HIDDEN); //data.fieldValue = null; }

仍然看不到数字签名...

@Epsiom也不适合我。 仍在调查。

@Epsiom设法使签名可以查看。 在pdf.worker.js中将此添加到第18480行
案例“ Sig”:
返回新的SquareAnnotation(parameters);

开关刚好在这条线的上方吗?
(0,_util.warn)('未实现的小部件字段类型“'+ fieldType +'”,'+“回落到基本字段类型。”);

@konum不适用于我:
ERROR Error: Uncaught (in promise): Object: {"message":"SquareAnnotation is not defined","stack":"AnnotationFactory_create<strong i="7">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:47999:7\nget annotations<strong i="8">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:48877:43\nLocalPdfManager_ensure/<<strong i="9">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49204:21\nLocalPdfManager_ensure<strong i="10">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49202:14\nPage_getOperatorList<strong i="11">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:48815:43\nwphSetupRenderPage/<<strong i="12">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49883:13\n"} AnnotationFactory_create<strong i="13">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:47999:7 get annotations<strong i="14">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:48877:43 LocalPdfManager_ensure/<<strong i="15">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49204:21 LocalPdfManager_ensure<strong i="16">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49202:14 Page_getOperatorList<strong i="17">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:48815:43 wphSetupRenderPage/<<strong i="18">@http</strong>://localhost:4200/assets/vendor/pdf.worker.js:49883:13

@Epsiom您是否在使用最新版本的pdf.js? 在pdf.worker.js中,应该定义SquareAnnotation类。

@Epsiom只是为了澄清,仅应评论this.setFlags(AnnotationFlag.HIDDEN);data.fieldValue = null;如果不存在则应添加,但不应对其进行评论。

我们还使用了pdfjs-dist包,因此,根据之前的评论,我们直接对其进行了修改。 您确定要修改的代码实际上正在执行吗? 如果它在node_modules中,则取决于您的构建,其中的某些资产可能会被缓存,并且您实际上可能未在使用修改后的代码。

@kjhangiani我清楚地记得在控制台中显示了任何添加的console.log,因此可以清楚地执行它。
回到该任务时,我将尝试添加data.fieldValue = null; ,看看是否可行。

添加data.fieldValue = null;早在if (data.fieldType === 'Sig')块,还有一个console.log("TEST")以防万一,什么都没有发生,而“TEST”正确显示在控制台中,常规的后Warning: Unimplemented widget field type "Sig", falling back to base field type.消息。

还有其他想法吗?

@Epsiom设法使签名可以查看。 在pdf.worker.js中将此添加到第18480行
案例“ Sig”:
返回新的SquareAnnotation(parameters);

开关刚好在这条线的上方吗?
(0,_util.warn)('未实现的小部件字段类型“'+ fieldType +'”,'+“回落到基本字段类型。”);

那对我有用,您节省了我的时间,谢谢。

@yduybya您的项目最近吗?
有什么特殊性吗?
我认为我需要更新pdf.js版本,然后重试,即使它是最近的版本。

有什么简单的方法可以在Angular 9应用程序上更新pdf.js吗?
我在这里(http://mozilla.github.io/pdf.js/build/pdf.worker.js)找到了新的pdf.worker.js,但是(显然)仅替换该文件无效。

我将项目追溯到https://github.com/mozilla/pdf.js/issues/8836https://github.com/ashishyadav0019/pdfJS_angular4_Ts.git ,但是这些项目都使用了过时的文件。

pdf.js github和pdfJS_angular4_Ts.git上的文件不相关。
有谁知道如何在Angular 9项目中正确导入pdf.js和最新文件?

@Epsiom对于Angular 8应用程序)我认为它应该在Angular 9上运行)我正在使用https://github.com/VadimDez/ng2-pdf-viewer。

来自ng2-pdf-viewer文档:
默认情况下,从cdnjs.cloudflare.com加载工作程序。
在代码中,指向工作程序的更新路径为/pdf.worker.js
(任何视窗).pdfWorkerSrc ='/pdf.worker.js';
应该在呈现pdf-viewer组件之前进行设置。

使用此项目会将pdfjs-dist依赖项添加到您的项目中。 使用squareAnnotation提示编辑node_modules / pdfjs-dist / build / pdf.worker.js。

@konum我受此启发而直接使用pdf.js而不是ng2-pdf-viewer出于多种原因: https :
我有pdfjs-dist依赖性,但使用的是src/assets/vendor/pdf.worker.js
任何想法 ?

@Epsiom您是否尝试将pdf.js和pdf.worker.js文件都更新为最新代码?

@konum正是我要尝试的方法,但是由于Angular中很少使用pdf.js,因为大多数项目似乎只需要ng2-pdf-viewer,并且由于最新版本的pdf.js中使用的文件不同,乍看之下,这样做的过程远非显而易见。

你好,

评论this.setFlags(AnnotationFlag.HIDDEN); pdf.worker.js中的v2.6.347版本不显示签名图像。

那里有变化吗?

@lainosantos是的,有一个变化。 如果停用表单渲染,则将再次显示签名。

@stephanrauh谢谢。

PDFViewerApplicationOptions.set('renderInteractiveForms', false);

有没有一种启用表格和显示签名的方法?

@lainosantos不,但是我发现了一个很好的renderInteractiveForms无效。 它使用Angular,但我想即使您使用其他框架,您也可以提炼出这个主意: https :

我目前有更多紧急事情,不能花时间在任务上,但是如果有人设法在Angular 9上导入最新的pdf.js版本,他将深表谢意。

@Epsiom您在这里:https:

@stephanrauh ...好吧,除了我需要兼容IE11,并且只直接使用画布来拥有定制的pdf查看器,所以可悲的是我不能使用它。
我不能使用ng2-pdf-viewer或任何类型的东西,我真的是在问pdf.js本身,这确实是一个小众案例。

此页面是否有帮助?
5 / 5 - 1 等级

相关问题

timvandermeij picture timvandermeij  ·  4评论

xingxiaoyiyio picture xingxiaoyiyio  ·  3评论

liuzhen2008 picture liuzhen2008  ·  4评论

SehyunPark picture SehyunPark  ·  3评论

patelsumit5192 picture patelsumit5192  ·  3评论