diff --git a/doc/Deng.ttf b/doc/Deng.ttf new file mode 100644 index 0000000..0a727fd Binary files /dev/null and b/doc/Deng.ttf differ diff --git a/doc/Dengb.ttf b/doc/Dengb.ttf new file mode 100644 index 0000000..882c20f Binary files /dev/null and b/doc/Dengb.ttf differ diff --git a/doc/Dengl.ttf b/doc/Dengl.ttf new file mode 100644 index 0000000..d8434d8 Binary files /dev/null and b/doc/Dengl.ttf differ diff --git a/doc/gb2312.ttf b/doc/gb2312.ttf new file mode 100644 index 0000000..16eb427 Binary files /dev/null and b/doc/gb2312.ttf differ diff --git a/doc/image/cs-all.png b/doc/image/cs-all.png new file mode 100644 index 0000000..c1a855b Binary files /dev/null and b/doc/image/cs-all.png differ diff --git a/doc/image/cs-left.png b/doc/image/cs-left.png new file mode 100644 index 0000000..e8c2557 Binary files /dev/null and b/doc/image/cs-left.png differ diff --git a/doc/image/cs-right.png b/doc/image/cs-right.png new file mode 100644 index 0000000..f4f12e3 Binary files /dev/null and b/doc/image/cs-right.png differ diff --git a/doc/image/pay1.jpg b/doc/image/pay1.jpg new file mode 100644 index 0000000..87c3ee2 Binary files /dev/null and b/doc/image/pay1.jpg differ diff --git a/doc/image/sw-all.png b/doc/image/sw-all.png new file mode 100644 index 0000000..133eb87 Binary files /dev/null and b/doc/image/sw-all.png differ diff --git a/doc/image/sw-left.png b/doc/image/sw-left.png new file mode 100644 index 0000000..e7e7368 Binary files /dev/null and b/doc/image/sw-left.png differ diff --git a/doc/image/sw-right.png b/doc/image/sw-right.png new file mode 100644 index 0000000..b4ab2de Binary files /dev/null and b/doc/image/sw-right.png differ diff --git a/doc/image/allZ.png b/doc/image/zx-all.png similarity index 100% rename from doc/image/allZ.png rename to doc/image/zx-all.png diff --git a/doc/image/leftZ.png b/doc/image/zx-left.png similarity index 100% rename from doc/image/leftZ.png rename to doc/image/zx-left.png diff --git a/doc/image/rightZ.png b/doc/image/zx-right.png similarity index 100% rename from doc/image/rightZ.png rename to doc/image/zx-right.png diff --git a/doc/report.ftl b/doc/report.ftl index 36062d5..dd2d96b 100644 --- a/doc/report.ftl +++ b/doc/report.ftl @@ -6,6 +6,8 @@ -
+
<#--
--> <#--
--> <#--

--> @@ -48,19 +72,14 @@ ${main.name}

服务合同

-

本合同由缔约双方在自愿、平等、公平及诚实信用原则的基础上,本着共赢互利原则,根据《中华人民共和国民法典》等

-

相关法律、法规的规定,双方签订以下服务合同以资信守,本服务合同后附的《服务通用条款》为本服务单的有效组成部分

-

(以下合称为“本协议”),对双方均具有约束力。

-
+

本合同由缔约双方在自愿、平等、公平及诚实信用原则的基础上,本着共赢互利原则,根据《中华人民共和国民法典》等相关法律、法规的规定,双方签订以下服务合同以资信守,本服务合同后附的《服务通用条款》为本服务单的有效组成部分(以下合称为“本协议”),对双方均具有约束力。

+
- @@ -68,7 +87,7 @@ 具体内容 <#list serviceCompany as company> @@ -76,9 +95,6 @@ - - @@ -134,7 +147,7 @@ - - - @@ -170,7 +182,7 @@ -
服务公司 - 金额 - 服务类别 - 是否代账 + 金额
${company.companyName} - ${company.contractAmount}元 - <#list company.businessList as item> <#if item_has_next> @@ -88,19 +104,21 @@ + <#list company.businessList as item> -
-

+<#--

--> +

+ ${item.businessTypeName} <#if item.businessAmount??> - ${item.businessTypeName}-金额:${item.businessAmount}元 + -金额:${item.businessAmount}元 <#if item.businessDesc?? && item.businessDesc != ""> -备注:${item.businessDesc}

<#list item.detailBos as detail> -

${detail.businessProjectLabel} +

+ ${detail.businessProjectLabel} <#if detail.extentInfo?? && detail.extentInfo != ""> <#assign extenInfo = detail.extentInfo?split("$")> : @@ -121,12 +139,7 @@

- <#if company.isProxy?? && company.isProxy == "1"> - 是 - <#else> - 否 - - + ${company.contractAmount}元
付款账号 +

公司名称:${main.name?if_exists}

@@ -142,14 +155,14 @@

开户行:${main.bank?if_exists}

- +
-
-

+

+<#--
--> +

合同金额:共计¥ ${contract.contractAmount} 元(大写金额: @@ -161,8 +174,7 @@

付款方式 -
+

${contract.payModeDesc}

合同备注 +

<#if contract.signDesc?? && contract.signDesc != ""> @@ -184,101 +196,86 @@

-

-  

-

一、服务期限

+<#--

--> +<#--  

--> +

一、服务期限

<#if contract.startServiceDate??>

本合同中的服务周期为 ${contract.startServiceDate?string('yyyy年MM月dd日')}至${contract.endServiceDate?string('yyyy年MM月dd日')}。

-

本合同中的企业托管服务,在合同到期前 30 天,乙方有义务告知甲方。如果双方在合同期满前 30 天内未提出终止或变更要

-

求,未办理交接手续,本合同将自行延期一年。如为其他业务,则与双方约定时间为准。

+

本合同中的企业托管服务,在合同到期前 30 天,乙方有义务告知甲方。如果双方在合同期满前 30 天内未提出终止或变更要求,未办理交接手续,本合同将自行延期一年。如为其他业务,则与双方约定时间为准。

-

二、甲方权利与义务

-

(一)甲方须按本合同约定,按时足额支付服务费用,否则乙方有权拒绝提供服务;

-

(二)甲方应无保留地向乙方陈述与代理事务有关的真实情况,提供的资料必须真实合法,且法定代表人、监事、股东等信息

-

的提交须经过其本人同意,否则因此导致的所有风险与责任均由甲方自行承担;

+

二、甲方权利与义务

+

(一)甲方须按本合同约定,按时足额支付服务费用,否则乙方有权拒绝提供服务;

+

(二)甲方应无保留地向乙方陈述与代理事务有关的真实情况,提供的资料必须真实合法,且法定代表人、监事、股东等信息的提交须经过其本人同意,否则因此导致的所有风险与责任均由甲方自行承担;

+

三、乙方权利和义务

+

(一)乙方在收到甲方支付的款项后,立即启动本合同约定的服务;

+

(二)乙方按照甲方提供的真实有效的企业入住信息,为甲方办理新设企业的委托服务;

+

(三)乙方应及时将服务办理完毕后形成的相关资料交予甲方;

+

(四)除为履行本合同所需外,未经甲方事先同意,乙方不得擅自向第三方泄露甲方的商业信息及其他资料。

+

(五)甲方若有违法违规经营情形,或甲方示意乙方提供不当的服务以及其他不符合法律、行政法规的要求,乙方有权拒绝;若甲方坚持其不当要求,乙方有权单方解除本合同,本合同自乙方向甲方发出通知之日起合同终止,由此造成的相关责任由甲方自行承担。

+

(六)如甲方不按乙方要求完整、及时地准备和提供相应的资料,导致乙方受托事项办理的延误或未完成,由此所发生的一切后果完全由甲方承担,乙方不承担任何责任。

+

(七)乙方有权委托第三方完成本应由乙方提供的服务。

+

四、违约责任

+

(一)甲乙双方任何一方无正当理由提前终止本合同的,应按照本合同服务总金额的20%向守约方支付违约金,乙方扣除违约金后退还剩余服务期费用;如乙方为甲方注册成立公司后,甲方无正当理由提前解除或终止合同的,乙方不予退还本合同的服务费用。

+

(二)若甲方拖欠乙方服务费,以应付而未付的金额为基础,按每天万分之五的日利率计收每日逾期利息。若甲方逾期支付达1个月,视为甲方主动终止本合同,乙方有权终止提供服务,由此产生的经济、法律及其他责任由甲方自行承担,在甲方未按照本合同约定支付服务费和其他费用的情况下,乙方有权将甲方资料予以留置,在甲方所欠费用结清后,乙方归还甲方相关资料。

+

(三)任何一方违反本合同部分条款约定的,不影响其余条款的效力和继续履行。对违约情形,守约方有权要求违约方予以更正,若违约方拒绝纠正的,守约方有权单方解除本合同并要求违约方承担违约赔偿责任。

+

(四)由于乙方过错给甲方造成损失的,乙方应承担赔偿责任,但赔偿责任以该合作周期内所收取的该项服务的服务费用为赔偿上限。

+

五、不可抗力

+

不可抗力是指法律规章或政策变化、社会异常事件(如罢工、骚乱、盗窃、抢劫以及其它不能预见的客观情况)、自然灾害(如台风、洪水、冰雹、地震、海啸、火灾、旱灾、大雪、山崩)等对其发生和后果不能防止或避免的事件。

+

发生不可抗力事件时,双方应互相协商,寻求公平合理的解决争议途经,并尽一切努力减轻不可抗力造成的不良后果。在不可抗力造成本合同无法履行的情况下,双方互不承担责任,且甲方和乙方均有权选择终止本合同,乙方已收款项在扣除已经完成的服务费用和已经产生的成本后进行返还。

+

六、通知与送达

+

甲方确保其通信地址、联系人、联系电话的准确性及有效性,因乙方经努力而无法与甲方取得联系而引起的一切后果,由甲方承担;

+

(一)如果是专人送交,则在对方签收视为已送达。

+

(二)如用快递、传真发送,则在收到传输确认书的当天被视为送到,如果传输当天不是工作日,或传输时工作日已结束营业,则在下一个工作日被视作已送达日。

+

(三)以电子邮件、微信、QQ等社交软件发出的,则为发送人的邮件系统确认电子邮件发送至收件人的邮件接收系统后的当天为送达日。

+

(四)各方均应积极履行通知义务,且确保送达地址的有效及准确,任何一方不得以拒绝签收、无人签收、变更地址未收到等理由否定送达效力。

+

(五)乙方工商注册环节的企业营业执照、印章等物品的快递费用由乙方承担,注册企业之后所开具发票的快递(到付)费用由甲方自行承担。

+

七、合同份数及法律效力

+

本合同一式贰份,甲方持壹份,乙方持壹份,每份合同具有相同的法律效力。本合同自双方签署后生效。

+

八、其他

+

(一)乙方出于宣传目的而采取发放宣传册、广告、网页推广、销售人员宣讲等方式展现的内容不具有合同效力,双方权利义务内容以本合同为准。

+

(二)乙方工作人员无权向甲方作出超出本合同内容的承诺以及代表乙方以个人形式签署任何文件,双方均应以加盖印章的文件作为双方权利义务约定的唯一形式。

+

(三)本合同内容若需做出任何修改补充,甲、乙双方共同协商后,可形成补充协议,补充协议与本合同冲突的,以补充协议为准。

+

(四)因本合同发生争议,双方协商解决;如果协商不成,甲、乙双方一致同意提交仲裁委员会按照其仲裁规则进行裁决,其裁决是终局性的,对双方具有约束力。因争议解决产生的案件受理费、律师费、保全费、公证费、鉴定费等由败诉方承担。

+

(五)本合同传真及扫描件与合同原件具有同等法律效力。

-

三、乙方权利和义务

-

(一)乙方在收到甲方支付的款项后,立即启动本合同约定的服务;

-

(二)乙方按照甲方提供的真实有效的企业信息,为甲方办理企业的委托服务;

-

(三)乙方应及时将服务办理完毕后形成的相关资料交予甲方;

-

(四)除为履行本合同所需外,未经甲方事先同意,乙方不得擅自向第三方泄露甲方的商业信息及其他资料。

-

(五)甲方若有违法违规经营情形,或甲方示意乙方提供不当的服务以及其他不符合法律、行政法规的要求,乙方有权拒

-

绝;若 甲方坚持其不当要求,乙方有权单方解除本合同,本合同自乙方向甲方发出通知之日起终止,由此造成的相关责任由甲方

-

自行承担。

-

(六)如甲方不按乙方要求完整、及时地准备和提供相应的资料,导致乙方受托事项办理的延误或未完成,由此所发生的一切

-

后果完全由甲方承担,乙方不承担任何责任。

- -

四、违约责任

-

(一)甲乙双方任何一方无正当理由提前终止本合同的,应按照本合同服务总金额的 20%向守约方支付违约金,乙方扣除违约

-

金后退还剩余服务期费用;如乙方为甲方注册成立公司后,甲方无正当理由提前解除或终止合同的,乙方不予退还本合同的服务费

-

用。

-

(二)若甲方拖欠乙方服务费,以应付而未付的金额为基础,按每天万分之五的日利率计收每日逾期利息。若甲方逾期支付达

-

1个月,视为甲方主动终止本合同,乙方有权终止提供服务,由此产生的经济、法律及其他责任由甲方自行承担,在甲方未按照本合

-

同约定支付服务费和其他费用的情况下,乙方有权将甲方资料予 以留置,在甲方所欠费用结清后,乙方归还甲方相关资料。

-

(三)任何一方违反本合同部分条款约定的,不影响其余条款的效力和继续履行。对违约情形,守约方有权要求违约方予以更

-

正,若违约方拒绝纠正的,守约方有权单方解除本合同并要求违约方承担违约赔偿责任

-

(四)由于乙方过错给甲方造成损失的,乙方应承担赔偿责任,但赔偿责任以该合作周期内所收取的该项服务的服务费用为赔

-

偿上限。

- -

五、不可抗力

-

不可抗力是指法律规章或政策变化、社会异常事件(如罢工、骚乱、盗窃、抢劫以及其它不能预见的客观情况)、自然灾害

-

(如台风、洪水、冰雹、地震、海啸、火灾、旱灾、大雪、山崩)等对其发生和后果不能防止或避免的事件。

-

发生不可抗力事件时,双方应互相协商,寻求公平合理的解决争议途经,并尽一切努力减轻不可抗力造成的不良后果。在不可

-

抗力造成本合同无法履行的情况下,双方互不承担责任,且甲方和乙方均有权选择终止本合同,乙方已收款项在扣除已经完成的服务

-

费用和已经产生的成本后进行返还。

- -

六、通知与送达

-

甲方确保其通信地址、联系人、联系电话的准确性及有效性,因乙方经努力而无法与甲方取得联系而引起的一切后果,由甲方承担;

-

(一)如果是专人送交,则在对方签收视为已送达。

-

(二)如用快递、传真发送,则在收到传输确认书的当天被视为送到,如果传输当天不是工作日,或传输时工作日已结束营

-

业,则在下一个工作日被视作已送达日。

-

(三)以电子邮件、微信等工具发出的,则为发送人的邮件系统确认电子邮件发送至收件人的邮件接收系统后的当天为送达

-

日。

-

(四)各方均应积极履行通知义务,且确保送达地址的有效及准确,任何一方不得以拒绝签收、无人签收、变更地址未收到等

-

理由否定送达效力。

-

(五)乙方工商注册环节的企业营业执照、印章等物品的快递费用由乙方承担,注册企业之后所产生的快递(到付)费用由甲

-

方自行承担。

- -

七、合同份数及法律效力

-

本合同一式贰份,甲方持壹份,乙方持壹份,每份合同具有相同的法律效力。本合同自双方签署后生效。

- -

八、其他

-

(一)乙方出于宣传目的而采取发放宣传册、广告、网页推广、销售人员宣讲等方式展现的内容不具有合同效力,双方权利义

-

务内容以本合同为准。

-

(二)乙方工作人员无权向甲方作出超出本合同内容的承诺以及代表乙方以个人形式签署任何文件,双方均应以加盖印章的文

-

件作为双方权利义务约定的唯一形式。

-

(三)本合同内容若需做出任何修改补充,甲、乙双方共同协商,可形成补充协议,补充协议与本合同冲突的,以补充协议为准。

-

(四)因本合同发生争议,双方协商解决;如果协商不成,甲、乙双方一致同意提交仲裁委员会按照其仲裁规则进行裁决,其

-

裁决是终局性的,对双方具有约束力。因争议解决产生的案件受理费、律师费、保全费、公证费、鉴定费等由败诉方承担。

-

(五)本合同传真及扫描件与合同原件具有同等法律效力。

 

-

甲方名称(签章): ${company.companyName?if_exists}

-

甲方联系人: ${company.legalPersonName?if_exists}

-

联系方式: ${company.legalPersonPhone?if_exists}

-

签约日期: ${contract.applyDate?string('yyyy年MM月dd日')} - <#-- 年 - 月 - 日--> -

-

 

- -

乙方名称(签章): ${main.name?if_exists}

-

乙方联系人: ${user.nickname?if_exists}

-

联系方式: ${user.phonenumber?if_exists}

-

签约日期: ${contract.applyDate?string('yyyy年MM月dd日')} - <#-- 年 - 月 - 日--> -

- - <#if isSign?? && isSign> -
- +
+
+ <#if firstPartyType?? && firstPartyType == 1> +

甲方名称(签章): ${company.companyName?if_exists}

+

甲方纳税人识别号: ${company.customerNum?if_exists}

+

甲方联系人: ${company.legalPersonName?if_exists}

+ + <#if firstPartyType?? && firstPartyType == 2> +

甲方名称: ${company.legalPersonName?if_exists}

+

甲方联系人(签章):

+ +

联系方式: ${company.legalPersonPhone?if_exists}

+

签约日期: ${contract.applyDate?string('yyyy年MM月dd日')} + <#-- 年 + 月 + 日--> +

- +
+

乙方名称(签章): ${main.name?if_exists}

+

乙方纳税人识别号: ${main.customer_num?if_exists}

+

联系人: ${user.nickname?if_exists}

+

联系方式: ${user.phonenumber?if_exists}

+

签约日期: ${contract.applyDate?string('yyyy年MM月dd日')} + <#-- 年 + 月 + 日--> +

+<#-- <#if isSign?? && isSign>--> + +<#-- --> +
+
+
diff --git a/pusong-admin/src/main/resources/application-dev.yml b/pusong-admin/src/main/resources/application-dev.yml index 82b61bb..a9f4346 100644 --- a/pusong-admin/src/main/resources/application-dev.yml +++ b/pusong-admin/src/main/resources/application-dev.yml @@ -45,6 +45,9 @@ spring: url: jdbc:mysql://192.168.18.119:3308/pusongplus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root password: Ps123456 +# url: jdbc:mysql://47.95.38.123:3306/pusongplus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: Ps123456@ # 从库数据源 # slave: # lazy: true diff --git a/pusong-common/pusong-common-doc/pom.xml b/pusong-common/pusong-common-doc/pom.xml index 8ffeaff..f820ebb 100644 --- a/pusong-common/pusong-common-doc/pom.xml +++ b/pusong-common/pusong-common-doc/pom.xml @@ -46,6 +46,23 @@ itextpdf 5.5.13 + + + com.itextpdf + html2pdf + 3.0.2 + + + + com.itextpdf + font-asian + 7.1.13 + + + org.thymeleaf + thymeleaf + 3.0.11.RELEASE + com.itextpdf.tool xmlworker @@ -61,6 +78,23 @@ com.alibaba fastjson + + org.apache.tomcat.embed + tomcat-embed-core + 10.1.24 + + + com.alibaba + easyexcel-support + 3.3.4 + compile + + + com.baomidou + mybatis-plus-core + 3.5.7 + compile + diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java index 2c18a21..91ccf78 100644 --- a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java @@ -1,14 +1,14 @@ package com.pusong.common.doc.util; -import java.io.IOException; - import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import com.pusong.common.core.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; + /** * 设置页面附加属性 @@ -35,6 +35,8 @@ public class PDFBuilder extends PdfPageEventHelper { private static BaseFont baseFont; // 生成下划线空白占位符 private static String Blank; + + public String mainPrefix; static { try { // 中文字体依赖itext得itext-asian包 @@ -57,10 +59,11 @@ public class PDFBuilder extends PdfPageEventHelper { * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法. * */ - public PDFBuilder(Object header,Object isSign,String imagepath) { + public PDFBuilder(Object header, Object isSign, String imagepath, String mainPrefix) { this.header = header == null?null:header.toString(); this.isSign = isSign == null?null:(Boolean)isSign; this.imagepath = imagepath; + this.mainPrefix = mainPrefix; } /** @@ -106,13 +109,20 @@ public class PDFBuilder extends PdfPageEventHelper { return; } //生成下划线,使用空格占位 - ColumnText.showTextAligned(writer.getDirectContent(), - Element.ALIGN_LEFT, new Phrase(PDFBuilder.Blank, new Font(PDFBuilder.baseFont, Font.DEFAULTSIZE, Font.UNDERLINE)), - document.left(-1), document.top()+10, 0); + ColumnText.showTextAligned( + writer.getDirectContent() + , Element.ALIGN_LEFT + , new Phrase(PDFBuilder.Blank, new Font(PDFBuilder.baseFont, Font.DEFAULTSIZE, Font.UNDERLINE)) + , document.left(- 1) + , document.top() + 10 + , 0); // 1.写入页眉 ColumnText.showTextAligned(writer.getDirectContent(), - Element.ALIGN_LEFT, new Phrase(header, fontDetail), - document.right()/2+20, document.top()+10 , 0); + Element.ALIGN_LEFT + , new Phrase(header, fontDetail) + , document.right() / 2 + 20 + , document.top()+10 + , 0); } //加半章图片 diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java index 4e47848..bcc22e6 100644 --- a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java @@ -5,6 +5,7 @@ import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper; +import com.pusong.common.doc.util.itext7.HtmlToPdfUtils; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; @@ -13,9 +14,6 @@ import org.slf4j.LoggerFactory; import java.io.*; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import java.util.Map; public class PdfGenerator { @@ -25,6 +23,9 @@ public class PdfGenerator { public static final String HEAD = "head"; //是否签章 public static final String SIGN = "isSign"; + + public static final String MAINPREFIX = "mainPrefix"; + public static Configuration configuration =null; static { configuration = new Configuration(Configuration.VERSION_2_3_31); @@ -75,11 +76,11 @@ public class PdfGenerator { public static void makePdf(Map data, String pdfpath, String templateName) throws Exception{ // 加载模板 Template template = configuration.getTemplate(templateName); - data.put("imagePath",System.getProperty("user.dir")); + data.put("imagePath", System.getProperty("user.dir")); // 生成HTML String html = processTemplate(template, data); // 生成PDF - PDFBuilder builder = new PDFBuilder(data.get(HEAD),data.get(SIGN),System.getProperty("user.dir")); + PDFBuilder builder = new PDFBuilder(data.get(HEAD), data.get(SIGN), System.getProperty("user.dir"), data.get(MAINPREFIX).toString()); generatePdf(html, pdfpath, builder); } @@ -89,7 +90,29 @@ public class PdfGenerator { return writer.toString(); } - private static void generatePdf(String html, String outputPath,PDFBuilder builder) { + + private static void generatePdf(String html, String outputPath, PDFBuilder builder) { +// String waterMarkText = "自定义水印";// + InputStream inputStream = new ByteArrayInputStream(html.getBytes()); +// String ttcPath = "C:\\Users\\Administrator\\Downloads\\gb2312.ttf"; + //微软雅黑在windows系统里的位置如下,linux系统直接拷贝该文件放在linux目录下即可 + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(outputPath); + HtmlToPdfUtils.convertToPdf(inputStream, builder, fileOutputStream); + }catch (Exception e){ + log.error("", e); + }finally { + try { + fileOutputStream.flush(); + fileOutputStream.close(); + }catch (Exception e){ + log.error("", e); + } + } + } + + private static void generatePdf2(String html, String outputPath, PDFBuilder builder) { Document document = null; PdfWriter writer = null; try{ @@ -99,9 +122,10 @@ public class PdfGenerator { writer.setPageEvent(builder); document.open(); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(html.getBytes()), - XMLWorkerHelper.class.getResourceAsStream("/default.css"), +// XMLWorkerHelper.class.getResourceAsStream("/default.css"), Charset.forName("UTF-8"), new CustomXMLWorkerFontProvider()); + }catch (Exception e){ log.error("生成pdf异常",e); }finally { @@ -115,4 +139,5 @@ public class PdfGenerator { } + } diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfItext.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfItext.java new file mode 100644 index 0000000..40bb0c5 --- /dev/null +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfItext.java @@ -0,0 +1,126 @@ +package com.pusong.common.doc.util; + +import com.itextpdf.html2pdf.ConverterProperties; +import com.itextpdf.html2pdf.HtmlConverter; +import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider; +import com.itextpdf.layout.font.FontProvider; +import org.apache.tomcat.util.http.fileupload.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +import java.io.*; + +/** + * @Author: yh + * @Date: 2023/6/5 12:05 + * @Description: + */ +public class PdfItext { + Logger log = LoggerFactory.getLogger(PdfItext.class); + + /** + * @param templatePath 模板全路径 + * @param path 生成pdf文件夹 + * @param fileName 生成pdf文件名 + * @param context 填充参数 + */ + public static void htmlToPdf(String templatePath, String path, String fileName, Context context) { + String linuxPath = PdfItext.getFileAbsolutePath(templatePath, templatePath, false); + ConverterProperties converterProperties = new ConverterProperties(); + FontProvider dfp = new DefaultFontProvider(); +// dfp.addSystemFonts(); //添加中文字体库 方式a -window环境有自带字体 linux环境需要安装中文字体,可参考 https://www.zhihu.com/question/423159370/answer/2706867741 + //添加中文字体库 方式b 使用项目导入的字体库 (已验证linux环境不安装中文字体,能正常显示中文) + dfp.addFont(getFileAbsolutePath("C:\\Users\\Administrator\\Downloads\\simhei.ttf", "C:\\Users\\Administrator\\Downloads\\simhei.ttf", false)); + converterProperties.setFontProvider(dfp); + //将本地的模板转换成字符串 + String htmlStr = toHtmlString(new File(linuxPath)); + //模板参数替换 + String replaceHtmlStr = new TemplateEngine().process(htmlStr, context); + File destDir = new File(path); + if (!destDir.exists()) { + destDir.mkdirs(); + } + try (OutputStream out = new FileOutputStream(new File(path + fileName))) { + HtmlConverter.convertToPdf(replaceHtmlStr, out, converterProperties); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("pdf转换异常3{}"+ e); + } + } + + public static void main(String[] args) throws Exception { + //模板内容填充参数 + Context context = new Context(); +// context.setVariable("name2", "晨曦话java"); +// context.setVariable("name1", "晨曦话三国"); + PdfItext.htmlToPdf("C:\\Users\\Administrator\\Desktop\\aa.html", "C:\\Users\\Administrator\\Downloads\\", "temp.pdf", context); + } + + /** + * 读取本地html文件里的html代码 + * @param file File file=new File("文件的绝对路径") + * @return + */ + public static String toHtmlString(File file) { + // 获取HTML文件流 + StringBuffer htmlSb = new StringBuffer(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + new FileInputStream(file), "utf-8")); + while (br.ready()) { + htmlSb.append(br.readLine()); + } + br.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + // HTML文件字符串 + String htmlStr = htmlSb.toString(); + // 返回经过清洁的html文本 + return htmlStr; + } + + /** + * 解决linux下运行jar,无法加载jar包下文件(window环境能正常加载) + * + * @param templatePath 模板路径 传相对路径 比如 /templates/template.htm + * @param createPath 生成路径 比如 /mnt/pdf/templates/template.html + * @param isConvered 是否覆盖模板,默认false. 如模板变化,需覆盖生成 + * @return 返回的路径就是放在linux服务器上的文件路径 + */ + public static String getFileAbsolutePath(String templatePath, String createPath, boolean isConvered) { + try { + // 创建临时文件,获取jar里面的配置文件 + File file = new File(createPath); + if (file.exists() && !isConvered) { + return file.getAbsolutePath(); + } + InputStream inputStream = null; + try { + ClassPathResource resource = new ClassPathResource(templatePath); + inputStream = resource.getInputStream(); + byte[] buffer = new byte[inputStream.available()]; + inputStream.read(buffer); + OutputStream outStream = new FileOutputStream(file); + outStream.write(buffer); + return file.getAbsolutePath(); + } finally { + IOUtils.closeQuietly(inputStream); + } + } catch (Exception e) { + System.out.println("FileUtil getFilePath Fail cause by:"+ e); + } + return null; + } + + + + + + +} \ No newline at end of file diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/HtmlToPdfUtils.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/HtmlToPdfUtils.java new file mode 100644 index 0000000..282f582 --- /dev/null +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/HtmlToPdfUtils.java @@ -0,0 +1,67 @@ +package com.pusong.common.doc.util.itext7; + +import com.itextpdf.html2pdf.ConverterProperties; +import com.itextpdf.html2pdf.HtmlConverter; +import com.itextpdf.io.font.FontProgram; +import com.itextpdf.io.font.FontProgramFactory; +import com.itextpdf.kernel.events.PdfDocumentEvent; +import com.itextpdf.kernel.geom.PageSize; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.font.FontProvider; +import com.pusong.common.doc.util.PDFBuilder; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class HtmlToPdfUtils { + + /** + * html转pdf + * + * @param inputStream 输入流 + * @param waterMark 水印 + * @param fontPath 字体路径,ttc后缀的字体需要添加,0 + * @param outputStream 输出流 + * @date : 2021/1/15 14:07 + */ + public static void convertToPdf(InputStream inputStream, PDFBuilder builder, OutputStream outputStream) throws IOException { + + PdfWriter pdfWriter = new PdfWriter(outputStream); + + PdfDocument pdfDocument = new PdfDocument(pdfWriter); + //设置为A4大小 + pdfDocument.setDefaultPageSize(PageSize.A4); + //添加水印 +// pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new WaterMarkEventHandler(waterMark)); + pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PageEventHandler(builder)); + //添加中文字体支持 + ConverterProperties properties = new ConverterProperties(); + FontProvider fontProvider = new FontProvider(); + +// PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); +// fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H"); + + //添加自定义字体,例如微软雅黑 +// if (StrUtil.isNotBlank(fontPath)){ + FontProgram gb2312 = FontProgramFactory.createFont(System.getProperty("user.dir") + "/doc/gb2312.ttf"); + fontProvider.addFont(gb2312); + + FontProgram Deng = FontProgramFactory.createFont(System.getProperty("user.dir") + "/doc/Deng.ttf"); + fontProvider.addFont(Deng); + + FontProgram Dengb = FontProgramFactory.createFont(System.getProperty("user.dir") + "/doc/Dengb.ttf"); + fontProvider.addFont(Dengb); +// Dengb.getFontNames().getFontName(); + +// } + + properties.setFontProvider(fontProvider); + HtmlConverter.convertToPdf(inputStream, pdfDocument, properties); + + pdfWriter.close(); + pdfDocument.close(); + } + +} \ No newline at end of file diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/PageEventHandler.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/PageEventHandler.java new file mode 100644 index 0000000..d0565be --- /dev/null +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/PageEventHandler.java @@ -0,0 +1,92 @@ +package com.pusong.common.doc.util.itext7; + +import com.itextpdf.io.image.ImageData; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.colors.DeviceRgb; +import com.itextpdf.kernel.events.Event; +import com.itextpdf.kernel.events.IEventHandler; +import com.itextpdf.kernel.events.PdfDocumentEvent; +import com.itextpdf.kernel.font.PdfFont; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.geom.Rectangle; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfPage; +import com.itextpdf.kernel.pdf.canvas.PdfCanvas; +import com.itextpdf.layout.Canvas; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.property.TextAlignment; +import com.pusong.common.doc.util.PDFBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.MalformedURLException; + +public class PageEventHandler implements IEventHandler { + + Logger logger = LoggerFactory.getLogger(PageEventHandler.class); + + private boolean isSign ; + private String headStr; + private String imagePath; + private String mainPrefix; + public PageEventHandler(PDFBuilder builder){ + this.isSign = builder.isSign; + this.headStr = builder.header; + this.imagePath = System.getProperty("user.dir"); + this.mainPrefix = builder.mainPrefix; + } + @Override + public void handleEvent(Event event) { + PdfDocumentEvent documentEvent = (PdfDocumentEvent) event; + PdfDocument document = documentEvent.getDocument(); + PdfPage page = documentEvent.getPage(); + Rectangle pageSize = page.getPageSize(); + + PdfFont pdfFont = null; + try { +// pdfFont = PdfFontFactory.createFont();//"STSongStd-Light", "UniGB-UCS2-H", false + pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); + } catch (Exception e) { + logger.error("", e); + } + + PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), document); + Canvas canvas = new Canvas(pdfCanvas, pageSize); + + Paragraph paragraph = new Paragraph(headStr) + .setFontSize(8) + .setFont(pdfFont) + .setFontColor(new DeviceRgb(0, 0, 0)) + ; + canvas.showTextAligned(paragraph, pageSize.getRight() / 2, pageSize.getTop() - 20, TextAlignment.LEFT); + + PdfCanvas pdfCanvas1 = canvas.getPdfCanvas(); + pdfCanvas1.moveTo(0 + 25, pageSize.getTop() - 25).lineTo(pageSize.getRight() - 25, pageSize.getTop() - 25).stroke(); + + sign(canvas, document.getPageNumber(page), pageSize.getRight()); + canvas.close(); + } + + public void sign(Canvas canvas, int pageNum, float right){ + if (!isSign){ +// return; + } + String psth; + if(pageNum % 2 == 1){ + psth = imagePath + "/doc/image/"+ mainPrefix +"left.png"; + }else{ + psth = imagePath + "/doc/image/" + mainPrefix + "right.png"; + } + // 加半章图片 + try { + ImageData image = ImageDataFactory.create(psth); + PdfCanvas pdfCanvas = canvas.getPdfCanvas(); + float width = 75 * 0.72f; + pdfCanvas.addImage(image,right - width,400, width, false); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + + + } +} \ No newline at end of file diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/WaterMarkEventHandler.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/WaterMarkEventHandler.java new file mode 100644 index 0000000..2177884 --- /dev/null +++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/itext7/WaterMarkEventHandler.java @@ -0,0 +1,77 @@ +package com.pusong.common.doc.util.itext7; + +import com.itextpdf.kernel.colors.DeviceRgb; +import com.itextpdf.kernel.events.Event; +import com.itextpdf.kernel.events.IEventHandler; +import com.itextpdf.kernel.events.PdfDocumentEvent; +import com.itextpdf.kernel.font.PdfFont; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.geom.Rectangle; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfPage; +import com.itextpdf.kernel.pdf.canvas.PdfCanvas; +import com.itextpdf.layout.Canvas; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.property.TextAlignment; +import com.itextpdf.layout.property.VerticalAlignment; + +import java.io.IOException; + +public class WaterMarkEventHandler implements IEventHandler { + + /** + * 水印内容 + */ + private String waterMarkContent; + + /** + * 一页中有几列水印 + */ + private int waterMarkX; + + /** + * 一页中每列有多少水印 + */ + private int waterMarkY; + + public WaterMarkEventHandler(String waterMarkContent) { + this(waterMarkContent, 5, 5); + } + + public WaterMarkEventHandler(String waterMarkContent, int waterMarkX, int waterMarkY) { + this.waterMarkContent = waterMarkContent; + this.waterMarkX = waterMarkX; + this.waterMarkY = waterMarkY; + } + + @Override + public void handleEvent(Event event) { + + PdfDocumentEvent documentEvent = (PdfDocumentEvent) event; + PdfDocument document = documentEvent.getDocument(); + PdfPage page = documentEvent.getPage(); + Rectangle pageSize = page.getPageSize(); + + PdfFont pdfFont = null; + try { + pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);//"STSongStd-Light", "UniGB-UCS2-H", false + } catch (IOException e) { + e.printStackTrace(); + } + + PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), document); + + Paragraph waterMark = new Paragraph(waterMarkContent).setOpacity(0.5f); + Canvas canvas = new Canvas(pdfCanvas, pageSize) + .setFontColor(new DeviceRgb(0, 0, 0)) + .setFontSize(16) + .setFont(pdfFont); + + for (int i = 0; i < waterMarkX; i++) { + for (int j = 0; j < waterMarkY; j++) { + canvas.showTextAligned(waterMark, (150 + i * 300), (160 + j * 150), document.getNumberOfPages(), TextAlignment.CENTER, VerticalAlignment.BOTTOM, 120); + } + } + canvas.close(); + } +} \ No newline at end of file diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsContractInfoBo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsContractInfoBo.java index 5e1fd64..f8c6e74 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsContractInfoBo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/bo/PsContractInfoBo.java @@ -1,21 +1,20 @@ package com.pusong.business.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.pusong.business.domain.PsContractInfo; import com.pusong.common.core.validate.AddGroup; import com.pusong.common.core.validate.EditGroup; -import com.pusong.common.core.validate.QueryGroup; -import com.pusong.common.mybatis.core.domain.BaseEntity; import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapping; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; + import java.math.BigDecimal; import java.util.Date; import java.util.List; -import com.fasterxml.jackson.annotation.JsonFormat; - /** * 合同基本信息业务对象 ps_contract_info * @@ -62,6 +61,7 @@ public class PsContractInfoBo { @NotNull(message = "服务周期开始时间") @JsonFormat(pattern = "yyyy-MM-dd") private Date startServiceDate; + /** * 服务周期结束时间 */ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsContractInfoServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsContractInfoServiceImpl.java index 90a07b2..1db9ed3 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsContractInfoServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsContractInfoServiceImpl.java @@ -43,6 +43,8 @@ import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; +import static com.pusong.common.doc.util.PdfGenerator.MAINPREFIX; + /** * 合同基本信息Service业务层处理 * @@ -625,6 +627,16 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService { map.put("business", detailBos); map.put("serviceCompany", bo.getServiceCompanyInfoList()); map.put("main", JSON.parseObject(main.getRemark()));// 合同主体信息 + map.put("mainId", bo.getContractMain()); + if (bo.getContractMain().equals("1")){ + map.put(MAINPREFIX, "zx-"); + }else if (bo.getContractMain().equals("2")){ + map.put(MAINPREFIX, "cs-"); + }else if (bo.getContractMain().equals("3")){ + map.put(MAINPREFIX, "sw-"); + } + + map.put("firstPartyType", bo.getFirstPartyType()); map.put("company", bo.getCompanyInfoBo()); map.put("customer",customer); // 合同总金额大写 diff --git a/已完成-2024100913505557-未盖章.pdf b/已完成-2024100913505557-未盖章.pdf deleted file mode 100644 index d86b0bd..0000000 Binary files a/已完成-2024100913505557-未盖章.pdf and /dev/null differ