డేటాషీట్ జనరేషన్: ఆన్-డిమాండ్ మరియు బ్యాచ్ PDF సృష్టి
ఈ వ్యాసం మేము ఉత్పత్తి డేటాషీట్లను PDFలుగా ఎలా జనరేట్ చేస్తామో వివరిస్తుంది, రెండు విధాలుగా: ఆన్-డిమాండ్ (వినియోగదారులు వాటిని అభ్యర్థించినప్పుడు) మరియు బ్యాచ్ (ప్రసిద్ధ ఉత్పత్తుల కోసం ముందుగా జనరేట్ చేయడం).
సమస్య: ఉత్పత్తి డేటాషీట్లను సృష్టించడం
ప్రతి ఉత్పత్తికి ఒక ప్రొఫెషనల్ PDF డేటాషీట్ అవసరం, ఇందులో ఇవి ఉండాలి:
-
ఉత్పత్తి పేరు మరియు చిత్రాలు
-
వర్గం ప్రకారం గ్రూప్ చేయబడిన సాంకేతిక వివరణలు
-
కంపెనీ బ్రాండింగ్ మరియు సంప్రదింపు సమాచారం
-
ఆప్టిమైజ్ చేయబడిన లేఅవుట్ (సింగిల్ పేజీ, బ్యాలెన్స్డ్ కాలమ్లు)
ప్రతి అభ్యర్థనపై PDFలను జనరేట్ చేయడం నెమ్మదిగా ఉంటుంది (~ప్రతి PDFకి 2 సెకన్లు). అన్ని 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()
పనితీరు
జనరేషన్ సమయం: ~ప్రతి PDFకి 2 సెకన్లు
క్యాచింగ్: క్యాచింగ్ లేదు (ఎల్లప్పుడూ తాజాగా)
ప్రయోజనం: తాజా ఉత్పత్తి డేటాతో ఎల్లప్పుడూ అప్-టు-డేట్
బ్యాచ్ జనరేషన్
ప్రయోజనం
ఆన్-డిమాండ్ లోడ్ని తగ్గించడానికి ప్రసిద్ధ ఉత్పత్తుల కోసం 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>
గూగుల్ షాపింగ్
ఉత్పత్తి ఫీడ్లో లింక్ చేయబడిన డేటాషీట్లు:
<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 నిర్మాణం - ఉత్పత్తి ఐడెంటిఫైయర్లు
సారాంశం
డేటాషీట్ జనరేషన్ హైబ్రిడ్ అప్రోచ్ను ఉపయోగిస్తుంది:
ఆన్-డిమాండ్:
-
✅ వినియోగదారు అభ్యర్థించినప్పుడు జనరేట్ చేయండి
-
✅ ఎల్లప్పుడూ అప్-టు-డేట్
-
✅ నిల్వ వృథా లేదు
-
✅ ~ప్రతి PDFకి 2 సెకన్లు
బ్యాచ్:
-
✅ ప్రసిద్ధ ఉత్పత్తులను ముందుగా జనరేట్ చేయండి
-
✅ productdb మార్పులను ట్రాక్ చేయండి
-
✅ అభ్యర్థన ఫ్రీక్వెన్సీ ప్రకారం ప్రాధాన్యత ఇవ్వండి
-
✅ రోజూ రాత్రి cron జాబ్
ప్రక్రియ:
-
✅ ఉత్పత్తి డేటాను పొందండి (పేరు, చిత్రాలు, ఫీచర్లు, వివరణ)
-
✅ 3 కాలమ్లలో ఫీచర్లను సమతుల్యం చేయండి
-
✅ ఇమేజ్ ఎత్తులను లెక్కించండి
-
✅ HTML టెంప్లేట్ను రెండర్ చేయండి
-
✅ pdfkitతో PDF జనరేట్ చేయండి
-
✅ మొదటి పేజీని మాత్రమే ఉంచండి
నిల్వ:
-
✅ లోకల్:
/home/ubuntu/web-static/ds/ -
✅ S3:
s3://thinvent-web-static/ds/ -
✅ CDN: CloudFront డిస్ట్రిబ్యూషన్
ఈ హైబ్రిడ్ అప్రోచ్ తాజాదనాన్ని (ఆన్-డిమాండ్) పనితీరుతో (బ్యాచ్ ప్రీ-జనరేషన్) సమతుల్యం చేస్తుంది.