fonchain-fiee/pkg/service/print_manage.go

820 lines
22 KiB
Go
Raw Normal View History

2025-02-19 06:24:15 +00:00
/**
* @Author: sun
* @Company: 苏州泰丰文化
* @Description:
* @File: print_manage
* @Version: 1.0.0
* @Date: 2024/10/12 15:43
*/
package service
import (
"bytes"
"context"
"errors"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"time"
"dubbo.apache.org/dubbo-go/v3/common/logger"
artShow "github.com/fonchain_enterprise/fonchain-main/api/artShow"
"github.com/fonchain_enterprise/fonchain-main/api/artist"
"github.com/fonchain_enterprise/fonchain-main/api/artwork_third_party"
"github.com/fonchain_enterprise/fonchain-main/pkg/config"
"github.com/fonchain_enterprise/fonchain-main/pkg/e"
"github.com/fonchain_enterprise/fonchain-main/pkg/model"
"github.com/fonchain_enterprise/fonchain-main/pkg/model/login"
"github.com/fonchain_enterprise/fonchain-main/pkg/serializer"
"github.com/gin-gonic/gin"
"github.com/lukasjarosch/go-docx"
"github.com/qifengzhang007/gooxml/document"
"github.com/qifengzhang007/gooxml/schema/soo/wml"
)
func ArtShowListForPrint(c *gin.Context) {
var showListReq artShow.ArtShowListForPrintReq
if err := c.ShouldBindJSON(&showListReq); err != nil {
logger.Errorf("ShowList ShouldBindJSON err", err)
ResponseMsg(c, e.InvalidParams, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
return
}
showListRes, err := GrpcArtShowImpl.ArtShowListForPrint(context.Background(), &showListReq)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: showListRes.Msg,
Data: showListRes,
Status: e.Ok,
})
}
// 我仅仅是加了三个分支逻辑
func PrintPreviewFile(c *gin.Context) {
var req artShow.PrintPreviewFileReq
if err := c.ShouldBindJSON(&req); err != nil {
logger.Errorf("Print Preview File err: %v", err)
ResponseMsg(c, e.InvalidParams, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
return
}
// 组装 获取 画作 基础信息参数
artworkDataReq := artwork_third_party.AwDataByShowIdRequest{}
artworkDataReq.ArtShowIds = append(artworkDataReq.ArtShowIds, req.ShowUid)
// 获取 画作 基础信息
resp, err := GrpcArtworkThirdPartyImpl.AwDataByShowId(context.Background(), &artworkDataReq)
if err != nil {
logger.Errorf("Print Preview File query err: %v", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
if resp.Data == nil {
logger.Errorf("Print Preview File query err: %v", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "画作信息为空",
Status: e.Failed,
})
return
}
if len(resp.Data) <= 0 {
logger.Errorf("Print Preview File query err: %v", "画作信息为空")
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: nil,
Msg: "画作信息为空",
Status: e.Failed,
})
return
}
// 组装 画作 基础信息
artworkData := make(map[string]*artwork_third_party.AwDataByShowIdResponse_Info, 0)
for i := 0; i < len(resp.Data); i++ {
artworkData[resp.Data[i].ArtworkUuid] = resp.Data[i]
}
// 获取 画作价格信息
artworkPriceList := new(artShow.ArtworkPriceListRes)
// 获取 画作价格信息
artworkPriceReq := artShow.ShowDetailReq{}
artworkPriceReq.ShowUID = append(artworkPriceReq.ShowUID, req.ShowUid)
artworkPriceList, err = GrpcArtShowImpl.ArtworkPriceList(context.Background(), &artworkPriceReq)
if err != nil {
logger.Errorf("ArtworkPriceList query err", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
// 获取 画展包信息
showDetailReq := new(artShow.ShowDetailReq)
showDetailReq.ShowUID = append(showDetailReq.ShowUID, req.ShowUid)
artShowInfo, err := GrpcArtShowImpl.ShowDetail(context.Background(), showDetailReq)
if err != nil {
logger.Errorf("Print Preview File query err: %v", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
// 组装 画作 基础信息
artShowMap := make(map[string]*artShow.ShowDetail, 0)
for i := 0; i < len(artShowInfo.Data); i++ {
if artShowInfo.Data[i].Price == 0 {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: e.ErrorNoPrice,
Status: e.Failed,
})
return
}
artShowMap[artShowInfo.Data[i].ShowUID] = artShowInfo.Data[i]
}
// 获取画家 信息
artistInfoReq := new(artist.ArtistDetailDataReq)
artistInfoReq.Uids = append(artistInfoReq.Uids, artShowInfo.Data[0].ArtistUID)
artistInfo, err := GrpcArtistImpl.ArtistDetailData(context.Background(), artistInfoReq)
if err != nil {
logger.Errorf("Print Preview File query artiest info err: %v", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Failed,
})
return
}
artistMap := make(map[string]*artist.ArtistDetailDataResp_Info, 0)
for i := 0; i < len(artistInfo.Data); i++ {
if artistMap[artistInfo.Data[i].ProfileInfo.Name] == nil {
artistMap[artistInfo.Data[i].ProfileInfo.Name] = artistInfo.Data[i]
}
}
if len(artworkPriceList.Data) == 0 || len(artworkData) == 0 {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: e.ErrorNoPrice,
Status: e.Failed,
})
}
priceInfo := serializer.BuildInvoiceInfo(artworkPriceList.Data, artworkData, artistMap)
priceInfo.Address = artShowMap[req.ShowUid].Address
priceInfo.ShowTime = artShowMap[req.ShowUid].ShowTime
if artistMap[artShowInfo.Data[0].ArtistName] != nil {
priceInfo.BankNo = artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.BankNum
priceInfo.Bank = artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.BankName
priceInfo.BankCode = artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.BankCode
}
var urlMap = make(map[string]string)
switch req.PrintType { // 1-代销合同 2-销售清单 3-委托书 4-转让合同
case 1:
saleContractPath := "./data/代销合同_模版.docx"
doc, err := docx.Open(saleContractPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
replaceMap := docx.PlaceholderMap{
"art_name": artShowInfo.Data[0].ArtistName,
"address": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.Address,
"id_no": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.CardId,
"telephone": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.Phone,
}
if err = doc.ReplaceAll(replaceMap); err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
now := time.Now().UnixMilli()
tmpPath := fmt.Sprintf("./data/%d.docx", now)
err = doc.WriteToFile(tmpPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
pdfPath, err := docxToPdf(now)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
url, err := PutBos(pdfPath, "pdf", true)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
_ = os.Remove(tmpPath)
//if _, err = GrpcArtShowImpl.CreateContractPath(context.Background(), &artShow.CreateContractPathReq{
// ShowUid: req.ShowUid,
// ContractType: 1,
// ContractPath: url,
//}); err != nil {
// ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: err.Error(),
// Status: e.Ok,
// })
//}
urlMap["serviceContractPath"] = url
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: urlMap,
Status: e.Ok,
})
//}
case 2:
//priceInfo.AuthList = nil
res := &model.PriceRightListRes{}
for _, v := range priceInfo.ArtworkPriceList {
for _, vv := range priceInfo.CopyrightPriceList {
if v.Num == vv.Num {
tmp := &model.PrintRightItem{
ArtworkName: v.ArtworkName,
ArtistName: v.ArtistName,
DoTime: v.DoTime,
Num: v.Num,
Ruler: v.Ruler,
TfNum: v.TfNum,
FloorPrice: v.ArtworkPrice + vv.CopyrightPrice,
}
res.List = append(res.List, tmp)
}
}
}
res.RuleTotal = priceInfo.TotalRuler
res.PriceTotal = priceInfo.Price
res.Principal = artShowInfo.Data[0].ArtistName
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
case 3:
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: priceInfo.AuthList,
Status: e.Ok,
})
case 4:
//resData, err := GrpcArtShowImpl.GetContractPath(context.Background(), &artShow.GetContractPathReq{
// ShowUid: req.ShowUid,
// ContractType: 4,
//})
//if err != nil {
// ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: err.Error(),
// Status: e.Ok,
// })
//}
//if len(resData.ContractPath) > 0 {
// urlMap["tranContractPath"] = resData.ContractPath
// ResponseMsg(c, e.SUCCESS, serializer.Response{
// Data: urlMap,
// Status: e.Ok,
// })
//} else {
tranContractPath := "./data/转让合同_模版.docx"
doc, err := document.Open(tranContractPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
if len(doc.Tables()) != 2 {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: "模版格式不合格",
Status: e.Ok,
})
}
//获取表格中的文本
for _, table := range doc.Tables()[1:] { // 所有表
if len(table.Rows()) < len(resp.Data) {
firstRow := table.Rows()[0]
lineNumber := len(resp.Data) - len(table.Rows()) + 2
for i := 0; i < lineNumber; i++ {
newRow := table.InsertRowAfter(firstRow)
for l := 0; l < 5; l++ {
newCell := newRow.AddCell()
newCell.AddParagraph().AddRun().AddText("")
}
}
}
for i, lines := range table.Rows() { // 所有行
if i < 1 || i == len(table.Rows())-1 || i > len(resp.Data) {
continue
}
for ii, cell := range lines.Cells() {
switch ii {
case 0:
p := cell.AddParagraph()
p.Properties().SetAlignment(wml.ST_JcCenter)
r := p.AddRun()
r.Properties().SetBold(true)
r.Properties().SetSize(6.5)
r.AddText(fmt.Sprintf("%d", i))
case 1:
p := cell.AddParagraph()
p.Properties().SetAlignment(wml.ST_JcCenter)
r := p.AddRun()
r.Properties().SetBold(true)
r.Properties().SetSize(6.5)
r.AddText(fmt.Sprintf("{work_name_%d}", i))
case 2:
p := cell.AddParagraph()
p.Properties().SetAlignment(wml.ST_JcCenter)
r := p.AddRun()
r.Properties().SetBold(true)
r.Properties().SetSize(6.5)
r.AddText(fmt.Sprintf("{hash_%d}", i))
case 3:
p := cell.AddParagraph()
p.Properties().SetAlignment(wml.ST_JcCenter)
r := p.AddRun()
r.Properties().SetBold(true)
r.Properties().SetSize(6.5)
r.AddText(fmt.Sprintf("原始"))
default:
continue
}
}
}
}
now := time.Now().UnixMilli()
tmpPath := fmt.Sprintf("./data/%d.docx", now)
if err = doc.SaveToFile(tmpPath); err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
doc3, err := docx.Open(tmpPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
replaceMap := docx.PlaceholderMap{
"art_name": artShowInfo.Data[0].ArtistName,
"address": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.Address,
"id_no": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.CardId,
"telephone": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.Phone,
}
for k, v := range resp.Data {
replaceMap["work_name_"+fmt.Sprintf("%d", k+1)] = v.ArtworkName
replaceMap["hash_"+fmt.Sprintf("%d", k+1)] = v.CopyrightHash
}
if err = doc3.ReplaceAll(replaceMap); err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
now2 := time.Now().UnixMilli()
tmpPath1 := fmt.Sprintf("./data/%d.docx", now2)
err = doc3.WriteToFile(tmpPath1)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
pdfPath, err := docxToPdf(now2)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
url, err := PutBos(pdfPath, "pdf", true)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
_ = os.Remove(tmpPath)
_ = os.Remove(tmpPath1)
urlMap["tranContractPath"] = url
//if _, err = GrpcArtShowImpl.CreateContractPath(context.Background(), &artShow.CreateContractPathReq{
// ShowUid: req.ShowUid,
// ContractPath: url,
// ContractType: 4,
//}); err != nil {
// ResponseMsg(c, e.SUCCESS, serializer.Response{
// Msg: err.Error(),
// Status: e.Ok,
// })
//}
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: urlMap,
Status: e.Ok,
})
//}
case 5:
saleContractPath := "./data/print_model/版权代理登记委托合同.docx"
doc, err := docx.Open(saleContractPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
defer doc.Close()
replaceMap := docx.PlaceholderMap{
"art_name": artShowInfo.Data[0].ArtistName,
"id_no": artistMap[artShowInfo.Data[0].ArtistName].ProfileInfo.CardId,
}
if err = doc.ReplaceAll(replaceMap); err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
now := time.Now().UnixMilli()
tmpPath := fmt.Sprintf("./data/%d.docx", now)
err = doc.WriteToFile(tmpPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
pdfPath, err := docxToPdf(now)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
url, err := PutBos(pdfPath, "pdf", true)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
_ = os.Remove(tmpPath)
urlMap["path"] = url
// urlMap["path"] = config.ApiHost + "/pdfst/print_model/版权代理登记委托合同.pdf"
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: urlMap,
Status: e.Ok,
})
return
case 6: //excel
res := &model.PriceRightListRes{}
for _, v := range priceInfo.ArtworkPriceList {
for _, vv := range priceInfo.CopyrightPriceList {
if v.Num == vv.Num {
tmp := &model.PrintRightItem{
ArtworkName: v.ArtworkName,
ArtistName: v.ArtistName,
DoTime: v.DoTime,
Num: v.Num,
Ruler: v.Ruler,
TfNum: v.TfNum,
FloorPrice: v.ArtworkPrice + vv.CopyrightPrice,
}
res.List = append(res.List, tmp)
}
}
}
res.RuleTotal = priceInfo.TotalRuler
res.PriceTotal = priceInfo.Price
res.Principal = artShowInfo.Data[0].ArtistName
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
return
case 7: //文档更新内容然后pdf
var talentAgency, address string
if _, isExist := artShowMap[req.ShowUid]; isExist {
talentAgency = artShowMap[req.ShowUid].TalentAgency
var addressMap = map[string]string{
"上海泰初澹然文化传播有限公司": "上海市黄浦区西藏中路268号2201室",
"浙江蓝丰文化科技有限公司": "浙江省宁波市鄞州区实怡中心7幢13号17-1-1",
"常熟虞丰文化艺术交流有限公司": "江苏省苏州市常熟市虞山街道虞景文华31幢F2部分",
"合肥常丰文化传播有限公司": "安徽省合肥市瑶海区明光路街道芜湖路2号坝上街环球中心7层商协会大厦 716-2062",
}
if _, isOk := addressMap[talentAgency]; isOk == true {
address = addressMap[talentAgency]
}
}
saleContractPath := "./data/print_model/居间服务协议-20241210.docx"
doc, err := docx.Open(saleContractPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
replaceMap := docx.PlaceholderMap{
"company": talentAgency,
"address": address,
}
if err = doc.ReplaceAll(replaceMap); err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
now := time.Now().UnixMilli()
tmpPath := fmt.Sprintf("./data/%d.docx", now)
err = doc.WriteToFile(tmpPath)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
pdfPath, err := docxToPdf(now)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
url, err := PutBos(pdfPath, "pdf", true)
if err != nil {
ResponseMsg(c, e.SUCCESS, serializer.Response{
Msg: err.Error(),
Status: e.Ok,
})
}
_ = os.Remove(tmpPath)
urlMap["path"] = url
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: urlMap,
Status: e.Ok,
})
return
default:
return
}
return
}
func GetPrintDetail(c *gin.Context) {
var req artShow.PrintDetailReq
if err := c.ShouldBindJSON(&req); err != nil {
ResponseMsg(c, e.InvalidParams, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
return
}
res, err := GrpcArtShowImpl.GetPrintDetail(context.Background(), &req)
if err != nil {
logger.Errorf("Print Preview File err: %v", err)
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
}
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: res,
Status: e.Ok,
})
return
}
func CreatePrintDetail(c *gin.Context) {
var req artShow.CreatePrintDetailReq
if err := c.ShouldBindJSON(&req); err != nil {
ResponseMsg(c, e.InvalidParams, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
return
}
userInfo := login.GetUserInfoFromC(c)
req.PrintOperator = userInfo.NickName
_, err := GrpcArtShowImpl.CreatePrintDetail(context.Background(), &req)
if err != nil {
ResponseMsg(c, e.InvalidParams, serializer.Response{
Data: nil,
Msg: err.Error(),
Status: e.Failed,
})
}
ResponseMsg(c, e.SUCCESS, serializer.Response{
Data: nil,
Status: e.Ok,
})
}
func SearchArtistListByKeyword(c *gin.Context) {
var idNameReq artist.ArtIdNameRequest
if err := c.ShouldBind(&idNameReq); err != nil {
logger.Errorf("idNameReq ShouldBind err", err)
ResponseQuickMsg(c, e.Failed, err.Error(), nil)
return
}
resp, err := GrpcArtistImpl.ArtistIdName(context.Background(), &idNameReq)
if err != nil {
ResponseQuickMsg(c, e.Failed, err.Error(), nil)
return
}
for _, v := range resp.Items {
if v.BlackListStatus == 2 {
v.Name = fmt.Sprintf("#%s", v.Name)
}
}
ResponseQuickMsg(c, e.Ok, resp.Msg, resp.Items)
return
}
func docxToPdf(fileName int64) (pdfUrl string, err error) {
// 目标 URL
url := fmt.Sprintf("%s/forms/libreoffice/convert", config.PdfHost)
fmt.Println("url:-----------------", url)
// 打开文件
file, err := os.Open(fmt.Sprintf("./data/%d.docx", fileName))
if err != nil {
return "", errors.New("打开doc文件失败")
}
defer file.Close()
// 创建表单
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("files", "file.docx")
if err != nil {
return "", errors.New("创建转换pdf表单文件失败")
}
_, err = io.Copy(part, file)
if err != nil {
fmt.Println("复制文件到表单失败:", err)
return "", errors.New("复制docx文件到pdf表单文件失败")
}
// 关闭 writer
err = writer.Close()
if err != nil {
return "", errors.New("关闭pdf表单文件失败")
}
// 创建请求
req, err := http.NewRequest("POST", url, body)
if err != nil {
fmt.Println("创建请求失败:", err)
return
}
// 设置请求头
req.Header.Set("Content-Type", writer.FormDataContentType())
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("发送请求失败:", err)
return
}
defer resp.Body.Close()
// 检查响应状态
if resp.StatusCode != http.StatusOK {
fmt.Printf("请求失败,状态码: %d\n", resp.StatusCode)
return
}
pdfUrl = fmt.Sprintf("./data/%d.pdf", fileName)
// 保存响应内容到文件
outFile, err := os.Create(pdfUrl)
if err != nil {
return "", errors.New("创建输出pdf文件失败")
}
defer outFile.Close()
_, err = io.Copy(outFile, resp.Body)
if err != nil {
fmt.Println("保存响应内容失败:", err)
return
}
fmt.Println("pdf文件转换成功已保存")
return
}
func docxToPdfV2(fileName string) (pdfUrl string, err error) {
// 目标 URL
url := fmt.Sprintf("%s/forms/libreoffice/convert", config.PdfHost)
fmt.Println("url:-----------------", url)
// 打开文件
file, err := os.Open(fileName)
if err != nil {
return "", errors.New("打开doc文件失败")
}
defer file.Close()
// 创建表单
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("files", "file.docx")
if err != nil {
return "", errors.New("创建转换pdf表单文件失败")
}
_, err = io.Copy(part, file)
if err != nil {
fmt.Println("复制文件到表单失败:", err)
return "", errors.New("复制docx文件到pdf表单文件失败")
}
// 关闭 writer
err = writer.Close()
if err != nil {
return "", errors.New("关闭pdf表单文件失败")
}
// 创建请求
req, err := http.NewRequest("POST", url, body)
if err != nil {
fmt.Println("创建请求失败:", err)
return
}
// 设置请求头
req.Header.Set("Content-Type", writer.FormDataContentType())
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("发送请求失败:", err)
return
}
defer resp.Body.Close()
// 检查响应状态
if resp.StatusCode != http.StatusOK {
fmt.Printf("请求失败,状态码: %d\n", resp.StatusCode)
return
}
pdfUrl = fmt.Sprintf("%d.pdf")
// 保存响应内容到文件
outFile, err := os.Create(pdfUrl)
if err != nil {
panic(err)
return "", errors.New("创建输出pdf文件失败")
}
defer outFile.Close()
_, err = io.Copy(outFile, resp.Body)
if err != nil {
fmt.Println("保存响应内容失败:", err)
return
}
fmt.Println("pdf文件转换成功已保存")
return
}