image.png (339.5 KB)
测试示例文档.docx (995.7 KB)
docx转pdf,表格到顶部的宽度变宽了
Document doc = new Document(obsObject.getObjectContent());
String fileName = reportRecord.getReportListCode()+“_DraftReport.pdf”;
String filePath = fileRecord.getFileAbsolutePath()+“/”+fileName;
doc.save(filePath, SaveFormat.PDF);
@qiaoliguoguo, 不幸的是,我无法使用 Aspose.Words for Java 23.11 重现该问题。 请找到Aspose.Words和Microsoft Word 2019生成的PDF:
测试示例文档.aw.23.11.pdf (1.1 MB)
测试示例文档.word2019.pdf (2.3 MB)
您检查一下23.11版本是否可以重现该问题? 如果问题可以重现,请附上 Aspose.Words 在您的计算机上创建的 PDF 文件。
通过排查,是发现因为加了水印,就会出现这个现象,加水印后页眉多了一空行
image.png (9.4 KB)
加水印代码如下:
/**
* 加文字水印方法
*
* @param doc word文件流
* @param watermarkText 水印内容
*/
public static void insertWatermarkText(Document doc, String watermarkText) {
// 居中
insertWatermarkText( doc, watermarkText, new Function<Shape, Object>() {
@Override
public Object apply(Shape watermark) {
// Place the watermark in the page center.
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.setWrapType( WrapType.NONE );
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
return null;
}
} );
}
//插入文本水印
private static void insertWatermarkText(Document doc, String watermarkText, Function<Shape, Object> watermaskPositionConfigFunc) {
Shape watermark = new Shape(doc,ShapeType.TEXT_PLAIN_TEXT );
watermark.getTextPath().setText(watermarkText);
// 这里设置为宋体可以保证在转换为PDF时中文不是乱码.
watermark.getTextPath().setFontFamily("微软雅黑");
watermark.getTextPath().setSize(200);
try {
// 水印大小
watermark.setWidth(450);
watermark.setHeight(200);
} catch (Exception e) {
throw new RuntimeException( e );
}
// 旋转
watermark.setRotation(-45);
//不透明性
watermark.getFill().setOpacity(0.4);
//字体RGB颜色
watermark.getFill().setColor(Color.RED);
watermark.setStrokeColor(Color.RED);
watermaskPositionConfigFunc.apply(watermark);
Paragraph watermarkPara = new Paragraph( doc );
watermarkPara.appendChild( watermark );
NodeCollection nodeCollection = doc.getChildNodes(NodeType.HEADER_FOOTER,true);
for(Node node:nodeCollection.toArray()){
HeaderFooter header = (HeaderFooter) node;
try {
header.appendChild( watermarkPara.deepClone( true ) );
} catch (Exception e) {
throw new RuntimeException( e );
}
}
}
@qiaoliguoguo, 我修改了insertWatermarkText方法,请参阅下面代码中的注释:
private static void insertWatermarkText(Document doc, String watermarkText, Function<Shape, Object> watermaskPositionConfigFunc) {
Shape watermark = new Shape(doc,ShapeType.TEXT_PLAIN_TEXT );
watermark.getTextPath().setText(watermarkText);
// 这里设置为宋体可以保证在转换为PDF时中文不是乱码.
watermark.getTextPath().setFontFamily("微软雅黑");
watermark.getTextPath().setSize(200);
try {
// 水印大小
watermark.setWidth(450);
watermark.setHeight(200);
} catch (Exception e) {
throw new RuntimeException( e );
}
// 旋转
watermark.setRotation(-45);
//不透明性
watermark.getFill().setOpacity(0.4);
//字体RGB颜色
watermark.getFill().setColor(Color.RED);
watermark.setStrokeColor(Color.RED);
watermaskPositionConfigFunc.apply(watermark);
// 这个新段落会导致格式问题。
// Paragraph watermarkPara = new Paragraph( doc );
// watermarkPara.appendChild( watermark );
NodeCollection nodeCollection = doc.getChildNodes(NodeType.HEADER_FOOTER,true);
// 让我们从标题中克隆空段落并将其用于插入水印。
HeaderFooter firstHeader = (HeaderFooter) nodeCollection.get(0);
Paragraph watermarkPara = (Paragraph)firstHeader.getLastChild().deepClone(true);
watermarkPara.appendChild( watermark );
for(Node node:nodeCollection.toArray()){
HeaderFooter header = (HeaderFooter) node;
try {
// 将最后一段替换为包含水印的段落。
header.getLastChild().remove();
header.appendChild( watermarkPara.deepClone( true ) );
} catch (Exception e) {
throw new RuntimeException( e );
}
}
}
1 Like
OK,这样问题已经解决,谢谢
另外问下,水印在图片下面和底色下面,这个能否控制让显示在最上层?
image.png (180.4 KB)
image.png (117.4 KB)
@qiaoliguoguo, 没有 API 方法可以让您执行此操作。 一种可能的解决方案是迭代Word文档中的所有图像,将它们移动到形状对象,以绝对位置将这些形状插入到页眉,并使形状对象位于包含水印的形状对象下方。 仅当页面不包含文本而仅包含图像时,这才有效,因为文本将放置在形状对象内图像的顶部。
1 Like