【问题标题】:JEditorPane shows raw HTML with Google DocsJEdi​​torPane 使用 Google Docs 显示原始 HTML
【发布时间】:2013-04-14 22:01:28
【问题描述】:

我正在尝试将已发布的 Google 文档加载到 JEditorPane

这是文档:link

以下是 JEditorPane 的呈现方式:

我对图片的观察:

  1. 正在正确提取 HTML。
  2. JEditorPane 至少支持一些 CSS(注意顶部的阴影条)。
  3. JEditorPane 在 HTML 源代码中的第二个 <style type="text/css"> 块中非常困惑。是因为<style><div> 内,而不是<head>
  4. 在代码中的某些空格处存在奇怪的伪影(U+00C2,十进制 194;带有抑扬符的拉丁文大写字母 A),实际上是普通的 U+0020 空格。这可能与字节顺序有关吗? (我已经验证了这些字符实际上是通过printlning 每一行来获取的。)

我已经阅读了this StackOverflow post 关于这个主题并实施了它,但它并没有解决问题。

我还注意到,CSS 支持总体上是稀疏的(例如,渲染 http://www.stackoverflow.com 会产生带有大量蓝色框的不良结果),但没有暴露实际的 HTML 代码或工件。

使用JTextPane 而不是JEditorPane 会产生相同的结果。

在文档顶部添加 DTD(XHTML 4.1 Transitional 和 HTML5 的 <!DOCTYPE html> 都试过)也不起作用。

关于为什么会发生这种情况以及如何解决它的任何想法?

为了尽快获得更好的帮助,这是我的 SSCCE:

public class GoogleDocSSCCE extends JPanel {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        GoogleDocSSCCE gdv = new GoogleDocSSCCE();
        gdv.docId = "1jG_rNCfVSD8yhHB9ZgA5YicXK_yDOl9T-fItIgmKa-o";
        gdv.refreshDocument();
        frame.setContentPane(gdv);
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private final JEditorPane docPane;
    private String docId;
    private static final String PREFIX = "https://docs.google.com/document/d/";
    private static final String SUFFIX = "/pub";

    public GoogleDocSSCCE() {
        super(new BorderLayout());
        docPane = new JEditorPane();
        docPane.setEditable(false);
        docPane.setContentType("text/html");
        add(new JScrollPane(docPane), BorderLayout.CENTER);
        JButton btnRefresh = new JButton("Refresh Document");
        btnRefresh.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                refreshDocument();
            }
        });
        add(btnRefresh, BorderLayout.NORTH);
    }

    public void refreshDocument() {
        if (docId == null || docId.isEmpty()) {
            docPane.setText(new String());
            return;
        }
        docPane.setText("<html><body>Loading...</body></html>");

        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean success = false;
                try {
                    URL u = new URL(PREFIX + docId + SUFFIX);
                    InputStream stream = u.openStream();
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(stream));
                    StringBuilder sbDocument = new StringBuilder();
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sbDocument.append(line);
                        sbDocument.append('\n');
                    }
                    docPane.setText(sbDocument.toString());
                    success = true;
                } catch (MalformedURLException e) {
                    JOptionPane.showMessageDialog(GoogleDocSSCCE.this,
                            "The given URL is malformed.",
                            "Error Reading Google Document",
                            JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                } catch (IOException e) {
                    JOptionPane.showMessageDialog(GoogleDocSSCCE.this,
                            "Unable to read the document.",
                            "Error Reading Google Document",
                            JOptionPane.ERROR_MESSAGE);
                    e.printStackTrace();
                } finally {
                    if (!success) {
                        // We failed.
                        docPane.setText(new String());
                    }
                }
            }
        }).start();
    }
}

【问题讨论】:

  • Java 仅支持 HTML 3.2
  • 尝试从头部删除脚本标签
  • @SriHarshaChilakapati 我将尝试删除脚本标签。正则表达式就足够了(类似于&lt;script&gt;.*?&lt;/script&gt;)还是我需要使用完整的DOM解析器?
  • Regex 应该足够了,我认为但对此没有任何其他想法。我曾经在编辑器窗格中显示 JavaDoc 时遇到过这种情况并放弃了它。您也可以尝试将编辑器工具包更改为 HTMLEditorKit。也许它可以工作。

标签: java css url jtextpane jeditorpane


【解决方案1】:

请参阅LoboBrowser api。

示例。

import org.lobobrowser.gui.*;
import org.lobobrowser.main.*;
import javax.swing.*;

public class Browser extends JFrame {

    public Browser(string docid)
    {
        FramePanel browser = new FramePanel();
        add(browser);
        browser.navigate("https://docs.google.com/document/d/" + docid + "/pub/");
    }

    public static void main(String[] args)
    {
        Browser b = new Browser("1jG_rNCfVSD8yhHB9ZgA5YicXK_yDOl9T-fItIgmKa-o");
        b.setSize(400, 400);
        b.setVisible(true);            
    }

}

【讨论】:

  • 谢谢,但我真的不想要一个完整的浏览器;相反,我只想渲染一页。我能做到这一点吗?另外我不想包含一个巨大的依赖(16MB 对我的项目来说相当大)。
  • 我可以为此目的使用底层的 Cobra 库吗?此外,是否可以将 Cobra 库从 3.7MB 简化为仅一个渲染器(不需要 JS 等)? (即使没有,3.7MB 也比 16MB 好很多)
  • 显然Cobra and LoboBrowser are dead 并且已经为我(和其他人)产生了错误。您还有其他建议吗?
猜你喜欢
  • 2011-05-07
  • 2011-06-06
  • 2012-07-29
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
相关资源
最近更新 更多