ડેટાશીટ જનરેશન: ઓન-ડિમાન્ડ અને બેચ 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
સંદર્ભો
લાઇબ્રેરીઓ
સંબંધિત લેખો
-
ફીચર ઍક્સ્ટ્રેક્શન - ઉત્પાદન સ્પષ્ટતા મેળવવી
-
કન્ટેન્ટ AI જનરેશન - ઉત્પાદન વર્ણનો
-
SKU સ્ટ્રક્ચર - ઉત્પાદન ઓળખકર્તાઓ
સારાંશ
ડેટાશીટ જનરેશન હાઇબ્રિડ અભિગમનો ઉપયોગ કરે છે:
ઓન-ડિમાન્ડ:
-
✅ વપરાશકર્તાની વિનંતી પર જનરેટ કરો
-
✅ હંમેશા અપ-ટુ-ડેટ
-
✅ સ્ટોરેજનો બગાડ નથી
-
✅ ~2 સેકન્ડ પ્રતિ PDF
બેચ:
-
✅ લોકપ્રિય ઉત્પાદનો પહેલાથી જનરેટ કરો
-
✅ ઉત્પાદનdb ફેરફારો ટ્રૅક કરો
-
✅ વિનંતીની આવર્તન દ્વારા પ્રાથમિકતા આપો
-
✅ રોજ રાત્રે ક્રોન જોબ
પ્રક્રિયા:
-
✅ ઉત્પાદન ડેટા મેળવો (નામ, છબીઓ, ફીચર્સ, વર્ણન)
-
✅ 3 કૉલમમાં ફીચર્સ સંતુલિત કરો
-
✅ છબીની ઊંચાઈ ગણો
-
✅ HTML ટેમ્પલેટ રેન્ડર કરો
-
✅ pdfkit સાથે PDF જનરેટ કરો
-
✅ ફક્ત પ્રથમ પેજ જ રાખો
સ્ટોરેજ:
-
✅ સ્થાનિક:
/home/ubuntu/web-static/ds/ -
✅ S3:
s3://thinvent-web-static/ds/ -
✅ CDN: ક્લાઉડફ્રન્ટ ડિસ્ટ્રિબ્યુશન
આ હાઇબ્રિડ અભિગમ તાજગી (ઓન-ડિમાન્ડ) અને પરફોર્મન્સ (બેચ પ્રી-જનરેશન) વચ્ચે સંતુલન સાધે છે.