డేటాషీట్ జనరేషన్: ఆన్-డిమాండ్ మరియు బ్యాచ్ 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

సూచనలు

లైబ్రరీలు

  • pdfkit - HTML నుండి PDF మార్పిడి

  • pypdf - PDF మానిప్యులేషన్

  • Pillow - ఇమేజ్ ప్రాసెసింగ్

సంబంధిత వ్యాసాలు

సారాంశం

డేటాషీట్ జనరేషన్ హైబ్రిడ్ అప్రోచ్ను ఉపయోగిస్తుంది:

ఆన్-డిమాండ్:

  • ✅ వినియోగదారు అభ్యర్థించినప్పుడు జనరేట్ చేయండి

  • ✅ ఎల్లప్పుడూ అప్-టు-డేట్

  • ✅ నిల్వ వృథా లేదు

  • ✅ ~ప్రతి PDFకి 2 సెకన్లు

బ్యాచ్:

  • ✅ ప్రసిద్ధ ఉత్పత్తులను ముందుగా జనరేట్ చేయండి

  • ✅ productdb మార్పులను ట్రాక్ చేయండి

  • ✅ అభ్యర్థన ఫ్రీక్వెన్సీ ప్రకారం ప్రాధాన్యత ఇవ్వండి

  • ✅ రోజూ రాత్రి cron జాబ్

ప్రక్రియ:

  • ✅ ఉత్పత్తి డేటాను పొందండి (పేరు, చిత్రాలు, ఫీచర్లు, వివరణ)

  • ✅ 3 కాలమ్లలో ఫీచర్లను సమతుల్యం చేయండి

  • ✅ ఇమేజ్ ఎత్తులను లెక్కించండి

  • ✅ HTML టెంప్లేట్ను రెండర్ చేయండి

  • ✅ pdfkitతో PDF జనరేట్ చేయండి

  • ✅ మొదటి పేజీని మాత్రమే ఉంచండి

నిల్వ:

  • ✅ లోకల్: /home/ubuntu/web-static/ds/

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

  • ✅ CDN: CloudFront డిస్ట్రిబ్యూషన్

ఈ హైబ్రిడ్ అప్రోచ్ తాజాదనాన్ని (ఆన్-డిమాండ్) పనితీరుతో (బ్యాచ్ ప్రీ-జనరేషన్) సమతుల్యం చేస్తుంది.


← డాక్యుమెంటేషన్ ఇండెక్స్కు తిరిగి వెళ్ళండి