docx转PDF格式有变动

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