• Apache poi xwpf word转PDF中文显示问题解决


    目录

    POM依赖

    核心配置代码

    PDF下载流问题

    WPS模板问题


    原问题解决方法:https://github.com/opensagres/xdocreport/issues/161

    POM依赖

    1. <properties>
    2. <java.version>1.8java.version>
    3. <poi.version>3.14poi.version>
    4. properties>
    5. <dependencies>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starterartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.projectlombokgroupId>
    12. <artifactId>lombokartifactId>
    13. <optional>trueoptional>
    14. dependency>
    15. <dependency>
    16. <groupId>org.springframework.bootgroupId>
    17. <artifactId>spring-boot-starter-testartifactId>
    18. <scope>testscope>
    19. dependency>
    20. <dependency>
    21. <groupId>org.apache.poigroupId>
    22. <artifactId>poiartifactId>
    23. <version>${poi.version}version>
    24. dependency>
    25. <dependency>
    26. <groupId>org.apache.poigroupId>
    27. <artifactId>poi-ooxmlartifactId>
    28. <version>${poi.version}version>
    29. dependency>
    30. <dependency>
    31. <groupId>fr.opensagres.xdocreportgroupId>
    32. <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gaeartifactId>
    33. <version>2.0.1version>
    34. <scope>compilescope>
    35. dependency>
    36. <dependency>
    37. <groupId>fr.opensagres.xdocreportgroupId>
    38. <artifactId>fr.opensagres.xdocreport.documentartifactId>
    39. <version>2.0.1version>
    40. <scope>compilescope>
    41. dependency>
    42. dependencies>

    请记住,word转换如果没问题,那么就要设置pdf的字体,这个是铁律!

    核心配置代码

    将PdfOptions提出来作为方法使用

    1. private PdfOptions getPdfOptions() {
    2. PdfOptions pdfOptions = PdfOptions.create();
    3. // 解决中文不显示问题
    4. pdfOptions.fontProvider(new IFontProvider() {
    5. @Override
    6. public Font getFont(String familyName, String encoding, float size, int style, Color color) {
    7. try {
    8. File file = new File(pdfChineseTTF);
    9. Preconditions.checkState(file.exists(), "中文字体文件不存在:" + pdfChineseTTF);
    10. BaseFont bfChinese = BaseFont.createFont(pdfChineseTTF, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    11. Font fontChinese = new Font(bfChinese, size, style, color);
    12. if (familyName != null) {
    13. fontChinese.setFamily(familyName);
    14. }
    15. return fontChinese;
    16. } catch (Throwable e) {
    17. e.printStackTrace();
    18. // An error occurs, use the default font provider.
    19. return ITextFontRegistry.getRegistry().getFont(familyName, encoding, size, style, color);
    20. }
    21. }
    22. });
    23. return pdfOptions;
    24. }

    PDF下载流问题

    注意前端PDF文件流空白问题参考以下方案进行处理

    js下载PDF文件流,打开空白问题_使用jspdf导出服务器上pdf文件的时候文件里面没有内容_夏小锋的博客-CSDN博客

    前端下载二进制流pdf文件,下载成功,打开空白问题解决_前端下载pdf文件流打开空白_Helen_fight的博客-CSDN博客

    WPS模板问题

    使用wps处理的template.docx文件不能识别到页脚信息,请使用微软提供的office进行编辑

    以下是WPS footer xml部分,不是OOXML需要的解析范式:

    1. <pkg:part pkg:name="/word/footer1.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml">
    2. <pkg:xmlData>
    3. <w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" mc:Ignorable="w14 w15 wp14">
    4. <w:p>
    5. <w:pPr>
    6. <w:pStyle w:val="2"/>
    7. <w:tabs>
    8. <w:tab w:val="right" w:pos="8426"/>
    9. w:tabs>
    10. <w:jc w:val="right"/>
    11. <w:rPr>
    12. <w:rFonts w:hint="default" w:eastAsia="宋体"/>
    13. <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
    14. w:rPr>
    15. w:pPr>
    16. <w:r>
    17. <w:rPr>
    18. <w:sz w:val="18"/>
    19. w:rPr>
    20. <mc:AlternateContent>
    21. <mc:Choice Requires="wps">
    22. <w:drawing>
    23. <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251659264" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1">
    24. <wp:simplePos x="0" y="0"/>
    25. <wp:positionH relativeFrom="margin">
    26. <wp:align>centerwp:align>
    27. wp:positionH>
    28. <wp:positionV relativeFrom="paragraph">
    29. <wp:posOffset>0wp:posOffset>
    30. wp:positionV>
    31. <wp:extent cx="1828800" cy="1828800"/>
    32. <wp:effectExtent l="0" t="0" r="0" b="0"/>
    33. <wp:wrapNone/>
    34. <wp:docPr id="3" name="文本框 3"/>
    35. <wp:cNvGraphicFramePr/>
    36. <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
    37. <a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
    38. <wps:wsp>
    39. <wps:cNvSpPr txBox="1"/>
    40. <wps:spPr>
    41. <a:xfrm>
    42. <a:off x="0" y="0"/>
    43. <a:ext cx="1828800" cy="1828800"/>
    44. a:xfrm>
    45. <a:prstGeom prst="rect">
    46. <a:avLst/>
    47. a:prstGeom>
    48. <a:noFill/>
    49. <a:ln w="6350">
    50. <a:noFill/>
    51. a:ln>
    52. wps:spPr>
    53. <wps:style>
    54. <a:lnRef idx="0">
    55. <a:schemeClr val="accent1"/>
    56. a:lnRef>
    57. <a:fillRef idx="0">
    58. <a:schemeClr val="accent1"/>
    59. a:fillRef>
    60. <a:effectRef idx="0">
    61. <a:schemeClr val="accent1"/>
    62. a:effectRef>
    63. <a:fontRef idx="minor">
    64. <a:schemeClr val="dk1"/>
    65. a:fontRef>
    66. wps:style>
    67. <wps:txbx>
    68. <w:txbxContent>
    69. <w:p>
    70. <w:pPr>
    71. <w:pStyle w:val="2"/>
    72. w:pPr>
    73. <w:r>
    74. <w:t xml:space="preserve">w:t>
    75. w:r>
    76. <w:r>
    77. <w:fldChar w:fldCharType="begin"/>
    78. w:r>
    79. <w:r>
    80. <w:instrText xml:space="preserve"> PAGE \* MERGEFORMAT w:instrText>
    81. w:r>
    82. <w:r>
    83. <w:fldChar w:fldCharType="separate"/>
    84. w:r>
    85. <w:r>
    86. <w:t>1w:t>
    87. w:r>
    88. <w:r>
    89. <w:fldChar w:fldCharType="end"/>
    90. w:r>
    91. <w:r>
    92. <w:t xml:space="preserve"> 页 共 w:t>
    93. w:r>
    94. <w:r>
    95. <w:fldChar w:fldCharType="begin"/>
    96. w:r>
    97. <w:r>
    98. <w:instrText xml:space="preserve"> NUMPAGES \* MERGEFORMAT w:instrText>
    99. w:r>
    100. <w:r>
    101. <w:fldChar w:fldCharType="separate"/>
    102. w:r>
    103. <w:r>
    104. <w:t>2w:t>
    105. w:r>
    106. <w:r>
    107. <w:fldChar w:fldCharType="end"/>
    108. w:r>
    109. <w:r>
    110. <w:t xml:space="preserve">w:t>
    111. w:r>
    112. w:p>
    113. w:txbxContent>
    114. wps:txbx>
    115. <wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="none" lIns="0" tIns="0" rIns="0" bIns="0" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="t" anchorCtr="0" forceAA="0" upright="0" compatLnSpc="1">
    116. <a:spAutoFit/>
    117. wps:bodyPr>
    118. wps:wsp>
    119. a:graphicData>
    120. a:graphic>
    121. wp:anchor>
    122. w:drawing>
    123. mc:Choice>
    124. <mc:Fallback>
    125. <w:pict>
    126. <v:shape id="_x0000_s1026" o:spid="_x0000_s1026" o:spt="202" type="#_x0000_t202" style="position:absolute;left:0pt;margin-top:0pt;height:144pt;width:144pt;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-wrap-style:none;z-index:251659264;mso-width-relative:page;mso-height-relative:page;" filled="f" stroked="f" coordsize="21600,21600" o:gfxdata="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 AAAAAAYABgBZAQAAwwUAAAAA ">
    127. <v:fill on="f" focussize="0,0"/>
    128. <v:stroke on="f" weight="0.5pt"/>
    129. <v:imagedata o:title=""/>
    130. <o:lock v:ext="edit" aspectratio="f"/>
    131. <v:textbox inset="0mm,0mm,0mm,0mm" style="mso-fit-shape-to-text:t;">
    132. <w:txbxContent>
    133. <w:p>
    134. <w:pPr>
    135. <w:pStyle w:val="2"/>
    136. w:pPr>
    137. <w:r>
    138. <w:t xml:space="preserve">w:t>
    139. w:r>
    140. <w:r>
    141. <w:fldChar w:fldCharType="begin"/>
    142. w:r>
    143. <w:r>
    144. <w:instrText xml:space="preserve"> PAGE \* MERGEFORMAT w:instrText>
    145. w:r>
    146. <w:r>
    147. <w:fldChar w:fldCharType="separate"/>
    148. w:r>
    149. <w:r>
    150. <w:t>1w:t>
    151. w:r>
    152. <w:r>
    153. <w:fldChar w:fldCharType="end"/>
    154. w:r>
    155. <w:r>
    156. <w:t xml:space="preserve"> 页 共 w:t>
    157. w:r>
    158. <w:r>
    159. <w:fldChar w:fldCharType="begin"/>
    160. w:r>
    161. <w:r>
    162. <w:instrText xml:space="preserve"> NUMPAGES \* MERGEFORMAT w:instrText>
    163. w:r>
    164. <w:r>
    165. <w:fldChar w:fldCharType="separate"/>
    166. w:r>
    167. <w:r>
    168. <w:t>2w:t>
    169. w:r>
    170. <w:r>
    171. <w:fldChar w:fldCharType="end"/>
    172. w:r>
    173. <w:r>
    174. <w:t xml:space="preserve">w:t>
    175. w:r>
    176. w:p>
    177. w:txbxContent>
    178. v:textbox>
    179. v:shape>
    180. w:pict>
    181. mc:Fallback>
    182. mc:AlternateContent>
    183. w:r>
    184. <w:r>
    185. <w:rPr>
    186. <w:rFonts w:hint="eastAsia"/>
    187. <w:sz w:val="18"/>
    188. <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
    189. w:rPr>
    190. <w:tab/>
    191. w:r>
    192. <w:r>
    193. <w:rPr>
    194. <w:rFonts w:hint="eastAsia"/>
    195. <w:sz w:val="18"/>
    196. <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
    197. w:rPr>
    198. <w:tab/>
    199. w:r>
    200. <w:r>
    201. <w:rPr>
    202. <w:rFonts w:hint="eastAsia"/>
    203. <w:sz w:val="18"/>
    204. <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
    205. w:rPr>
    206. <w:t>合同编号:w:t>
    207. w:r>
    208. <w:r>
    209. <w:t>skdfdz20231019142503w:t>
    210. w:r>
    211. w:p>
    212. w:ftr>
    213. pkg:xmlData>
    214. pkg:part>

  • 相关阅读:
    低代码平台的优势与不足之处
    Go 基本数据类型和 string 类型介绍
    SN65HVD3082、SN65HVD3088、SN75HVD3082、SN65HVD3085低功耗RS-485收发器
    OpenHD改造实现廉价高清数字图传(树莓派+PC)—(五)gstreamer视频采集、传输和显示
    【力扣】杨辉三角问题
    使用OpenAPI提升网关安全的开源软件,诚邀小伙伴参与
    可用性测试的理解
    C#异步TCP客户端连接
    微信转账到零钱2种实现方式,SDK和API对接
    selenium网页自动化使用教程
  • 原文地址:https://blog.csdn.net/boonya/article/details/133892573