डेटाशीट निर्मिती: ऑन-डिमांड आणि बॅच PDF तयारी

हा लेख आम्ही उत्पादन डेटाशीट PDF स्वरूपात कशी तयार करतो याचे स्पष्टीकरण देतो, दोन्ही ऑन-डिमांड (जेव्हा वापरकर्ते त्यांची विनंती करतात) आणि बॅच (लोकप्रिय उत्पादनांसाठी आगाऊ निर्मिती) पद्धतीने.

समस्या: उत्पादन डेटाशीट तयार करणे

प्रत्येक उत्पादनासाठी एक व्यावसायिक PDF डेटाशीटची आवश्यकता असते ज्यामध्ये हे असावे:

  • उत्पादनाचे नाव आणि चित्रे

  • श्रेणीनुसार गटबद्ध केलेली तांत्रिक वैशिष्ट्ये

  • कंपनी ब्रँडिंग आणि संपर्क माहिती

  • ऑप्टिमाइझ्ड लेआउट (सिंगल पेज, संतुलित कॉलम)

प्रत्येक विनंतीवर PDF तयार करणे हळू आहे (~2 सेकंद प्रति PDF). सर्व 65,000 SKU आगाऊ तयार करणे हे स्टोरेज आणि वेळेचा अपव्यय आहे.

उपाय: संकरित पद्धत

आम्ही दोन निर्मिती पद्धती वापरतो:

ऑन-डिमांड: वापरकर्त्याने विनंती केल्यावर PDF तयार करा (पहिल्यांदा)

बॅच: लोकप्रिय उत्पादनांसाठी PDF आगाऊ तयार करा (रोज रात्री)

ऑन-डिमांड निर्मिती

URL रचना

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

दोन्ही URL समान 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

कॅशिंग: कॅशिंग नाही (नेहमी ताजे)

फायदा: नवीनतम उत्पादन डेटासह नेहमी अद्ययावत

बॅच निर्मिती

उद्देश

ऑन-डिमांड लोड कमी करण्यासाठी लोकप्रिय उत्पादनांसाठी PDF आगाऊ तयार करा.

स्क्रिप्ट स्थान

scripts/utils/generate_datasheets.py

बदल ट्रॅक करणे

आम्ही प्रत्येक SKU शी संबंधित productdb.json विभागातील बदल ट्रॅक करतो:

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)

प्राधान्यक्रम

आम्ही विनंतीच्या वारंवारतेनुसार SKU ला प्राधान्य देतो:

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)

शेड्यूलिंग

बॅच निर्मिती रोज रात्री cron द्वारे चालते:

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>

Google Shopping

उत्पादन फीडमध्ये डेटाशीट जोडलेले:

<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 बदल ट्रॅक करा

  • ✅ विनंतीच्या वारंवारतेनुसार प्राधान्य द्या

  • ✅ रोज रात्री cron काम

प्रक्रिया:

  • ✅ उत्पादन डेटा मिळवा (नाव, चित्रे, वैशिष्ट्ये, वर्णन)

  • ✅ वैशिष्ट्ये 3 कॉलममध्ये संतुलित करा

  • ✅ प्रतिमांची उंची काढा

  • ✅ HTML टेम्पलेट रेंडर करा

  • ✅ pdfkit सह PDF तयार करा

  • ✅ फक्त पहिले पेज ठेवा

स्टोरेज:

  • ✅ स्थानिक: /home/ubuntu/web-static/ds/

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

  • ✅ CDN: CloudFront वितरण

ही संकरित पद्धत ताजेपणा (ऑन-डिमांड) आणि कार्यक्षमता (बॅच आगाऊ-निर्मिती) यांच्यात संतुलन राखते.


← दस्तऐवजीकरण अनुक्रमणिका कडे परत