这不可能。至少没那么简单。有些网络浏览器不显示 PDF,但要求用户下载文件,有些浏览器自己显示它们,有些嵌入外部 PDF 查看器组件,有些启动外部 PDF 查看器。没有标准的跨浏览器方式将 PDF 嵌入 HTML,如果您想显示任意文本,则需要这种方式andPDF 内容。
一个适用于所有浏览器的后备解决方案是将服务器上的 PDF 页面呈现为图像并将其提供给客户端。这给服务器带来了一些压力(处理器、用于缓存的内存/磁盘、带宽)。
一些支持 HTML5 的现代浏览器可以使用以下命令呈现 PDF:Mozilla 的 pdf.js https://mozilla.github.io/pdf.js/在画布元素上。
对于其他的你可以尝试使用<embed>
/<object>
使用 Adobe 的插件作为Adobe 上描述的PDF 开发者迷博客 https://blogs.adobe.com/pdfdevjunkie/web_designers_guide.
在服务器上渲染页面
将 PDF 页面呈现为图像并提供服务需要服务器上的某些软件来查询页面数以及提取给定页面并将其呈现为图像。
页数可以通过以下方式确定pdfinfo
节目来自Xpdf or the 库波普勒命令行实用程序。将页面从 PDF 文件转换为 JPG 图像可以使用以下命令完成convert
来自 ImageMagick 工具。使用这些程序的一个非常简单的 CGI 程序:
#!/usr/bin/env python
import cgi
import cgitb; cgitb.enable()
import os
from itertools import imap
from subprocess import check_output
PDFINFO = '/usr/bin/pdfinfo'
CONVERT = '/usr/bin/convert'
DOC_ROOT = '/home/bj/Documents'
BASE_TEMPLATE = (
'Content-type: text/html\n\n'
'<html><head><title>{title}</title></head><body>{body}</body></html>'
)
PDF_PAGE_TEMPLATE = (
'<h1>{filename}</h1>'
'<p>{prev_link} {page}/{page_count} {next_link}</p>'
'<p><img src="{image_url}" style="border: solid thin gray;"></p>'
)
SCRIPT_NAME = os.environ['SCRIPT_NAME']
def create_page_url(filename, page_number, type_):
return '{0}?file={1}&page={2}&type={3}'.format(
cgi.escape(SCRIPT_NAME, True),
cgi.escape(filename, True),
page_number,
type_
)
def create_page_link(text, filename, page_number):
text = cgi.escape(text)
if page_number is None:
return '<span style="color: gray;">{0}</span>'.format(text)
else:
return '<a href="{0}">{1}</a>'.format(
create_page_url(filename, page_number, 'html'), text
)
def get_page_count(filename):
def parse_line(line):
key, _, value = line.partition(':')
return key, value.strip()
info = dict(
imap(parse_line, check_output([PDFINFO, filename]).splitlines())
)
return int(info['Pages'])
def get_page(filename, page_index):
return check_output(
[
CONVERT,
'-density', '96',
'{0}[{1}]'.format(filename, page_index),
'jpg:-'
]
)
def send_error(message):
print BASE_TEMPLATE.format(
title='Error', body='<h1>Error</h1>{0}'.format(message)
)
def send_page_html(_pdf_path, filename, page_number, page_count):
body = PDF_PAGE_TEMPLATE.format(
filename=cgi.escape(filename),
page=page_number,
page_count=page_count,
image_url=create_page_url(filename, page_number, 'jpg'),
prev_link=create_page_link(
'<<', filename, page_number - 1 if page_number > 1 else None
),
next_link=create_page_link(
'>>',
filename,
page_number + 1 if page_number < page_count else None
)
)
print BASE_TEMPLATE.format(title='PDF', body=body)
def send_page_image(pdf_path, _filename, page_number, _page_count):
image_data = get_page(pdf_path, page_number - 1)
print 'Content-type: image/jpg'
print 'Content-Length:', len(image_data)
print
print image_data
TYPE2SEND_FUNCTION = {
'html': send_page_html,
'jpg': send_page_image,
}
def main():
form = cgi.FieldStorage()
filename = form.getfirst('file')
page_number = int(form.getfirst('page', 1))
type_ = form.getfirst('type', 'html')
pdf_path = os.path.abspath(os.path.join(DOC_ROOT, filename))
if os.path.exists(pdf_path) and pdf_path.startswith(DOC_ROOT):
page_count = get_page_count(pdf_path)
page_number = min(max(1, page_number), page_count)
TYPE2SEND_FUNCTION[type_](pdf_path, filename, page_number, page_count)
else:
send_error(
'<p>PDF file <em>{0!r}</em> not found.</p>'.format(
cgi.escape(filename)
)
)
main()
有 Python 绑定库波普勒,所以调用外部pdfinfo
程序可以很容易地用该模块替换。它还可用于提取页面的更多信息,例如 PDF 页面上的链接,以便为它们创建 HTML 图像映射。随着libcairo安装了 Python 绑定后,甚至可以在没有外部进程的情况下渲染页面。