我正在尝试使用Android中的docx4j库将图像添加到docx文件中 我遇到了一个例外:
E/AndroidRuntime(21818): java.lang.ExceptionInInitializerError
E/AndroidRuntime(21818): at org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.newSource(AbstractImageSessionContext.java:134)
E/AndroidRuntime(21818): at org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.needSource(AbstractImageSessionContext.java:280)
E/AndroidRuntime(21818): at org.apache.xmlgraphics.image.loader.cache.ImageCache.needImageInfo(ImageCache.java:123)
E/AndroidRuntime(21818): at org.apache.xmlgraphics.image.loader.ImageManager.getImageInfo(ImageManager.java:122)
E/AndroidRuntime(21818): at org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage.getImageInfo(BinaryPartAbstractImage.java:696)
E/AndroidRuntime(21818): at org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage.ensureFormatIsSupported(BinaryPartAbstractImage.java:352)
E/AndroidRuntime(21818): at org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage.ensureFormatIsSupported(BinaryPartAbstractImage.java:331)
E/AndroidRuntime(21818): at org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage.createImagePart(BinaryPartAbstractImage.java:298)
E/AndroidRuntime(21818): at org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage.createImagePart(BinaryPartAbstractImage.java:158)
...
E/AndroidRuntime(21818): Caused by: java.lang.NoClassDefFoundError: sun.awt.AppContext
E/AndroidRuntime(21818): at ae.javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:155)
E/AndroidRuntime(21818): at ae.javax.imageio.ImageIO.<clinit>(ImageIO.java:65)
...
指的是这段代码:
WordprocessingMLPackage wordMLPackage;
File file;
...
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, file);
我已经将所有必要的库从AndroidDocxToHtml示例(以及ae-awt.jar
)添加到我应用的libs
文件夹中。
没有图像我的应用程序完美地生成docx文件
有什么办法可以解决吗?
谢谢!
答案 0 :(得分:1)
我让这个工作,但它需要覆盖来自ae-awt和ae-xmlgraphics-commons的大约8个文件。我硬编码只处理jpg文件。
删除对sun.security.action.LoadLibraryAction的所有引用,只需调用System.loadLibrary(&#34; jpeg&#34;)
删除AppContext并将其替换为ImageIO中的ThreadGroup,如下所示:
private static synchronized CacheInfo getCacheInfo() {
ThreadGroup group = Thread.currentThread().getThreadGroup();
CacheInfo info = (CacheInfo) instances.get(group);
//CacheInfo info = (CacheInfo)context.get(CacheInfo.class);
if (info == null) {
info = new CacheInfo();
instances.put(group, info);
}
return info;
}
与imageio.spi.IIORegistry相同
在ae-xmlgraphics-commons中,对ImageManager.java,DefaultImageContext和BinaryPartAbstractImage进行了一些更改。前两个我不记得我做了什么(我不能轻易地区分它们,也许不需要进行任何更改),但BinaryPartAbstractIMage有很多变化。我将getImageInfo()硬编码为IMAGE_JPEG,因为sessionContext / Context类型存在问题(以某种方式试图确定图像类型并调用相应的预加载器)。因此我假设所有图像都是jpeg并强制它始终使用JPEG预加载器。
getImageInfo() ImageInfo info = new ImageInfo(url.toURI()。toString(),ContentTypes.IMAGE_JPEG);
有一个扭曲的图像出现在文档中。我仍然需要弄清楚宽度/高度公式才能使其正确嵌入。
答案 1 :(得分:1)
对于每个人来说,也遇到了这个问题。
以下是使docx4j适用于图像的必要步骤:
ae
的适当软件包。sun.awt.AppContext
到ae.sun.awt.AppContext
。在带有预加载器的org.apache.xmlgraphics.util.Service
手动填充列表中:
private static List<String> getProviderNames(Class<?> cls, ClassLoader cl) {
...
if (fillDefautsProviderNames(cls, l))
return l;
...
}
private static boolean fillDefautsProviderNames(Class<?> cls, List<String> l) {
if (cls == org.apache.xmlgraphics.image.loader.spi.ImagePreloader.class) {
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderTIFF");
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderGIF");
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderJPEG");
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderBMP");
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderEMF");
l.add("org.apache.xmlgraphics.image.loader.impl.PreloaderEPS");
l.add("org.apache.xmlgraphics.image.loader.impl.imageio.PreloaderImageIO");
return true;
}
return false;
}
在displayImageInfo(ImageInfo info)
中删除功能org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage
。
我已准备好包含更改的存储库:ae-awt,ae-xmlgraphics-commons,docx4j-android。
您可以在此处找到已编译的库:docx4j_images_prepared_libs.zip
享受!