我知道我可以"线性化"PDF文件,例如使用Acrobat SDK或使用商业工具.这也称为"针对网络优化",它重新排列PDF,以便第1页可以尽快加载.以这种方式提供的PDF显示得更快,因为PDF查看器不必等待下载整个PDF.
更新:基于下面的答案,我现在意识到线性化的PDF不仅仅是重新排列,还包含有关其自身结构的元数据,以"线性化字典"的形式.
我有一个应用程序,我想预取几个PDF(查询的结果),以期用户希望看到其中一个.如果我的客户端可以为每个搜索结果下载第1页,只有第1页,那就太棒了.当用户选择其中一个时,可以立即显示第1页,其余部分可以在后台下载.
我正在寻找可以用于服务器端(Windows或Linux)来预处理我的PDF的通用解决方案,这样我就可以分别存储和提供第1页和其余部分.实际上,我需要知道的是PDF中的哪一个是正确显示第1页所需的最后一个字节.如果我可以有这个数字,则所有其他内容如下.
我浏览了PDF的ISO规范,但文件格式似乎太复杂,我只需解析第1页结束的位置.另一方面,线性化PDF的工具几乎肯定知道第1页的结束位置.
我对客户提供PDF文件的复杂性并不感兴趣; 这部分已经解决,因为客户端是一个应用程序,而不是一个浏览器,我完全控制.
我也认为它不会帮助我使用AP拆分工具将PDF 拆分为"第1页"PDF和完整的PDF.如果我这样做,那么我将无法欺骗客户端查看器以为它是单个PDF文件,并且当我用完整的PDF替换"第1页"PDF时会出现明显的闪烁.
任何帮助或指针赞赏.
解决方案(基于Bobrovsky的答案):
正确线性化的PDF以标题行开头(在PDF规范的7.5.2节中定义),例如"%PDF-1.7",后跟至少四个二进制字符的注释行(定义为128或更高的字节值) .例如:
%PDF-1.7
%¤¤¤¤
Run Code Online (Sandbox Code Playgroud)
此标题后面紧跟着线性化字典(在PDF规范的附录F中定义).一个例子:
43 0 obj
<< /Linearized 1.0 % Version
/L 54567 % File length
/H [475 598] % Primary hint stream offset and length (part 5)
/O 45 % Object number of first page’s page object (part 6)
/E 5437 % Offset of end of first page
/N 11 % Number of pages in document …Run Code Online (Sandbox Code Playgroud) 我正在使用HTML5开发一个小型的单页应用程序.一个功能是显示嵌入在页面中的PDF文档,可以从列表中选择哪些文档.
我正在尝试制作Chrome(首先,然后是所有其他现代浏览器)使用本地客户端缓存来完成对PDF文档的简单GET请求,而无需通过服务器(当然不是第一次).我通过<object>在HTML中的元素上设置"data"属性来请求PDF文件.
我找到了XMLHttpRequest的一个工作示例(不是<object>).如果您使用Chrome的开发人员工具(网络标签),您可以看到第一个请求发送到服务器,并导致对这些标头的响应:
Cache-Control:public,Public
Content-Encoding:gzip
Content-Length:130
Content-Type:text/plain; charset=utf-8
Date:Tue, 03 Jul 2012 20:34:15 GMT
Expires:Tue, 03 Jul 2012 20:35:15 GMT
Last-Modified:Tue, 03 Jul 2012 20:34:15 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)
第二个请求是从本地缓存提供的,没有任何服务器往返,这就是我想要的.
回到我自己的应用程序,然后我使用ASP-NET MVC 4并设置
[OutputCache(Duration=60)]
Run Code Online (Sandbox Code Playgroud)
在我的控制器上.对此控制器的第一个请求 - 使用URL会http://localhost:63035/?doi=10.1155/2007/98732产生以下标题:
Cache-Control:public, max-age=60, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:08 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*
Run Code Online (Sandbox Code Playgroud)
第二个请求导致另一个到服务器的往返,响应更快(建议服务器端缓存?)但返回200 OK和这些标头:
Cache-Control:public, max-age=53, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET 4.5,我正在尝试将URI查询字符串解析为NameValueCollection.正确的方法似乎是使用HttpUtility.ParseQueryString(string query)从中获取的字符串Uri.Query并返回一个NameValueCollection.Uri.Query返回根据RFC 2396转义的字符串,并HttpUtility.ParseQueryString(string query)期望一个URL编码的字符串.假设RFC 2396和URL编码是相同的,这应该工作正常.
然而,文档的ParseQueryString,它声称"使用UTF-8格式来解析查询字符串".还有一个重载方法,它采用a System.Text.Encoding然后使用它而不是UTF8.
我的问题是:使用UTF8作为编码是什么意思?输入是a string,根据定义(在C#中)是UTF-16.怎么解释为UTF-8?在这种情况下,使用UTF8和UTF16作为编码有什么区别?我担心的是,由于我接受任意用户输入,如果我破坏编码可能会有一些安全风险(即用户可能会漏掉一些脚本漏洞).
关于此主题有一个上一个问题(如何将查询字符串解析为.NET中的NameValueCollection),但它没有专门解决编码问题.