- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Web 应用程序,它当前正在从服务器获取 PDF 的 base64 表示。我可以使用 Mozilla 的 pdf.js 在 上显示它并使用下拉菜单切换页面。
根据我所能找到的一切和Can Mozilla's pdf.js modify PDFs? ,无法使用 pdf.js 编辑 PDF。
我找到了 jsPDF虽然我可以拿起 Canvas 做 .toDataURL()
为每个页面使用它并用它构建一个新的PDF文档,但有两个问题:
1 Câu trả lời
快速回答 - 不,您不太可能找到跨浏览器的解决方案。您不太可能找到完美的 PDF 解决方案。最好考虑让用户编辑 HTML 并在服务器上生成 PDF。
[编辑 2021 年 6 月 29 日-鉴于此问题来自 2017 年,您可能认为它已过时并打折。好吧,据我所知,答案仍然是相关的,每隔一周就会有人通过并给它一个赞成票。但是,如果您确实在旅途中找到了一个好的库或实用程序,请回来并列出它。谢谢。]
答案很长——PDF 格式既精彩又不俗。因其便携性而出色,但因其内部结构和存储机制而令人讨厌。没有像 HTML 那样友好的“DOM”。如果我们重新开始开发可移植的文档格式,我们不会选择 PDF。但是 PDF 目前有太多的动力不能被抛弃,时期。
年轻观众可能想知道这种狂躁的格式到底是如何进入市场领先地位的,以及它来自哪里。嗯,当 PDF 的创始人制定设计时,在 XML、JSON、HTML 甚至 Internet 出现之前,他们并没有考虑到今天的文档共享。他们正在研究一种更好的方式来编码打印指令 - PostScript 打印机驱动程序概念。在打印机消耗它们之前,从不期望它们被编辑,并且它们对于任何其他目的毫无值(value)。然后有人注意到您可以将 PostScript 绘图指令解释到屏幕上,随后有人发现将其用作可移动的跨设备显示概念的巨大潜力。我们来了。
回到问题 - 要以任何有意义的 GUI 方式编辑 PDF,您需要解压缩 PDF 并将组件(图像、格式化文本、页面)呈现到显示设备;然后让人们弄乱布局;然后重新打包PDF。您必须完全按照 PDF 标准执行此操作,否则您可能会发现编辑的 PDF 文件的下游消费者崩溃或无法渲染它。您必须满足各种 Acrobat 标准级别,以及编辑包(Word、Illustrator、InDesign)供应商在 PDF 文件中添加的快捷方式和膨胀;图层、缩略图等。
然后我们来到颜色。阅读 PDF 规范,您将看到原始 PDF 制作者可以决定使用的一系列色彩空间选项。您必须将这些解释为屏幕和背面等合理的设备颜色。
然后是字体。字体可能是嵌入的子集,也可能不是。为了保持对 PDF 的保真度,您需要按照 PDF 中定义的比例在绘图表面上将字形实现为矢量图形。这主要意味着使用某种平台相关的类型库——棘手的跨平台。此外,您需要获得字体的适当使用许可,这对于大多数人想要看起来时髦和专业的字体来说可能是昂贵的。
鉴于 PDF 中的分层、缩放和旋转功能,您可能会将 html Canvas 视为绘图表面。任何知道的人都会告诉您,在 Canvas 的世界中,您几乎可以自己处理文字处理类型的功能。
不是不可能,但很难。
将 PDF 渲染到显示器的组件主要充当打印驱动程序,严格遵守 PDF 绘图指令,通常生成光栅或有时生成 SVG 图形。这是一条单行道——他们阅读和画画,但对所画的对象没有“ Handlebars ”的感觉。没有句柄就意味着没有操作,而且这些家伙当然无意让您修改和回写。
您会发现许多“保存到 pdf”的产品。当客户端时,他们将倾向于抓取一组像素并将光栅图形转储到一个文件中,文件中包裹着最薄的“PDF”定义。如果它们是基于服务器的,那么它们就可以非常强大——有很多工具,比如 Aspose 和 ABCPDF,它们真正提供了一些 PDF 处理服务器端——但这不是你在你的 OP 中寻找的。
总结 - 非常复杂的主题。如果有任何潜在的东西出现,就涵盖的 PDF 功能而言,它可能会受到许多限制,从而限制了它可以安全编辑的内容。
如果您正在寻找最终导出为 PDF 的文档的在线编辑,那么前进的方法是保留文档源的 html 版本并让用户使用 TinyMCE、CKEditor 等对其进行编辑,然后使用其中一个服务器 -边工具来获取保存的源 HTML 并呈现为 PDF。像 ABCPDF 这样的工具可以忠实地呈现 HTML,让您可以添加图像、页眉和页脚、页码等。
这是对您(假设的)需求的务实回答,尽管它在字体(许可)问题、基于浏览器的编辑器的笨拙、某些 HTML 编辑所规定的 HTML 的全面怪异方面仍有一些权衡组件等。但它是可行的。
最后的想法 - 重新考虑您需要的范围。如果在服务器上编辑 HTML 并转换为 PDF 对您来说是可用的,那么这是一条很受欢迎的路径,您会发现客户端和服务器的免费和商业组件都支持它。
编辑:如果您需要对 PDF 进行注释,那么事情就容易多了。在服务器上,您需要生成文档页面的图像,将这些图像发送到客户端,将它们显示给用户,让用户对其进行标记,将注释的坐标捕获回服务器并使用服务器端 PDF 库将注释渲染到 PDF 中。这是可以实现的,但需要从服务器端 PDF 到图像处理以及客户端演示和注释捕获的各种技能组合。
编辑:读者可能有兴趣知道我上面画的图片是否发生了变化。截至 2019 年 1 月,我坚持我写的内容。供应商正在以更好的工具和库进入市场,这些工具和库可以比以前做得更多。但是,您仍然需要评估您的需求并确认它们的限制——很可能会有一些限制。我所知道的供应商还没有为任何 PDF 文件提供客户端、跨浏览器、跨设备、全功能的 PDF 编辑库——总是有一些限制。但我很高兴得到纠正。
关于javascript - 在浏览器中编辑*现有* PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073718/
Tôi cần đặt văn bản vào một Div, vào một Div khác, vào một Div khác nữa. Vậy thì trông nó như thế này: #document Thay đổi mã PIN
Một điều kỳ lạ đã xảy ra. Tôi có một mã HTML cơ bản. html, đầu, thân. (Vì tôi nhận được một số phiếu bầu không tốt, đây là mã đầy đủ) Đây là CSS của tôi: html { background
Tôi đang cố gắng tải một tập hợp hình ảnh từ Assets vào ImageView có trong UICollectionview nhưng bất cứ khi nào tôi chạy ứng dụng, nó đều hiển thị lỗi. Và cũng không có hình ảnh nào được hiển thị. Tôi đang sử dụng
Tôi cần thay đổi một số biến môi trường dựa trên đầu ra của tập lệnh perl có tham số. Trong tcsh, tôi có thể sử dụng lệnh bí danh để đánh giá đầu ra của một tập lệnh perl. tcsh: bí danh setsdk 'eval `/localhome/
Tôi đã tạo một ứng dụng Blazor (phía máy chủ) mới bằng Windows Authentication và chạy nó bằng IIS Express. Nó sẽ hiển thị thông báo "Xin chào Domain\User!" ở góc trên bên phải sau Ra
Đây là phương thức void login(Event event); của tôi. Tôi muốn biết cách thực hiện điều này trong Kotlin. Câu trả lời hay nhất Trong Kotlin, toán tử đại diện là *. Nó hướng dẫn trình biên dịch rằng nó không được biết đến, nhưng một khi nó được biết đến, không có lớp nào khác
Xem mã sau cho câu chuyện trong sách nếu story.title.length < 140 - var story
Tôi đang cố gắng học cách xử lý chuỗi trong C. Tôi đã viết một chương trình lưu trữ một số bản nhạc và giúp người dùng kiểm tra xem bài hát mà họ đang nghĩ đến có tồn tại trong số các bản nhạc đã lưu trữ hay không. Điều này được thực hiện bằng cách yêu cầu người dùng nhập một chuỗi ký tự. Chương trình sau đó sử dụng strstr()
Tôi đang học sscanf và thấy một chuỗi định dạng như thế này: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); Tôi hiểu phần %[^:] có nghĩa là quét cho đến khi gặp ':' và gán nó cho a. :
def char_check(x,y): nếu (str(x) trong y hoặc x.find(y) > -1) hoặc (str(y) trong x hoặc y.find(x) > -1):
Tôi có một tình huống muốn đưa các dòng hiện có từ một tệp văn bản vào một khối mới. dòng 1 dòng 2 dòng trong khối dòng 3 dòng 4 phải trở thành dòng 1 dòng 2 dòng
Tôi có một dự án mới và đang cố gắng thiết lập thanh công cụ gỡ lỗi Django. Đầu tiên, tôi thử thiết lập nhanh, chỉ cần thêm 'debug_toolbar' vào danh sách các ứng dụng đã cài đặt. Với điều này, khi tôi đi đến URL gốc của mình, gỡ lỗi
Trong Matlab, nếu tôi có một hàm f, với chữ ký f(a,b,c), tôi có thể tạo một hàm chỉ có một biến b sẽ gọi f với a=a1 và c=c1 cố định: g = @(b) f(a1, b,
Tôi không hiểu tại sao lại có khoảng cách dọc bổ sung giữa các phần tử trong ForEach bên trong VStack để hiển thị bộ chia ngang tùy chỉnh khi sử dụng GeometryReader bên trong ScrollView. Cuộn
Tôi tự hỏi, có hướng dẫn hoặc biện pháp tốt nhất nào về thời điểm sử dụng phiên và cookie không? Những gì nên và không nên lưu trữ trong đó? Cảm ơn! Câu trả lời hay nhất Các tài liệu này cung cấp hiểu biết tốt về các vấn đề bảo mật của cookie phiên và
Tôi có một ma trận Nx3 trong scipy/numpy mà tôi muốn tạo một biểu đồ thanh 3 chiều, trong đó trục X và Y được xác định bởi các giá trị ở cột thứ nhất và thứ hai của ma trận, chiều cao của mỗi thanh là cột thứ ba trong ma trận và số thanh được xác định bởi N.
Giả sử tôi khởi tạo semaphore theo hai cách khác nhau sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) Bây giờ, sem_wait(&randomsem) trong cả hai trường hợp
Tôi đang nghi ngờ cách giá trị được lưu trữ trong "WORD" vì PStr chứa đầu ra thực tế. ? Vì Pstr lưu trữ các chữ cái viết thường thành chữ hoa, làm sao để chuyển nó thành "WORD" trong printf? Có ai vui lòng giúp tôi được không? Bạn có thể giải thích được không? #bao gồm
Tôi có một mảng 3x3: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; và muốn lấy 2 phần tử đầu tiên
Tôi nhận ra bạn có thể dễ dàng kiểm tra tiêu điểm bằng cách sử dụng lệnh sau: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(window
Tôi là một lập trình viên xuất sắc, rất giỏi!