当前位置: 首页 > 知识库问答 >
问题:

如何复制或输出位图?

欧阳声
2023-03-14

我正在阅读一个docx模板,做一些mods并输出它。我正在复制文档的所有元素,除了位图之外,一个标记出现在位图应该包含文本的地方,“此图像当前无法显示”。我已经试过几次了。

将位图从一个文档复制到另一个文档的推荐方法是什么?

我可以获得如下图像:

addPictureData(pic,outputDoc.picture_type_gif);

非常感谢您的任何帮助。对Apache-POI印象深刻。

共有1个答案

闽经纬
2023-03-14

很晚的回答,但谁知道呢…如果要将一个文档的图片复制到另一个文档,请尝试以下操作:

public void copyAllImages( XWPFDocument sourceDocument, XWPFDocument targetDocument ) {
    Map<String, Integer> extractedImages = new HashMap<String, Integer>();
    XWPFPictureData pictureData = null;

    // 1. Writing all found images to the disk (to the same folder as your source document)
    for ( XWPFParagraph par : sourceDocument.getParagraphs() ) {
        for ( XWPFRun run : par.getRuns() ) {
            for ( XWPFPicture picture : run.getEmbeddedPictures() ) {
                pictureData = picture.getPictureData();
                byte[] img = pictureData.getData();
                String fileName = pictureData.getFileName();
                int imageFormat = pictureData.getPictureType();
                writeByteArrayToFile( img, fileName );
                extractedImages.put( fileName, imageFormat );
            }
        }
    }

    // 2. Writing images from the disk to the final document,
    // creating 1 new paragraph with 1 run for each image.
    for ( String imageFileName : extractedImages.keySet() ) {
        XWPFParagraph newParagraph = targetDocument.createParagraph();
        XWPFRun newRun = newParagraph.createRun();
        copyImageToRun( imageFileName, newRun, extractedImages.get( imageFileName ) );
    }
}

private static void writeByteArrayToFile( byte[] byteArray, String fileName ) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream( new File( fileName ) );
        out.write( byteArray );
    } catch ( Exception e ) {
        e.printStackTrace();
    } finally {
        try {
            out.close();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

private void copyImageToRun( String imageFileName, XWPFRun run, int format ) {
    run.setText( imageFileName );
    run.addBreak();

    try {
        run.addPicture( new FileInputStream( imageFileName ), format, imageFileName,
                Units.toEMU( 200 ), Units.toEMU( 200 ) ); // 200x200 pixels

    } catch ( Exception e ) {
        e.printStackTrace();
    }

    run.addBreak( BreakType.PAGE );
}

因此,只需两个XWPFDocument对象,将它们传递给第一个函数(copyAllImages),然后像往常一样使用document.write(out)保存这些文档。根据您的需要,您还可以在步骤1中添加将复制段落的所有内容(不仅仅是图像)的代码。也许可以跳过将图像写入磁盘,直接将pictureData插入到新创建的运行中。然而,我没有设法使它工作(图像根本没有出现)。但采用两步法,最终给出了一个结果。

希望有帮助!

 类似资料:
  • 问题内容: 从文档中的示例来看,似乎不应该有任何输出 但是,当我在python shell中尝试时,列表会被打印出来。我想知道这是否是默认行为,以及如何抑制的输出。 问题答案: 这是按清洁度递减的顺序 抑制 输出的方法。他们假设您使用的是Python 3。 您可以重定向到特殊目标。 import subprocess subprocess.run([‘ls’, ‘-l’], stdout=subp

  • 问题内容: 我是python的新手,正在编写一些脚本来自动从FTP服务器等下载文件。我想显示下载进度,但是我希望它保持不变,例如: 输出: 正在下载文件FooFile.txt [47%] 我正在尝试避免这样的事情: 我应该怎么做呢? 复制 : 如何在命令行应用程序的当前行上打印? 问题答案: 您还可以使用回车符:

  • 本文向大家介绍如何复制或克隆Java ArrayList?,包括了如何复制或克隆Java ArrayList?的使用技巧和注意事项,需要的朋友参考一下  java.util.ArrayList类的 clone()方法返回此ArrayList实例的浅表副本(即,不复制元素本身)。使用此方法,可以将一个数组列表的内容复制到另一个数组列表。 示例 输出结果

  • 在此处输入图像描述 > HTML CSS #主输入:焦点{大纲:无!重要;边框: 2px固体hsl(0, 93%, 68%);} #箭头图标{宽度:90px;高度:52px;位置:绝对;背景:线性渐变(向右,hsl(0,80%,86%)0%,hsl(0,74%,74%)100%);边距顶部:35px;边距左侧:-91px;边框半径:30px;方框阴影:3px16px 10px 0px#f4dddd

  • 问题内容: 我需要编写一个简单的基于终端的程序, 使用包裹在BufferedReader中的FileReader从文件中读取一些文本。 将文本打印到控制台,用户应该可以对其进行修改。 输入Enter + S后,程序应读取修改后的文本并将其保存回原始文件。 总而言之,这个想法是为没有GUI的类Unix环境编写一个文本编辑器。 但是,我在步骤2和3中遇到问题。 System.out打印的所有文本都是不

  • 问题内容: 使用终端时,如何将命令的输出传递到剪贴板中并粘贴回去?例如: 问题答案: 我一直想做到这一点,并找到了一种很好而简单的方法。我写下了完整的程序,以防万一其他人需要它。 首先安装一个名为16 kB的程序: 然后,您可以通过管道将输出复制到剪贴板: 要粘贴刚复制的文本,应使用: 为了简化生活,您可以像我一样在.bashrc文件中设置别名: 要了解它的用处,想象一下我想在一个新的终端窗口中打