使用docx4j将图像添加到doc文件

时间:2014-04-27 19:15:57

标签: android ms-word docx docx4j

我正在尝试使用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文件
有什么办法可以解决吗? 谢谢!

2 个答案:

答案 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适用于图像的必要步骤:

  1. 将错过的类从OpenJDK添加到包含ae的适当软件包。
  2. 更改对新类的引用,例如sun.awt.AppContextae.sun.awt.AppContext
  3. 在带有预加载器的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;
    }
    
  4. displayImageInfo(ImageInfo info)中删除功能org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage

  5. 我已准备好包含更改的存储库:ae-awtae-xmlgraphics-commonsdocx4j-android

    您可以在此处找到已编译的库:docx4j_images_prepared_libs.zip

    享受!