1. 程式人生 > >linux 下xdocreport 生成word 和pdf 亂碼(中文是空,或者方塊)

linux 下xdocreport 生成word 和pdf 亂碼(中文是空,或者方塊)

最近專案需要pdf列印,通過調研和網上搜索xdocreport,處理圖片和word,pdf無論是生成速度和記憶體消耗,比doc4j都要速度快,記憶體消耗小。開發一直在window下面,生成pdf正常,中文不會亂碼,部署到linux伺服器就各種問題。
解決方法:
1. 所引入jar包 pom.xml

<xdocreport.version>2.0.1</xdocreport.version>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>
freemarker</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.core</artifactId> <version>${xdocreport.version}</version> </dependency
>
<dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId> <version>${xdocreport.version}</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId
>
<artifactId>fr.opensagres.xdocreport.document.docx</artifactId> <version>${xdocreport.version}</version> </dependency>
  1. 模板是放到伺服器資料夾,可以直接讀取,或者放到專案resource中,打包需要過濾,不然會檔案損壞(pom部分程式碼)。
   <build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>template/*.*</exclude>
            </excludes>
        </resource>
    </resources>
    <plugins>
        <!--資原始檔管理-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${maven.plugins.version}</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>zip</nonFilteredFileExtension>
                        </nonFilteredFileExtensions>
                        <overwrite>true</overwrite>
                        <outputDirectory>${project.basedir}/target/classes/template</outputDirectory>
                        <!--複製該profile的配置檔案-->
                        <resources>
                            <resource>
                                <directory>${project.basedir}/src/main/resources/template</directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3.需要有解析字型檔案,需放到伺服器的資料夾下讀取,如放到resource下,無法載入字型,導致列印pdf亂碼

如:宋體 windows字型檔案simsun.ttc,linux字型檔案simsunb.ttf
載入字型檔案的程式碼:
public class ExtFontFactoryImp extends FontFactoryImp {
public ExtFontFactoryImp(){
    super();

}
/**
 1. 註冊字型(現在只有宋體)
 */
public int registerDirectories(){
   int i = 0;
   /*****************註釋的是預設載入的字型,windows下面是可以找到的,linux下無法載入/usr/下的字型*********************************/
       /i += registerDirectory("C:/Windows/Fonts");
       i += registerDirectory("c:/winnt/fonts");
       i += registerDirectory("d:/windows/fonts");
       i += registerDirectory("/usr/share/fonts", true);
       i += registerDirectory("/usr/share/fonts/zh_CN", true);
       i += registerDirectory("/usr/share/X11/fonts", true);
       i += registerDirectory("/usr/share/fonts", true);
       i += registerDirectory("/Library/Fonts");
       i += registerDirectory("/System/Library/Fonts");
       i += registerDirectory(System.getenv("LICENSE_HOME"), true);*/
       /***********載入自己準備的字型檔案D盤font下****************/
       i += registerDirectory("D:"+File.separator+"font");
       return i;
}
}

4、生成模板檔案

1.必須是docx檔案,office2013 或者office2010 都可以,先新建一個docx檔案,然後更改名稱.zip檔案
這裡寫圖片描述 —》這裡寫圖片描述 開啟zip模板中word/docment.xml,可作為模板,如果只要取出所需的xml就可以做作為模板啦,這裡寫圖片描述
5、jar衝突、如:引入1步的jar後,不需要引入poi和poi-ooxml,如引入可能造成jar衝突而報錯
6、word 文件中最好是宋體,我專案中載入的是宋體的字型檔案
7、Notepad++的XML Tools外掛格式化XML檔案
8、使用freemaker填充xml模版(el 表示式) 如:
這裡寫圖片描述
9、後續程式碼放到git
參考:
基於freemarker ,xdocreport生成word,pdf
Notepad++的XML Tools外掛格式化XML檔案