用 Java 下载的 PDF 已损坏?

2024-01-23

我读过有关的精彩讨论如何使用 Java 从 Internet 下载并保存文件 https://stackoverflow.com/questions/921262/how-to-download-and-save-a-file-from-internet-using-java。但是,如果我执行下一个代码,我会得到一个损坏的 PDF。知道为什么吗?

import java.io.*;
import java.net.*;

public class PDFDownload {
    public static String URL = "http://www.nbc.com/Heroes/novels/downloads/";
    public static String FOLDER = "C:/Users/sdelamo/workspace/SandBox/HeroesNovel/";

    public static void main(String[] args) {
        String filename = "Heroes_novel_001.pdf";
        try {
            saveUrl(FOLDER + filename, URL + filename);
        } catch (MalformedURLException e) {
            System.out.println("MalformedURLException");
        } catch (IOException e) {
            System.out.println("IOException");                              
        }                       
    }       



    public static void saveUrl(String filename, String urlString) throws MalformedURLException, IOException {
        BufferedInputStream in = null;
        FileOutputStream fout = null;
        try {
            URL url = new URL(urlString);
            in = new BufferedInputStream(url.openStream());
            fout = new FileOutputStream(filename);

            byte data[] = new byte[1024];
            int count;
            while ((count = in.read(data, 0, 1024)) != -1) {
                fout.write(data, 0, count);
            }
        } finally {
            if (in != null)
                in.close();
            if (fout != null)
                fout.close();
        }
    }
}

上面的代码下载 html 而不是 PDF。这是输出:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
    "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

<meta name="viewport" content="width=240, user-scalable=yes" />
<HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache-control" content="must-revalidate">
<meta http-equiv="Cache-control" content="max-age=0">
<meta http-equiv="refresh" content="200">

<title>NBC.com: Heroes</title>
<link rel="stylesheet" type="text/css"  href="/style/default.css?sid=8a9212f822e1c675330ec418bc531169" />
<link rel="stylesheet" type="text/css"  href="/style/hro.css?sid=8a9212f822e1c675330ec418bc531169" /> 

</head>
<body>
<center><img src="http://oimg.nbcuni.com/b/ss/nbcunbcnetworkwapbu,nbcuwapsitebu/5/H.8--WAP/4aa0e4cb8b448?vid=8a9212f822e1c675330ec418bc531169&gn=NBC.com Front Door&c2=&c3=Miscellaneous&c4=&c6=m.nbc.com/show/hro&c8=TV Entertainment&c9=NBC Network&c10=&c11= | &c12= | &c25=offdeck&c27=internal&c29=&c44=D=User-Agent&r=" width="5" height="5" border="0" /></center>
<h1 id="fHeader">
<a  href="/?sid=8a9212f822e1c675330ec418bc531169">
<img src="/images/nbc_logo.gif" alt="NBC : logo" border="0" />
</a>
</h1>

<h2>
<a  href="/show/hro?sid=8a9212f822e1c675330ec418bc531169">
<img src="/images/shows/1221684699_Heroes_WAP_166x54.jpg" alt="Heroes : showheader" border="0" />
</a>
</h2>
<div id="tunein_nexton">
    <span id="tunein">Mondays 9/8c</span>
</div><!--end #tunein_nexton-->
<div id="tunein_nexton">
    <!--<span id="tunein">Mondays 8/7c</span>-->

    <p id="nexton"><span class="sectiontitle"></span></p>
</div><!--end #tunein_nexton-->
<div id="featuredcontent">
    <h3>FEATURED CONTENT</h3>
    <table id="featuredItemsTable">

        <tr>
            <td><a  href="/show/hro/videos.html?sid=8a9212f822e1c675330ec418bc531169"><img src="/images/hro/nbc_hro_pro_040X921HRO120FLYPSIDE_exp921_20090_543_large.jpg" alt="featured" /></a>
            </td>
            <td>
                <span class="ftitle">Dreams</span>
                <span class="fdesc">Heroes premieres Mon., Sept. 21s...</span>
            </td>
        </tr>
                                        <tr>
            <td><a  href="/show/hro/recaps.html?sid=8a9212f822e1c675330ec418bc531169"><img src="http://origin-www.nbc.com/Heroes/images/episodes/season3/325/hro_325_01.jpg" alt="featured" height="45" width="80"/></a>
            </td>
            <td>
                <span class="ftitle">Recap:</span>
                <span class="fdesc">Season 3 Episode An Invisible Thread</span>
            </td>
        </tr>
                                        <tr>
            <td><a  href="/show/hro/photos.html?sid=8a9212f822e1c675330ec418bc531169"><img src="http://origin-www.nbc.com/app2/img/200x200xS/scet/photos/51/3736/NUP_110031_0323.JPG" alt="featured" height="45" width="80"/></a>
            </td>
            <td class="finfo">
                <span class="ftitle">Photo:</span>
                <span class="fdesc">Heroes "Cast Photos"</span>
            </td>
        </tr>
                    </table>


</div><!--end #featuredcontent-->

<h3>HEROES</h3>
<table class="showNav">
    <tr><td><a  href="/show/hro/about.html?sid=8a9212f822e1c675330ec418bc531169" accesskey="1">About</a></td></tr>
        <tr><td><a  href="/show/hro/videos.html?sid=8a9212f822e1c675330ec418bc531169" accesskey="2">Videos</a></td></tr>
                <tr><td><a  href="/show/hro/recaps.html?sid=8a9212f822e1c675330ec418bc531169" accesskey="3">Episode Recaps</a></td></tr>
                    <tr><td><a  href="/show/hro/photos.html?sid=8a9212f822e1c675330ec418bc531169" accesskey="4">Photos</a></td></tr>
                <tr><td><a  href="/show/hro/community.html?sid=8a9212f822e1c675330ec418bc531169" accesskey="5">Community</a></td></tr>
    <tr><td><a  href="/shows.shtml?sid=8a9212f822e1c675330ec418bc531169" accesskey="6">Shows List</a></td></tr>
</table>
<!-- <a  href="http://www.insightexpress.com/ix/Survey.aspx?id=151580&accessCode=3161643404&sid=8a9212f822e1c675330ec418bc531169" ><img src="/images/mNBCcom_166x54.jpg" border="0"></a> -->



<div class="footer" align="center"><a  href="http://m.nbc.com?sid=8a9212f822e1c675330ec418bc531169"><strong>NBC Mobile Main</strong></a> | <a  href="/terms.shtml?sid=8a9212f822e1c675330ec418bc531169"><strong>Terms of Use</strong></a> | <a  href="/privacy.shtml?sid=8a9212f822e1c675330ec418bc531169"><strong>Privacy</strong></a></div><div class="cpyrt" align="center">&#169; NBC Universal, Inc.</div>

</body>
</html>

知道如何下载 PDF 吗?

SOLUTION

连接前设置用户代理。

URL u = new URL(urlString); 
HttpURLConnection huc =  (HttpURLConnection)  u.openConnection();
huc.setRequestMethod("GET"); 
huc.setRequestProperty("User-Agent", "  Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
huc.connect();          

in = new BufferedInputStream(huc.getInputStream());

您是否尝试过使用文本编辑器等查看下载的文件?

您将看到它包含 HTML 页面,而不是 PDF。可能 URL 没有指向 PDF,或者正在进行一些重定向,这是标准的java.net默认情况下不支持类。

确保 URL 正确指向 PDF。你可以使用Apache HttpClient http://hc.apache.org/httpclient-3.x/用于使用 HTTP 执行更复杂的操作,包括自动处理 HTTP 重定向。

注意:您发布的代码无法编译,因为您放置了}错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 Java 下载的 PDF 已损坏? 的相关文章

  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 最小的有效 PDF 是多少?

    出于简单的好奇心 看到了最小的 GIF http probablyprogramming com 2009 03 15 the tiniest gif ever 最小的有效 PDF 文件是多少 这是一个有趣的问题 按照书本 你可以从以下开始
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 添加自定义目录(源和规范)以在 Rails 3 项目中进行自动测试

    我有一个 Rails 3 应用程序 它使用 RSpec2 作为我的测试框架 并且我能够使用自动测试来观察我的模型和规范目录的更改 并在文件更改时重新运行我的规范套件 我想添加一个目录 其中包含一些自定义类 RAILS ROOT lib so
  • For循环和if语句

    我正在使用以下 for 循环 for int intPrjName 0 intPrjName lt arrPrjName count intPrjName 我在 for 循环下有一个 if else 语句 其中else块显示警报消息 假设数
  • onNavigationItemSelected 在 NavigationView 中不起作用

    请有人帮助我处理导航抽屉中的片段 由于某种原因我无法让它们工作并且所有代码看起来都是正确的 Here https github com Matt Hutchings The Midlands Meander是源代码的链接 使用此代码 nav
  • 使用 angularjs/ui-bootstrap 制作手风琴并使用 ng-model

    我使用 angularJs 和 bootstrap 我制作了一个手风琴 其中我放置了一个选择来选择过滤器的值和不起作用的 data ng model 如果他不在手风琴中 则选择可以工作 这是我的代码
  • 在没有指针的函数中使用函数原型

    我的导师提到在其他函数中使用函数作为参数 我不是说使用指针 这可能吗 我在下面显示 我不明白他做了什么 谁能用例子解释一下吗 谢谢大家的赞赏回答 使用风格是 int test double abc double bla bla 函数是 do
  • C# 中的猴子修补

    是否可以在运行时扩展或修改 C 类的代码 我的问题具体围绕 Monkey Patching Duck Punching 或元对象编程 MOP 就像 Groovy Ruby 等脚本语言中发生的那样 对于那些今天仍然在这个问题上绊倒的人来说 确
  • SVN 显示日志不起作用

    如何在不设置 r 向所有人 所有内容读取 的情况下使用显示日志功能 我的 authz 文件中有几个组 它看起来像这样 groups Profs dave bruno franck Team1 1036091 1036103 1036087
  • 从 BeautifulSoup 结果中获取表单“action”

    我正在为一个网站编写一个 Python 解析器来自动完成一些工作 但我不太喜欢 Py 的 re 模块 正则表达式 并且无法使其工作 req urllib2 Request tl2 req add unredirected header Us
  • 什么时候抛出异常?

    异常是美妙的事情 但有时我担心我抛出太多异常 考虑这个例子 类用户 public function User user Query database for user data if user throw new ExistenceExce
  • C++ 中的异步线程安全日志记录(无互斥体)

    我实际上正在寻找一种在我的 C 中进行异步和线程安全日志记录的方法 我已经探索过 log4cpp log4cxx Boost log 或 rlog 等线程安全日志记录解决方案 但似乎它们都使用互斥锁 据我所知 互斥体是一种同步解决方案 这意
  • 如何在android中将位图转换为PDF格式[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我在 thepic 变量中有位图 它是位图类型 imageUri Uri intent getParcelableExtra Intent
  • C++11 类型推断期间控制优先级的规则是什么?

    管理 float double 类型的 C 11 类型推断的优先级规则是什么 例如 当从包含多种类型的表达式进行推断时 如下所示 auto var float 1 double 1 结果将是double 这就是所谓的floating poi
  • 如何在 Matplotlib 中反转轴并设置极坐标图的零位置?

    使用 Matplotlib 极坐标图时 theta 轴默认零位置为 或 右侧 角度逆时针增大 如下所示这个例子 https matplotlib org examples pylab examples polar demo html 如何指
  • C++0x 闭包的未定义行为:II

    我发现 C 0x 闭包的使用令人困惑 我的初始report https stackoverflow com questions 5543169 how to make a vector of functors lambdas or clos
  • Git合并后挂钩,如何获取合并分支的名称

    我正在尝试创建合并后挂钩脚本 该脚本仅在从特定分支合并时运行 如何确定特定提交的分支更改的名称 e g if from specific branch 1 then git diff name status HEAD 1 HEAD some
  • R 包的设置数据:vegan

    我使用素食主义者从动物计数数据中确定生物多样性指标 目的是查看计数年份之间是否存在差异 即物种数量是否根据年份而减少或增加 数据以矩阵格式设置 如下所示 年是一个字符 其他都是数字 因此 R 应该省略 NA 我设置了如上所示的数据 但大多数
  • 使用 ffmpeg 循环更改 bash 变量

    我编写了一个脚本 用于根据我在时间戳上录制的视频快速创建简短的预览剪辑 我发现这些视频值得稍后查看以进行剪辑 我的带有时间戳的文件是这样写的 FILE NAME1 MM SS MM SS FILE NAME2 MM SS MM SS MM
  • 如何为 AWS Elastic Beanstalk 部署运行 npm 脚本?

    My package json has scripts start node modules bin coffee server coffee test NODE ENV test node test runner js coverage
  • Android 7.1 写入文本文件

    来自果冻豆的牛轧糖新手尝试将文本文件写入 SD 卡我知道我现在必须请求权限 但找不到任何有效的代码 尝试了以下方法 StringBuilder bodyStr new StringBuilder bodyStr append data1St
  • 用 Java 下载的 PDF 已损坏?

    我读过有关的精彩讨论如何使用 Java 从 Internet 下载并保存文件 https stackoverflow com questions 921262 how to download and save a file from int