日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了Java ApachePOI:在文本前面插入圖像的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我的docx文件中有一個占位符圖像,我想用新圖像替換它。問題是–占位符圖像在文本前面有一個屬性,而新圖像沒有。因此,對齊方式會中斷。下面是我的代碼片段以及帶有占位符的docx和結果docx。

            .......
            replaceImage(doc, "Рисунок 1", qr, 50, 50);

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            doc.write(out);
            out.close();
            return out.toByteArray();
        }
    }

    public XWPFDocument replaceImage(XWPFDocument document, String imageOldName, byte[] newImage, int newImageWidth, int newImageHeight) throws Exception {
        try {
            int imageParagraphPos = -1;
            XWPFParagraph imageParagraph = null;
            List<IBodyElement> documentElements = document.getBodyElements();
            for (IBodyElement documentElement : documentElements) {
                imageParagraphPos++;
                if (documentElement instanceof XWPFParagraph) {
                    imageParagraph = (XWPFParagraph) documentElement;
                    if (imageParagraph.getCTP() != null && imageParagraph.getCTP().toString().trim().contains(imageOldName)) {
                        break;
                    }
                }
            }

            if (imageParagraph == null) {
                throw new Exception("Unable to replace image data due to the exception:
"
                        + "'" + imageOldName + "' not found in in document.");
            }
            ParagraphAlignment oldImageAlignment = imageParagraph.getAlignment();

            // remove old image
            boolean isDeleted = document.removeBodyElement(imageParagraphPos);
            // now add new image
            XWPFParagraph newImageParagraph = document.createParagraph();
            XWPFRun newImageRun = newImageParagraph.createRun();
            newImageParagraph.setAlignment(oldImageAlignment);
            try (InputStream is = new ByteArrayInputStream(newImage)) {
                newImageRun.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, "qr",
                        Units.toEMU(newImageWidth), Units.toEMU(newImageHeight));
            }

            // set new image at the old image position
            document.setParagraph(newImageParagraph, imageParagraphPos);

            // NOW REMOVE REDUNDANT IMAGE FORM THE END OF DOCUMENT
            document.removeBodyElement(document.getBodyElements().size() - 1);

            return document;
        } catch (Exception e) {
            throw new Exception("Unable to replace image '" + imageOldName + "' due to the exception:
" + e);
        }
    }

帶占位符的圖像:

enter image description here

生成的圖像:

enter image description here

推薦答案

若要替換Microsoft Word中的圖片模板,無需將其刪除。

存儲是這樣的:
嵌入的媒體以二進制文件的形式存儲。這是圖片數據(XWPFPictureData)。在文檔中,圖片元素(XWPFPicture)鏈接到該圖片數據。

XWPFPicture具有位置、大小和文本流動設置。不需要更改這些設置。

需要在XWPFPictureData中更改。在那里,用戶可以用新的二進制內容替換舊的二進制內容。

因此,需要在文檔中找到XWPFPicture。在文檔中插入圖片時存儲了一個非視覺圖片名稱。因此,如果一個人知道這個名字,那么這可能是找到這張照片的標準。

如果找到,則可以從找到的XWPFPicture獲得XWPFPictureData。有方法XWPFPicture.getPictureData可以這樣做。然后,可以用新的二進制內容替換舊的二進制內容XWPFPictureData。XWPFPictureData是一個包部件。因此它必須PackagePart.getOutputStream獲取要寫入的輸出流。

下面的完整示例顯示了全部。

source.docx需要具有名為&qot;QRTemplate.jpg&quot;的嵌入圖片。這是使用Word圖形用戶界面將圖片插入Word文檔時使用的源文件的名稱。并且需要包含新內容的文件QR.jpg。

然后result.docx將名為&quot;QRTemplate.jpg&quot;的所有圖片替換為給定文件QR.jpg的內容。

import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;

public class WordReplacePictureData {
    
 static XWPFPicture getPictureByName(XWPFRun run, String pictureName) {
  if (pictureName == null) return null;
  for (XWPFPicture picture : run.getEmbeddedPictures()) {
   String nonVisualPictureName = picture.getCTPicture().getNvPicPr().getCNvPr().getName();
   if (pictureName.equals(nonVisualPictureName)) {
    return picture;   
   }
  }
  return null;
 }
 
 static void replacePictureData(XWPFPictureData source, String pictureResultPath) {
  try ( FileInputStream in = new FileInputStream(pictureResultPath); 
        OutputStream out = source.getPackagePart().getOutputStream();
       ) {
   byte[] buffer = new byte[2048];
   int length;
   while ((length = in.read(buffer)) > 0) {
    out.write(buffer, 0, length);
   }
  } catch (Exception ex) {
   ex.printStackTrace();  
  }
 }
 
 static void replacePicture(XWPFRun run, String pictureName, String pictureResultPath) {
  XWPFPicture picture = getPictureByName(run, pictureName);
  if (picture != null) {
   XWPFPictureData source = picture.getPictureData();
   replacePictureData(source, pictureResultPath);
  }   
 }

 public static void main(String[] args) throws Exception {
  String templatePath = "./source.docx";
  String resultPath = "./result.docx";
  String pictureTemplateName = "QRTemplate.jpg";
  String pictureResultPath = "./QR.jpg";
  
  try ( XWPFDocument document = new XWPFDocument(new FileInputStream(templatePath));
        FileOutputStream out = new FileOutputStream(resultPath);
       ) {
   
   for (IBodyElement bodyElement : document.getBodyElements()) {
    if (bodyElement instanceof XWPFParagraph) {
     XWPFParagraph paragraph = (XWPFParagraph)bodyElement;
     for (XWPFRun run : paragraph.getRuns()) {
      replacePicture(run, pictureTemplateName, pictureResultPath);
     }
    }
   }       
   document.write(out);
  }    
 }
}

這篇關于Java ApachePOI:在文本前面插入圖像的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:ApachePOI Java 圖像 插入 文本
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定