linux 下xdocreport 生成word 和pdf 亂碼(中文是空,或者方塊)
阿新 • • 發佈:2019-02-11
最近專案需要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>
- 模板是放到伺服器資料夾,可以直接讀取,或者放到專案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檔案