如何使用Apache POI从我的Java代码中将框架插入word文件?
我希望框架(仅限左边框)插入页面的右上角。
您可以看到以红色框突出显示的框架:
答案 0 :(得分:0)
您可以使用docx4j。使用docx4j处理docx文件更容易。 您可以查看:http://blog.iprofs.nl/2012/10/22/adding-images-and-layout-to-your-docx4j-generated-word-documents-part-1/
以下是代码:
public class AddingAnInlineImage {
/**
* As is usual, we create a package to contain the document.
* Then we create a file that contains the image we want to add to the document.
* In order to be able to do something with this image, we'll have to convert
* it to an array of bytes. Finally we add the image to the package
* and save the package.
*/
public static void main (String[] args) throws Exception {
WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.createPackage();
File file = new File("src/main/resources/iProfsLogo.png");
byte[] bytes = convertImageToByteArray(file);
addImageToPackage(wordMLPackage, bytes);
wordMLPackage.save(new java.io.File("src/main/files/HelloWord7.docx"));
}
/**
* Docx4j contains a utility method to create an image part from an array of
* bytes and then adds it to the given package. In order to be able to add this
* image to a paragraph, we have to convert it into an inline object. For this
* there is also a method, which takes a filename hint, an alt-text, two ids
* and an indication on whether it should be embedded or linked to.
* One id is for the drawing object non-visual properties of the document, and
* the second id is for the non visual drawing properties of the picture itself.
* Finally we add this inline object to the paragraph and the paragraph to the
* main document of the package.
*
* @param wordMLPackage The package we want to add the image to
* @param bytes The bytes of the image
* @throws Exception Sadly the createImageInline method throws an Exception
* (and not a more specific exception type)
*/
private static void addImageToPackage(WordprocessingMLPackage wordMLPackage,
byte[] bytes) throws Exception {
BinaryPartAbstractImage imagePart =
BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
int docPrId = 1;
int cNvPrId = 2;
Inline inline = imagePart.createImageInline("Filename hint",
"Alternative text", docPrId, cNvPrId, false);
P paragraph = addInlineImageToParagraph(inline);
wordMLPackage.getMainDocumentPart().addObject(paragraph);
}
/**
* We create an object factory and use it to create a paragraph and a run.
* Then we add the run to the paragraph. Next we create a drawing and
* add it to the run. Finally we add the inline object to the drawing and
* return the paragraph.
*
* @param inline The inline object containing the image.
* @return the paragraph containing the image
*/
private static P addInlineImageToParagraph(Inline inline) {
// Now add the in-line image to a paragraph
ObjectFactory factory = new ObjectFactory();
P paragraph = factory.createP();
R run = factory.createR();
paragraph.getContent().add(run);
Drawing drawing = factory.createDrawing();
run.getContent().add(drawing);
drawing.getAnchorOrInline().add(inline);
return paragraph;
}
/**
* Convert the image from the file into an array of bytes.
*
* @param file the image file to be converted
* @return the byte array containing the bytes from the image
* @throws FileNotFoundException
* @throws IOException
*/
private static byte[] convertImageToByteArray(File file)
throws FileNotFoundException, IOException {
InputStream is = new FileInputStream(file );
long length = file.length();
// You cannot create an array using a long, it needs to be an int.
if (length > Integer.MAX_VALUE) {
System.out.println("File too large!!");
}
byte[] bytes = new byte[(int)length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// Ensure all the bytes have been read
if (offset < bytes.length) {
System.out.println("Could not completely read file "
+file.getName());
}
is.close();
return bytes;
}