ડેટાશીટ જનરેશન: ઓન-ડિમાન્ડ અને બેચ 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)

શેડ્યૂલિંગ

બેચ જનરેશન ક્રોન દ્વારા રોજ રાત્રે ચાલે છે:

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: ક્લાઉડફ્રન્ટ દ્વારા સર્વ કરવામાં આવે છે

ટેમ્પલેટ સ્ટ્રક્ચર

ડેટાશીટ ટેમ્પલેટ 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

બેચ:

  • ✅ લોકપ્રિય ઉત્પાદનો પહેલાથી જનરેટ કરો

  • ✅ ઉત્પાદનdb ફેરફારો ટ્રૅક કરો

  • ✅ વિનંતીની આવર્તન દ્વારા પ્રાથમિકતા આપો

  • ✅ રોજ રાત્રે ક્રોન જોબ

પ્રક્રિયા:

  • ✅ ઉત્પાદન ડેટા મેળવો (નામ, છબીઓ, ફીચર્સ, વર્ણન)

  • ✅ 3 કૉલમમાં ફીચર્સ સંતુલિત કરો

  • ✅ છબીની ઊંચાઈ ગણો

  • ✅ HTML ટેમ્પલેટ રેન્ડર કરો

  • ✅ pdfkit સાથે PDF જનરેટ કરો

  • ✅ ફક્ત પ્રથમ પેજ જ રાખો

સ્ટોરેજ:

  • ✅ સ્થાનિક: /home/ubuntu/web-static/ds/

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

  • ✅ CDN: ક્લાઉડફ્રન્ટ ડિસ્ટ્રિબ્યુશન

આ હાઇબ્રિડ અભિગમ તાજગી (ઓન-ડિમાન્ડ) અને પરફોર્મન્સ (બેચ પ્રી-જનરેશન) વચ્ચે સંતુલન સાધે છે.


← ડૉક્યુમેન્ટેશન ઈન્ડેક્સ પર પાછા જાઓ