ਡਾਟਾਸ਼ੀਟ ਜਨਰੇਸ਼ਨ: ਮੰਗ 'ਤੇ ਅਤੇ ਬੈਚ PDF ਬਣਾਉਣਾ

ਇਹ ਲੇਖ ਦੱਸਦਾ ਹੈ ਕਿ ਅਸੀਂ ਉਤਪਾਦ ਡਾਟਾਸ਼ੀਟਾਂ ਨੂੰ PDFs ਵਜੋਂ ਕਿਵੇਂ ਜਨਰੇਟ ਕਰਦੇ ਹਾਂ, ਦੋਵੇਂ ਮੰਗ 'ਤੇ (ਜਦੋਂ ਯੂਜ਼ਰ ਉਹਨਾਂ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਹਨ) ਅਤੇ ਬੈਚ ਵਿੱਚ (ਪ੍ਰਸਿੱਧ ਉਤਪਾਦਾਂ ਲਈ ਪਹਿਲਾਂ ਤੋਂ ਜਨਰੇਟ ਕਰਕੇ)।

ਸਮੱਸਿਆ: ਉਤਪਾਦ ਡਾਟਾਸ਼ੀਟਾਂ ਬਣਾਉਣਾ

ਹਰੇਕ ਉਤਪਾਦ ਨੂੰ ਇੱਕ ਪੇਸ਼ੇਵਰ PDF ਡਾਟਾਸ਼ੀਟ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ ਜਿਸ ਵਿੱਚ ਹੋਵੇ:

  • ਉਤਪਾਦ ਦਾ ਨਾਮ ਅਤੇ ਚਿੱਤਰ

  • ਸ਼੍ਰੇਣੀ ਦੇ ਅਨੁਸਾਰ ਵਰਗੀਕ੍ਰਿਤ ਤਕਨੀਕੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ

  • ਕੰਪਨੀ ਦਾ ਬ੍ਰਾਂਡਿੰਗ ਅਤੇ ਸੰਪਰਕ ਜਾਣਕਾਰੀ

  • ਆਪਟੀਮਾਈਜ਼ਡ ਲੇਆਉਟ (ਸਿੰਗਲ ਪੇਜ, ਸੰਤੁਲਿਤ ਕਾਲਮ)

ਹਰ ਬੇਨਤੀ 'ਤੇ PDFs ਜਨਰੇਟ ਕਰਨਾ ਹੌਲੀ ਹੈ (~2 ਸਕਿੰਟ ਪ੍ਰਤੀ PDF)। ਸਾਰੇ 65,000 SKUs ਨੂੰ ਪਹਿਲਾਂ ਤੋਂ ਜਨਰੇਟ ਕਰਨਾ ਸਟੋਰੇਜ ਅਤੇ ਸਮੇਂ ਦੀ ਬਰਬਾਦੀ ਹੈ।

ਹੱਲ: ਹਾਈਬ੍ਰਿਡ ਤਰੀਕਾ

ਅਸੀਂ ਦੋ ਜਨਰੇਸ਼ਨ ਵਿਧੀਆਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਾਂ:

ਮੰਗ 'ਤੇ: PDF ਉਦੋਂ ਜਨਰੇਟ ਕਰੋ ਜਦੋਂ ਯੂਜ਼ਰ ਇਸਦੀ ਬੇਨਤੀ ਕਰੇ (ਪਹਿਲੀ ਵਾਰ)

ਬੈਚ: ਪ੍ਰਸਿੱਧ ਉਤਪਾਦਾਂ ਲਈ PDFs ਪਹਿਲਾਂ ਤੋਂ ਜਨਰੇਟ ਕਰੋ (ਰਾਤ ਨੂੰ)

ਮੰਗ 'ਤੇ ਜਨਰੇਸ਼ਨ

URL ਬਣਤਰ

/ds/<sku>.pdf
/ds/<sku>

ਦੋਵੇਂ URLs ਇੱਕੋ ਜਿਹਾ PDF ਜਨਰੇਟ ਕਰਦੇ ਹਨ।

ਬੇਨਤੀ ਫਲੋ

@web.route("/ds/<sku>.pdf")
def datasheet(sku: str):
    # Validate SKU
# ... (implementation details omitted)

ਜਨਰੇਸ਼ਨ ਪ੍ਰਕਿਰਿਆ

ਕਦਮ 1: ਉਤਪਾਦ ਡਾਟਾ ਪ੍ਰਾਪਤ ਕਰੋ

# Product name
name = expand_sku(sku)

# ... (implementation details omitted)

ਕਦਮ 2: ਕਾਲਮਾਂ ਨੂੰ ਸੰਤੁਲਿਤ ਕਰੋ

ਫੀਚਰਾਂ ਨੂੰ 3 ਕਾਲਮਾਂ ਵਿੱਚ ਲਾਈਨਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਸੰਤੁਲਿਤ ਕਰਨ ਲਈ ਵੰਡਿਆ ਜਾਂਦਾ ਹੈ:

# Calculate lines per feature group
all_groups = []
for heading, f_items in features.items():
# ... (implementation details omitted)

ਕਦਮ 3: ਚਿੱਤਰ ਦੀਆਂ ਉਚਾਈਆਂ ਦੀ ਗਣਨਾ ਕਰੋ

# Main image height (proportional to aspect ratio)
with Image.open(main_image_path) as img:
    main_width, main_height = img.size
# ... (implementation details omitted)

ਕਦਮ 4: ਸਪੇਸਰ ਦੀ ਗਣਨਾ ਕਰੋ

ਫੁੱਟਰ ਨੂੰ ਪੇਜ ਦੇ ਹੇਠਾਂ ਧੱਕੋ:

available_height = 25.0  # cm
content_height = total_image_height + text_height_cm
spacer_height = max(0, available_height - content_height)

ਕਦਮ 5: HTML ਰੈਂਡਰ ਕਰੋ

html = render_template(
    "datasheet.html",
    sku=sku,
# ... (implementation details omitted)

ਕਦਮ 6: PDF ਜਨਰੇਟ ਕਰੋ

options = {
    "page-size": "A4",
    "enable-local-file-access": None,
    "load-error-handling": "ignore",
    "load-media-error-handling": "ignore",
    "no-stop-slow-scripts": None
}

pdf_data = pdfkit.from_string(html, options=options)

ਕਦਮ 7: ਸਿਰਫ਼ ਪਹਿਲਾ ਪੇਜ ਰੱਖੋ

reader = PdfReader(BytesIO(pdf_data))
if len(reader.pages) > 1:
    writer = PdfWriter()
    writer.add_page(reader.pages[0])
    output = BytesIO()
    writer.write(output)
    pdf_data = output.getvalue()

ਪ੍ਰਦਰਸ਼ਨ

ਜਨਰੇਸ਼ਨ ਸਮਾਂ: ~2 ਸਕਿੰਟ ਪ੍ਰਤੀ PDF

ਕੈਸ਼ਿੰਗ: ਕੋਈ ਕੈਸ਼ਿੰਗ ਨਹੀਂ (ਹਮੇਸ਼ਾ ਤਾਜ਼ਾ)

ਫਾਇਦਾ: ਹਮੇਸ਼ਾ ਨਵੀਨਤਮ ਉਤਪਾਦ ਡੇਟਾ ਨਾਲ ਅੱਪ-ਟੂ-ਡੇਟ

ਬੈਚ ਜਨਰੇਸ਼ਨ

ਉਦੇਸ਼

ਮੰਗ 'ਤੇ ਲੋਡ ਨੂੰ ਘਟਾਉਣ ਲਈ ਪ੍ਰਸਿੱਧ ਉਤਪਾਦਾਂ ਲਈ PDFs ਪਹਿਲਾਂ ਤੋਂ ਜਨਰੇਟ ਕਰੋ।

ਸਕ੍ਰਿਪਟ ਟਿਕਾਣਾ

scripts/utils/generate_datasheets.py

ਤਬਦੀਲੀਆਂ ਦਾ ਟਰੈਕਿੰਗ

ਅਸੀਂ productdb.json ਦੇ ਭਾਗਾਂ ਵਿੱਚ ਹਰੇਕ SKU ਨਾਲ ਸੰਬੰਧਿਤ ਤਬਦੀਲੀਆਂ ਦਾ ਟਰੈਕ ਰੱਖਦੇ ਹਾਂ:

def get_sku_productdb_hash(sku: str) -> str:
    """Get hash of productdb sections relevant to this SKU."""
    with open(PRODUCTDB_PATH, "r") as f:
# ... (implementation details omitted)

ਤਰਜੀਹ ਦੇਣਾ

ਅਸੀਂ SKUs ਨੂੰ ਬੇਨਤੀ ਦੀ ਬਾਰੰਬਾਰਤਾ ਦੇ ਅਨੁਸਾਰ ਤਰਜੀਹ ਦਿੰਦੇ ਹਾਂ:

def load_popular_skus() -> List[str]:
    """Load popular SKUs from access logs."""
    try:
# ... (implementation details omitted)

ਜਨਰੇਸ਼ਨ ਰਣਨੀਤੀ

def batch_generate():
    # Load hash cache
    hash_cache = load_hash_cache()
# ... (implementation details omitted)

ਸ਼ੈਡਿਊਲਿੰਗ

ਬੈਚ ਜਨਰੇਸ਼ਨ ਕ੍ਰੋਨ ਦੁਆਰਾ ਰਾਤ ਨੂੰ ਚਲਦੀ ਹੈ:

0 2 * * * cd /home/ubuntu/manage && python scripts/utils/generate_datasheets.py

ਸਟੋਰੇਜ

ਲੋਕਲ: /home/ubuntu/web-static/ds/<sku>.pdf

S3: s3://thinvent-web-static/ds/<sku>.pdf

CDN: CloudFront ਦੁਆਰਾ ਸਰਵ ਕੀਤਾ ਜਾਂਦਾ ਹੈ

ਟੈਂਪਲੇਟ ਬਣਤਰ

ਡਾਟਾਸ਼ੀਟ ਟੈਂਪਲੇਟ ਇੱਕ 3-ਕਾਲਮ ਲੇਆਉਟ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ:

<div class="container">
  <!-- Header with logo and product name -->
  <div class="header">
    <img src="logo.png">
    <h1>{{ name }}</h1>
  </div>

  <!-- Main image -->
  <img src="{{ images[0][1] }}" style="width: 9.5cm">

  <!-- Thumbnails (up to 4) -->
  <div class="thumbnails">
    {% for name, url in images[1:5] %}
      <img src="{{ url }}" style="width: 4.5cm">
    {% endfor %}
  </div>

  <!-- Features in 3 columns -->
  <div class="features">
    <div class="column">
      {% for heading, items in features1 %}
        <h3>{{ heading }}</h3>
        {% for name, value in items.items() %}
          <div><strong>{{ name }}:</strong> {{ value }}</div>
        {% endfor %}
      {% endfor %}
    </div>

    <div class="column">
      <!-- features2 -->
    </div>

    <div class="column">
      <!-- features3 -->
    </div>
  </div>

  <!-- Spacer to push footer down -->
  <div style="height: {{ spacer_height }}cm"></div>

  <!-- Footer with contact info -->
  <div class="footer">
    <p>www.thinvent.in | sales@thinvent.in | +91-124-4343177</p>
  </div>
</div>

ਕੌਂਫਿਗਰੇਸ਼ਨ

ਲੇਆਉਟ ਨੂੰ ਨਿਯੰਤ੍ਰਿਤ ਕਰਨ ਵਾਲੇ ਕੌਂਸਟੈਂਟ:

DATASHEET_COLUMN_COUNT = 3
DATASHEET_HEADING_LINE_WEIGHT = 2  # Lines per heading
DATASHEET_FEATURE_NAME_MAX_LEN = 30  # Chars before wrapping
DATASHEET_FEATURE_VALUE_CHARS_PER_LINE = 40  # Chars per line
PDF_PAGE_SIZE = "A4"

ਇੰਟੀਗ੍ਰੇਸ਼ਨ ਪੁਆਇੰਟਸ

ਉਤਪਾਦ ਪੇਜਾਂ

ਡਾਟਾਸ਼ੀਟ ਲਈ ਲਿੰਕ:

<a href="/ds/{{ sku }}.pdf" target="_blank">Download Datasheet</a>

ਗੂਗਲ ਸ਼ਾਪਿੰਗ

ਉਤਪਾਦ ਫੀਡ ਵਿੱਚ ਡਾਟਾਸ਼ੀਟਾਂ ਲਿੰਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ:

<g:product_detail>
  <g:section_name>Datasheet</g:section_name>
  <g:attribute_name>PDF</g:attribute_name>
  <g:attribute_value>https://www.thinvent.in/ds/{{ sku }}.pdf</g:attribute_value>
</g:product_detail>

ਈਮੇਲ ਮੁਹਿੰਮਾਂ

ਡਾਟਾਸ਼ੀਟਾਂ ਕੋਟ ਈਮੇਲਾਂ ਨਾਲ ਅਟੈਚ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ।

ਗਲਤੀ ਹੈਂਡਲਿੰਗ

ਅਵੈਧ SKU

if not check_sku(sku):
    abort(422, description="Product not found.")

ਜਨਰੇਸ਼ਨ ਅਸਫਲਤਾ

try:
    pdf_data = generate_datasheet_pdf(sku)
    if pdf_data is None:
        abort(500, description="PDF generation failed.")
except Exception as e:
    logger.error(f"PDF generation failed for {sku}: {e}")
    abort(500, description="PDF generation failed.")

ਗੁੰਮ ਹੋਏ ਚਿੱਤਰ

try:
    with Image.open(image_path) as img:
        width, height = img.size
except Exception:
    # Use default dimensions
    width, height = 800, 600

ਹਵਾਲੇ

ਲਾਇਬ੍ਰੇਰੀਆਂ

  • pdfkit - HTML ਤੋਂ PDF ਕਨਵਰਜ਼ਨ

  • pypdf - PDF ਹੇਰਾਫੇਰੀ

  • Pillow - ਚਿੱਤਰ ਪ੍ਰੋਸੈਸਿੰਗ

ਸੰਬੰਧਿਤ ਲੇਖ

ਸਾਰਾਂਸ਼

ਡਾਟਾਸ਼ੀਟ ਜਨਰੇਸ਼ਨ ਇੱਕ ਹਾਈਬ੍ਰਿਡ ਤਰੀਕੇ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ:

ਮੰਗ 'ਤੇ:

  • ✅ ਜਦੋਂ ਯੂਜ਼ਰ ਬੇਨਤੀ ਕਰਦਾ ਹੈ ਤਾਂ ਜਨਰੇਟ ਕਰੋ

  • ✅ ਹਮੇਸ਼ਾ ਅੱਪ-ਟੂ-ਡੇਟ

  • ✅ ਸਟੋਰੇਜ ਦੀ ਕੋਈ ਬਰਬਾਦੀ ਨਹੀਂ

  • ✅ ~2 ਸਕਿੰਟ ਪ੍ਰਤੀ PDF

ਬੈਚ:

  • ✅ ਪ੍ਰਸਿੱਧ ਉਤਪਾਦਾਂ ਨੂੰ ਪਹਿਲਾਂ ਤੋਂ ਜਨਰੇਟ ਕਰੋ

  • ✅ productdb ਤਬਦੀਲੀਆਂ ਦਾ ਟਰੈਕ ਰੱਖੋ

  • ✅ ਬੇਨਤੀ ਦੀ ਬਾਰੰਬਾਰਤਾ ਦੇ ਅਨੁਸਾਰ ਤਰਜੀਹ ਦਿਓ

  • ✅ ਰਾਤ ਨੂੰ ਕ੍ਰੋਨ ਜਾਬ

ਪ੍ਰਕਿਰਿਆ:

  • ✅ ਉਤਪਾਦ ਡਾਟਾ ਪ੍ਰਾਪਤ ਕਰੋ (ਨਾਮ, ਚਿੱਤਰ, ਫੀਚਰ, ਵਰਣਨ)

  • ✅ 3 ਕਾਲਮਾਂ ਵਿੱਚ ਫੀਚਰਾਂ ਨੂੰ ਸੰਤੁਲਿਤ ਕਰੋ

  • ✅ ਚਿੱਤਰ ਦੀਆਂ ਉਚਾਈਆਂ ਦੀ ਗਣਨਾ ਕਰੋ

  • ✅ HTML ਟੈਂਪਲੇਟ ਰੈਂਡਰ ਕਰੋ

  • ✅ pdfkit ਨਾਲ PDF ਜਨਰੇਟ ਕਰੋ

  • ✅ ਸਿਰਫ਼ ਪਹਿਲਾ ਪੇਜ ਰੱਖੋ

ਸਟੋਰੇਜ:

  • ✅ ਲੋਕਲ: /home/ubuntu/web-static/ds/

  • ✅ S3: s3://thinvent-web-static/ds/

  • ✅ CDN: CloudFront ਡਿਸਟ੍ਰੀਬਿਊਸ਼ਨ

ਇਹ ਹਾਈਬ੍ਰਿਡ ਤਰੀਕਾ ਤਾਜ਼ਗੀ (ਮੰਗ 'ਤੇ) ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ (ਬੈਚ ਪ੍ਰੀ-ਜ