डेटाशीट निर्मिती: ऑन-डिमांड आणि बॅच 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
संदर्भ
लायब्ररी
संबंधित लेख
-
वैशिष्ट्य निष्कर्षण - उत्पादन वैशिष्ट्ये मिळवणे
-
सामग्री AI निर्मिती - उत्पादन वर्णने
-
SKU रचना - उत्पादन ओळखकर्ते
सारांश
डेटाशीट निर्मिती एक संकरित पद्धत वापरते:
ऑन-डिमांड:
-
✅ वापरकर्त्याने विनंती केल्यावर तयार करा
-
✅ नेहमी अद्ययावत
-
✅ स्टोरेजचा अपव्यय नाही
-
✅ ~2 सेकंद प्रति PDF
बॅच:
-
✅ लोकप्रिय उत्पादने आगाऊ तयार करा
-
✅ productdb बदल ट्रॅक करा
-
✅ विनंतीच्या वारंवारतेनुसार प्राधान्य द्या
-
✅ रोज रात्री cron काम
प्रक्रिया:
-
✅ उत्पादन डेटा मिळवा (नाव, चित्रे, वैशिष्ट्ये, वर्णन)
-
✅ वैशिष्ट्ये 3 कॉलममध्ये संतुलित करा
-
✅ प्रतिमांची उंची काढा
-
✅ HTML टेम्पलेट रेंडर करा
-
✅ pdfkit सह PDF तयार करा
-
✅ फक्त पहिले पेज ठेवा
स्टोरेज:
-
✅ स्थानिक:
/home/ubuntu/web-static/ds/ -
✅ S3:
s3://thinvent-web-static/ds/ -
✅ CDN: CloudFront वितरण
ही संकरित पद्धत ताजेपणा (ऑन-डिमांड) आणि कार्यक्षमता (बॅच आगाऊ-निर्मिती) यांच्यात संतुलन राखते.