0

我正在尝试将已发布的 Google Doc 加载到JEditorPane.

这是文档:链接

以下是 JEditorPane 的呈现方式:

渲染

我对图像的观察:

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

我已经阅读了有关该主题的StackOverflow 帖子并实施了它,但它并没有解决问题。

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

使用 aJTextPane而不是 aJEditorPane会产生相同的结果。

将 DTD 添加到文档顶部(尝试了 XHTML 4.1 Transitional 和 HTML5's <!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();
    }
}
4

1 回答 1

0

请参阅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);            
    }

}
于 2013-04-22T05:28:30.187 回答