_bid_prep_attachments.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # -*- coding: utf-8 -*-
  2. """把响应文件附件用的原始材料统一成正立、可直接嵌入 Word 的 PNG。
  3. 原始材料是手机拍摄/扫描件,方向、尺寸不一;本脚本只做旋转、裁切与转码,
  4. 不修改内容。输出到 doc/_bid_assets/attach/。
  5. """
  6. import io
  7. import os
  8. import sys
  9. import fitz
  10. from PIL import Image
  11. sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
  12. HERE = os.path.dirname(os.path.abspath(__file__))
  13. OUT = os.path.join(HERE, "_bid_assets", "attach")
  14. SRC = r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目招投标\相关准备材料"
  15. ID_DIR = os.path.join(SRC, "法人身份证")
  16. # 身份证目录下两张图:文件名无序,按「含人像面」判断正反
  17. ID_FRONT = "ab38c8443b6f79937721e4c44f3443b9.jpg" # 人像面
  18. ID_BACK = "6b07461148f7008daefa38ee3ab90444.jpg" # 国徽面
  19. def save(im, name):
  20. """扫描件与照片统一存 JPEG:整套附件二十余页,用 PNG 无损会把文档撑到 50MB+。
  21. quality/subsampling 取偏高档位,保证证书与报告上的小字仍然锐利。
  22. """
  23. p = os.path.join(OUT, name)
  24. im.save(p, quality=88, subsampling=0, optimize=True, progressive=True)
  25. kb = os.path.getsize(p) / 1024
  26. print(f" {name} {im.width}x{im.height} {kb:,.0f} KB")
  27. return p
  28. def from_jpg(rel, name, rotate=0, box=None):
  29. im = Image.open(os.path.join(SRC, rel)).convert("RGB")
  30. if box:
  31. im = im.crop(box)
  32. if rotate:
  33. im = im.rotate(rotate, expand=True)
  34. return save(im, name)
  35. def from_pdf(rel, prefix, dpi=150):
  36. d = fitz.open(os.path.join(SRC, rel))
  37. out = []
  38. for i in range(d.page_count):
  39. pm = d[i].get_pixmap(dpi=dpi)
  40. im = Image.frombytes("RGB", (pm.width, pm.height), pm.samples)
  41. out.append(save(im, f"{prefix}_{i + 1:02d}.jpg"))
  42. return out
  43. def main():
  44. os.makedirs(OUT, exist_ok=True)
  45. print("法定代表人身份证(逆时针 90° 转正):")
  46. im = Image.open(os.path.join(ID_DIR, ID_FRONT)).convert("RGB")
  47. save(im.rotate(90, expand=True), "id_front.jpg")
  48. im = Image.open(os.path.join(ID_DIR, ID_BACK)).convert("RGB")
  49. save(im.rotate(90, expand=True), "id_back.jpg")
  50. print("营业执照(沿用已裁好的正立图):")
  51. lic = os.path.join(HERE, "_bid_assets", "营业执照.png")
  52. save(Image.open(lic).convert("RGB"), "license.jpg")
  53. print("软件企业证书(顺时针 90° 转正):")
  54. from_jpg("软件企业证书.jpg", "sw_enterprise.jpg", rotate=-90)
  55. print("软件产品证书(自双证合照下半幅裁出):")
  56. from_jpg("软件企业证书&软件产品证书.jpg", "sw_product.jpg",
  57. box=(110, 820, 1270, 1650))
  58. print("公共信用报告:")
  59. from_pdf("北京智造易科技有限公司公共信用报告.pdf", "credit", dpi=140)
  60. print("软件著作权登记证书:")
  61. from_pdf("智造易-软件著作权10个证书.pdf", "swc", dpi=150)
  62. print(f"\n输出目录:{OUT}")
  63. if __name__ == "__main__":
  64. main()