preview.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package qiyuesuosdk
  2. import (
  3. "bytes"
  4. "fmt"
  5. )
  6. // SealPreviewKeyword 预览 PDF 内用于关键字定位公章的占位文本。
  7. const SealPreviewKeyword = "__SEAL_PREVIEW__"
  8. func buildSealPreviewPDF() []byte {
  9. text := fmt.Sprintf("BT /F1 20 Tf 72 400 Td (%s) Tj ET", SealPreviewKeyword)
  10. streamObj := fmt.Sprintf("4 0 obj\n<< /Length %d >>\nstream\n%s\nendstream\n", len(text), text)
  11. objects := []string{
  12. "1 0 obj\n<< /Type /Catalog /Pages 2 0 R >>\nendobj\n",
  13. "2 0 obj\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\nendobj\n",
  14. "3 0 obj\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\nendobj\n",
  15. streamObj,
  16. "5 0 obj\n<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\nendobj\n",
  17. }
  18. var buf bytes.Buffer
  19. buf.WriteString("%PDF-1.4\n")
  20. offsets := make([]int, len(objects)+1)
  21. for i, obj := range objects {
  22. offsets[i+1] = buf.Len()
  23. buf.WriteString(obj)
  24. }
  25. xrefPos := buf.Len()
  26. buf.WriteString(fmt.Sprintf("xref\n0 %d\n0000000000 65535 f \n", len(objects)+1))
  27. for i := 1; i <= len(objects); i++ {
  28. buf.WriteString(fmt.Sprintf("%010d 00000 n \n", offsets[i]))
  29. }
  30. buf.WriteString(fmt.Sprintf("trailer\n<< /Size %d /Root 1 0 R >>\nstartxref\n%d\n%%EOF\n", len(objects)+1, xrefPos))
  31. return buf.Bytes()
  32. }
  33. // PreviewCompanySealPDF 生成空白 PDF 并静默盖机构公章,用于预览(不依赖印章图片查看权限)。
  34. func (c *Client) PreviewCompanySealPDF(company CompanyLocateParams, companyDisplayName string) ([]byte, error) {
  35. processID := c.resolveProcessID("")
  36. launcher := c.resolveLauncher("")
  37. if processID == "" || launcher == "" {
  38. return nil, ErrInvalidParams
  39. }
  40. displayName := companyDisplayName
  41. if displayName == "" {
  42. displayName = company.Name
  43. }
  44. if displayName == "" {
  45. return nil, ErrInvalidParams
  46. }
  47. pdf := buildSealPreviewPDF()
  48. subject := "机构公章预览"
  49. docID, err := c.uploadDocument(subject, pdf)
  50. if err != nil {
  51. return nil, err
  52. }
  53. contractID, err := c.createContract(processID, subject, launcher, docID, displayName, nil)
  54. if err != nil {
  55. return nil, err
  56. }
  57. spec := CompanySealSpec{
  58. CompanyName: displayName,
  59. Keyword: SealPreviewKeyword,
  60. OffsetX: "0",
  61. OffsetY: "0",
  62. Page: "1",
  63. }
  64. if err = c.companySilentSignFor(contractID, company, spec); err != nil {
  65. return nil, err
  66. }
  67. return c.downloadDocument(docID)
  68. }