问题描述
我正在使用JeditorPane和JEditorKit来显示一些HTML。 HTML正确显示但图像显示为已损坏(它们在浏览器中正确显示)。图像src是base64。我这样设置内容类型:
I am using JeditorPane and JEditorKit to display some HTML. The HTML is displaying correctly but the images show up as broken (they display properly in a browser). The image src is base64. I set the content type thus:
final JEditorPane ed=new JEditorPane();
ed.setContentType("text/html");
我猜这是因为它包含文字和图片,内容类型不正确。如果是这种情况,应该设置什么? TIA。
I'm guessing that because it contains both text and images, the content type is incorrect. If that is the case, what should it be set to? TIA.
** Madushan Perera回复后**
** After Madushan Perera's reply**
final JEditorPane ed=new JEditorPane();
ed.setContentType("text/html");
ed.setEditable(false);
HTMLDocument html=(HTMLDocument) ed.getDocument();
html.putProperty("IgnoreCharsetDirective", new Boolean(true));
HTMLEditorKit htmle=(HTMLEditorKit) ed.getEditorKit();
try {
htmle.insertHTML(html,html.getLength(),content,0,0,null);
} catch (BadLocationException | IOException e) {
// Should not get here
e.printStackTrace();
}
ed.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(final HyperlinkEvent pE) {
if (HyperlinkEvent.EventType.ACTIVATED == pE.getEventType()) {
String desc = pE.getDescription();
if (desc == null || !desc.startsWith("#")) return;
desc = desc.substring(1);
ed.scrollToReference(desc);
}
}
});
ed.setCaretPosition(0);
JScrollPane scroll=new JScrollPane(ed,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel jp=new JPanel();
Dimension size=new Dimension(700,700);
jp.setPreferredSize(size);
jp.setLayout(new BorderLayout());
jp.add(scroll);
JOptionPane.showMessageDialog(null,jp,title,JOptionPane.INFORMATION_MESSAGE);
'html'是包含HTML的字符串。它是使用IOUtils.toString从html文件类型中读取的。我可能需要开发一个SCCE。
'html' is the string containing the HTML. It was read from an html file type using IOUtils.toString. I'm probably going to have to develop an SCCE.
实现CustomEditor
final JEditorPane ed=new JEditorPane();
ed.setContentType("text/html");
ed.setEditable(false);
CustomToolKit htmle=new CustomToolKit();
ed.setEditorKit(htmle);
String content=readFile(fileName_+".html").replaceAll("(\\r|\\n)", "");
content=content.replace("!!!!",VERSION.VERSION);
ed.setText(content);
ed.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(final HyperlinkEvent pE) {
if (HyperlinkEvent.EventType.ACTIVATED == pE.getEventType()) {
String desc = pE.getDescription();
if (desc == null || !desc.startsWith("#")) return;
desc = desc.substring(1);
ed.scrollToReference(desc);
}
}
});
ed.setCaretPosition(0);
JScrollPane scroll=new JScrollPane(ed,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel jp=new JPanel();
Dimension size=new Dimension(700,700);
jp.setPreferredSize(size);
jp.setLayout(new BorderLayout());
jp.add(scroll);
JOptionPane.showMessageDialog(null,jp,title,JOptionPane.INFORMATION_MESSAGE);
}
现在我什么都没得到。显然我没有正确实施你的建议。
Now I get nothing. Obviously I did not properly implement your suggestion.
推荐答案
你可以尝试下面这样的事情:
You can try something like below :
String imgsrc = this.getClass().getClassLoader()
.getResource("your_package_name/image.png").toString();
editor_pane.setContentType("text/html");
editor_pane.setEditable(false);
editor_pane.setText("<h3>Image Title</h3><img src='" + imgsrc + "' alt='img' name='img_name' width='100' height='100' /><br />");
更新:
String imgURL = "data:image/png;base64,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";
String encodedImg = imgURL.split(",")[1];
byte[] decodedImg = Base64.getDecoder().decode(encodedImg.getBytes(StandardCharsets.UTF_8));
Path destinationFile = Paths.get("C:\\your_path\\", "myImage.jpg");
try {
Path path = Files.write(destinationFile, decodedImg);
editor_pane.setContentType("text/html");
editor_pane.setEditable(false);
editor_pane.setText("<h3>Image Title</h3><img src='" + path.toAbsolutePath().toUri() + "' alt='img_alt' width='150' height='150' /><br />");
} catch (IOException ex) {
ex.printStackTrace();
}
更新2:
您必须为 JEditorPane
创建自定义工具包,如下所示:
You have to create custom toolkit for the JEditorPane
like below :
public class CustomToolKit extends HTMLEditorKit {
private static HTMLFactory factory = null;
@Override
public ViewFactory getViewFactory() {
if (factory == null) {
factory = new HTMLFactory() {
@Override
public View create(Element elem) {
AttributeSet attrs = elem.getAttributes();
Object elementName = attrs.getAttribute(AbstractDocument.ElementNameAttribute);
Object o = (elementName != null) ? null : attrs.getAttribute(StyleConstants.NameAttribute);
if (o instanceof HTML.Tag) {
HTML.Tag kind = (HTML.Tag) o;
if (kind == HTML.Tag.IMG) {
return new BASE64ImageView(elem);
}
}
return super.create(elem);
}
};
}
return factory;
}
}
然后你必须覆盖 getImageURL()
javax.swing.text.html.ImageView
支持Base64编码图像。
Then you have to override the getImageURL()
of javax.swing.text.html.ImageView
to support Base64 encoded images.
public class BASE64ImageView extends ImageView {
private URL url;
public BASE64ImageView(Element elmnt) {
super(elmnt);
populateImage();
}
private void populateImage() {
Dictionary<URL, Image> cache = (Dictionary<URL, Image>) getDocument()
.getProperty("imageCache");
if (cache == null) {
cache = new Hashtable<>();
getDocument().putProperty("imageCache", cache);
}
URL src = getImageURL();
cache.put(src, loadImage());
}
private Image loadImage() {
String b64 = getBASE64Image();
BufferedImage newImage = null;
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(
Base64.getDecoder().decode(b64.getBytes()));
newImage = ImageIO.read(bais);
} catch (Throwable ex) {
ex.printStackTrace();
}
return newImage;
}
@Override
public URL getImageURL() {
String src = (String) getElement().getAttributes()
.getAttribute(HTML.Attribute.SRC);
if (isBase64Encoded(src)) {
this.url = BASE64ImageView.class.getProtectionDomain()
.getCodeSource().getLocation();
return this.url;
}
return super.getImageURL();
}
private boolean isBase64Encoded(String src) {
return src != null && src.contains("base64,");
}
private String getBASE64Image() {
String src = (String) getElement().getAttributes()
.getAttribute(HTML.Attribute.SRC);
if (!isBase64Encoded(src)) {
return null;
}
return src.substring(src.indexOf("base64,") + 7, src.length() - 1);
}
}
最后你可以设置你的 CustomTollKit
到您的 editorPane
:
Finally you can set your CustomTollKit
to your editorPane
:
String imgURL = "data:image/png;base64,iVBORw0KGgoAA.........";
editor_pane.setContentType("text/html");
editor_pane.setEditable(false);
CustomToolKit tooKit = new CustomToolKit();
editor_pane.setEditorKit(tooKit);
editor_pane.setText("<h1>Image Title</h1><img src='" + imgURL + "' alt='img_alt' width='150' height='150' /><br />");
这篇关于用于HTML嵌入式Base64图像的JEditorPane内容类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!