我正在尝试将已发布的 Google Doc 加载到JEditorPane
.
这是文档:链接。
以下是 JEditorPane 的呈现方式:
我对图像的观察:
- 正在正确获取 HTML。
JEditorPane
至少支持一些CSS(注意顶部的阴影条)。JEditorPane
<style type="text/css">
在 HTML 源代码的第二个块中变得非常困惑。是因为<style>
a 在里面<div>
而不是在里面<head>
?- 在代码中的某些空格处存在奇怪的伪影(U+00C2,十进制 194;带有抑扬符的拉丁大写字母 A),这些空格实际上是香草
U+0020
空格。这可能与字节顺序有关吗?(我已经验证了这些字符实际上是通过println
ing 每一行来获取的。)
我已经阅读了有关该主题的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();
}
}