تطوير أودو

تنسيق الورق المخصص في تقارير QWeb لأودو

كيفية إنشاء وتهيئة وربط تنسيقات الورق المخصصة بتقارير QWeb لأودو — يشمل إعداد واجهة المستخدم، وتجاوز XML، والتحكم في الهوامش، وضبط حجم الرأس والتذييل.

iWesabe Editorial Team١ سبتمبر ٢٠٢٠7 دقائق للقراءة

يُنشئ محرك QWeb في أودو تقارير PDF باستخدام تنسيق ورق يتحكم في حجم الصفحة والاتجاه والهوامش والمسافة المحجوزة للرؤوس والتذييلات. يناسب تنسيق الورق الافتراضي (A4 عمودي) معظم المستندات القياسية — الفواتير وأوامر الشراء وقوائم التسليم. عندما تحتاج الشركة إلى حجم مستند مخصص أو تخطيط أفقي أو عرض هوامش محددة للقرطاسية مسبقة الطباعة، يصبح تنسيق الورق المخصص ضروريًا.

يغطي هذا الدليل ثلاثة أساليب: تهيئة تنسيق الورق عبر واجهة مستخدم أودو، وربطه بإجراء تقرير في XML، وتجاوزه مباشرةً في قالب تقرير QWeb. الأساليب الثلاثة متوافقة ويمكن دمجها.

ما هو تنسيق الورق في أودو؟

تنسيق الورق في أودو هو سجل في نموذج `ir.paper.format` يحدد الخصائص المادية وتخطيط صفحة PDF المطبوعة. كل `ir.actions.report` (إجراء تقرير) له حقل `paper_format_id` — عندما يكون هذا الحقل فارغًا، يعود التقرير إلى تنسيق الشركة الافتراضي.

ir.paper.format — الحقول الرئيسية
اسم الحقلالنوعالوصفالقيم الشائعة
nameنصالاسم المعروض في واجهة المستخدم وقائمة إجراء التقرير"A4 Custom"، "Invoice Landscape"
defaultمنطقيإذا كانت True، يُعدّ هذا التنسيق الافتراضي للشركة لجميع التقارير التي لا تحتوي على paper_format_id صريحTrue / False
formatاختيارالحجم القياسي المسمى — يُستخدم عندما لا تُحدد الأبعاد المخصصةA4, A3, Letter, Legal
orientationاختياردوران الصفحة عمودي أو أفقيPortrait / Landscape
margin_top / margin_bottom / margin_left / margin_rightعشريهوامش الصفحة بالمليمتر. تُمرَّر هذه القيم مباشرة إلى wkhtmltopdf10.0، 15.0، 20.0
header_lineمنطقيرسم خط أفقي أسفل منطقة الرأسTrue / False
header_spacingصحيحالمسافة الرأسية (بالمليمتر) بين أعلى الصفحة وبداية محتوى الجسم. يجب أن تكون ≥ ارتفاع قالب رأس QWeb.30، 40، 60
page_width / page_heightعشريأبعاد الصفحة المخصصة بالمليمتر. عند تعيينها، تتجاوز حقل `format`.210.0 / 297.0 لـ A4

إنشاء تنسيق ورق مخصص عبر واجهة مستخدم أودو

  1. انتقل إلى الإعدادات ← التقني ← التقارير ← تنسيقات الورق.
  2. انقر على جديد.
  3. اضبط الاسم على معرّف وصفي (مثلاً "Invoice A4 Narrow Margin").
  4. اختر التنسيق (A4، A3، Letter، Legal) أو اتركه فارغًا إذا كنت ستضبط الأبعاد المخصصة عبر عرض الصفحة / ارتفاع الصفحة.
  5. اضبط الاتجاه على Portrait أو Landscape.
  6. اضبط حقول الهامش الأربعة (أعلى، أسفل، يسار، يمين) بالمليمتر. نقطة بداية آمنة للفواتير هي 10 / 10 / 10 / 10.
  7. اضبط تباعد الرأس بالمليمتر. يتحكم هذا الإعداد في الفجوة بين الحافة العليا للصفحة وبداية محتوى الجسم. ابدأ بارتفاع رأسك بالمليمتر وأضف 5–10 مم هامشًا.
  8. احفظ السجل. أصبح تنسيق الورق متاحًا الآن في قائمة تنسيق الورق لأي إجراء تقرير.

ربط تنسيق الورق بإجراء تقرير في XML

بالنسبة للوحدات المخصصة، حدد سجل تنسيق الورق وربط إجراء التقرير في ملفات بيانات XML. هذا النهج قابل للتكرار ومتحكم به بالإصدارات ويُثبَّت بشكل صحيح على أي نسخة أودو.

الخطوة 1 — تعريف سجل تنسيق الورق

xml
<!-- data/paper_format_data.xml -->
<odoo>
  <record id="paperformat_invoice_custom" model="ir.paper.format">
    <field name="name">Invoice A4 Narrow Margin</field>
    <field name="default" eval="False"/>
    <field name="format">A4</field>
    <field name="orientation">Portrait</field>
    <field name="margin_top">10.0</field>
    <field name="margin_bottom">10.0</field>
    <field name="margin_left">10.0</field>
    <field name="margin_right">10.0</field>
    <field name="header_line" eval="False"/>
    <field name="header_spacing">40</field>
  </record>
</odoo>

الخطوة 2 — ربط تنسيق الورق بإجراء التقرير

xml
<!-- report/account_invoice_report.xml -->
<odoo>
  <!-- Define the report action and reference the paper format -->
  <report
    id="account_invoices_custom"
    model="account.move"
    string="Custom Invoice"
    report_type="qweb-pdf"
    name="your_module.report_invoice_custom_document"
    file="your_module.report_invoice_custom_document"
    paper_format="your_module.paperformat_invoice_custom"
    print_report_name="(object.name or 'Invoice')"
  />
</odoo>

قالب تقرير QWeb — تخطيط الرأس والتذييل والجسم

يتحكم تنسيق الورق في منطقة الطباعة المتاحة. يتحكم قالب تقرير QWeb فيما يُعرض داخل تلك المنطقة. يتم تعريف الأجزاء الثلاثة — الرأس والتذييل والجسم — باستخدام نقاط وراثة `t-call` محددة في تخطيط التقرير الأساسي لأودو.

xml
<!-- report/report_invoice_custom_document.xml -->
<odoo>
  <!-- Outer wrapper must inherit web.html_container -->
  <template id="report_invoice_custom_document">
    <t t-call="web.html_container">
      <t t-foreach="docs" t-as="doc">
        <t t-call="web.external_layout">
          <t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>

          <!-- Body content goes here -->
          <div class="page">
            <h2 t-field="doc.name"/>
            <p t-field="doc.invoice_date"/>
            <!-- ... your report body ... -->
          </div>

        </t>
      </t>
    </t>
  </template>
</odoo>

يُقدّم أودو الرؤوس والتذييلات عبر `web.external_layout_header` و`web.external_layout_footer`. لاستبدالهما لتقرير محدد، ورّث هذه القوالب وقيّد التجاوز باستخدام `t-if` على متغير `report_name`.

xml
<!-- Custom header for a specific report only -->
<template id="report_invoice_custom_header"
          inherit_id="web.external_layout_header">
  <xpath expr="//div[hasclass('header')]" position="replace">
    <!-- Only override for our custom report -->
    <t t-if="report_name == 'your_module.report_invoice_custom_document'">
      <div class="header" style="height: 35mm;">
        <!-- Your custom header HTML here -->
        <img t-att-src="'/web/image/res.company/%s/logo' % company.id"
             style="max-height: 30mm;"/>
        <div class="text-right">
          <strong t-field="company.name"/>
        </div>
      </div>
    </t>
    <t t-else="">
      <!-- Fall back to default header for all other reports -->
      <t t-call="web.external_layout_standard_header"/>
    </t>
  </xpath>
</template>

مشكلات تنسيق الورق الشائعة وحلولها

استكشاف أخطاء تنسيق ورق QWeb
الأعراضالسبب الجذريالحل
يتداخل الرأس مع محتوى الجسم في كل صفحةheader_spacing أصغر من ارتفاع HTML الرأس المُقدَّمزد header_spacing في تنسيق الورق. قِس ارتفاع رأسك في المتصفح عند دقة 96 DPI (1 مم ≈ 3.78 بكسل)، ثم أضف هامش 5–10 مم.
PDF بحجم A4 رغم تعيين page_width / page_height مخصصحقل `format` في ir.paper.format لا يزال مضبوطًا على "A4"، مما يتجاوز الأبعاد المخصصة في بعض إصدارات wkhtmltopdfامسح حقل `format` (اضبطه على خيار مخصص / فارغ) عند استخدام page_width / page_height. لا يمكن تفعيل كلا الحقلين في آن واحد.
يتجاهل التقرير تنسيق الورق المضبوط في إجراء التقريرتنسيق ورق افتراضي على مستوى الشركة مضبوط على `default = True` ويتجاوز التنسيق على مستوى الإجراءإما أن تلغي `default` في تنسيق ورق الشركة، أو تضبط `paper_format_id` صراحةً على إجراء التقرير بدلًا من الاعتماد على الافتراضي.
يتم تجاهل الهامش الأيمن؛ المحتوى يمتد خارج الصفحةأنماط عرض مُضمَّنة بشكل ثابت في قالب QWeb (مثل `width: 210mm`) لا تحسب الهوامشاستخدم عروضًا نسبية أو `max-width: 100%` في CSS لـ QWeb بدلًا من عروض مم مطلقة. دع هوامش تنسيق الورق تحدد منطقة الطباعة.
محتوى التذييل مقطوع في أسفل الصفحةmargin_bottom صغير جدًا لارتفاع HTML التذييلزد margin_bottom في تنسيق الورق. يُقدَّم التذييل ضمن منطقة الهامش السفلي — إذا كان HTML التذييل أطول من margin_bottom، يتم اقتطاعه.

ملاحظات الإصدار ودليل المراجعة السريعة

سلوك تنسيق الورق حسب إصدار أودو
إصدار أودومحرك PDFمسار واجهة المستخدمتغيير بارز
أودو 16 / 17wkhtmltopdf (أساسي)الإعدادات ← التقني ← التقارير ← تنسيقات الورقأضيف Headless Chrome كمحرك اختياري لبعض التقارير؛ API تنسيق ورق QWeb دون تغيير
أودو 18wkhtmltopdf (أساسي)الإعدادات ← التقني ← التقارير ← تنسيقات الورقلا تغييرات في API لـ ir.paper.format. وراثة قالب الرأس/التذييل دون تغيير.
أودو 19wkhtmltopdf (أساسي)الإعدادات ← التقني ← التقارير ← تنسيقات الورقلا تغييرات في API لـ ir.paper.format. موثق يونيو 2026.
أودو 20 (متوقع أواخر 2026)غير محدد — اتبع المراجعة السريعة أعلاهمتوقع استقراره — تحقق عند الإصدارتحقق مما إذا كان wkhtmltopdf لا يزال أساسيًا أم استُبدل بـ headless Chrome كافتراضي. يُتوقع أن تظل API نموذج تنسيق الورق مستقرة.

هل تحتاج مساعدة في تقارير أودو المخصصة لشركتك في السعودية أو البحرين؟

يتولى فريق تطوير أودو في iWesabe قوالب تقارير QWeb المخصصة وتهيئة تنسيق الورق وتخطيطات الفواتير المتوافقة مع ZATCA. احجز مكالمة تحديد نطاق.

واتساب

الأسئلة الشائعة

أين توجد قائمة تنسيقات الورق في أودو 19؟
في أودو 19 (وكذلك 18 و17 و16)، تنسيقات الورق موجودة في الإعدادات ← التقني ← التقارير ← تنسيقات الورق. يجب تفعيل وضع المطور لرؤية قائمة التقني. فعّله عبر الإعدادات ← الإعدادات العامة ← أدوات المطور ← تفعيل وضع المطور.
كيف أضبط حجم صفحة مخصصًا (غير A4 أو Letter) في أودو؟
اضبط `page_width` و`page_height` على سجل تنسيق الورق (القيم بالمليمتر). عند ملء هذه الحقول، امسح حقل `format` — لا يمكن تفعيل كليهما في آن واحد. مثلاً لملصق 100 مم × 150 مم: page_width = 100، page_height = 150، format = (فارغ).
كيف أطبق تنسيق ورق على تقرير واحد فقط دون بقية التقارير؟
اضبط `paper_format_id` على سجل `ir.actions.report` المحدد، وتأكد من أن `default = False` على تنسيق الورق. يأخذ `paper_format_id` على إجراء التقرير الأولوية على الافتراضي للشركة. في XML، استخدم سمة `paper_format` لتاغ `` المختصر.
لماذا يتداخل رأس تقرير QWeb مع محتوى الجسم؟
`header_spacing` في تنسيق الورق أصغر من ارتفاع HTML الرأس المُقدَّم. قِس رأسك عند دقة 96 DPI (1 مم ≈ 3.78 بكسل)، لاحظ الارتفاع بالبكسل، وحوّله إلى مم، وأضف هامشًا من 5–10 مم. اضبط تلك القيمة كـ `header_spacing`. هذه المشكلة الأكثر شيوعًا في تنسيق الورق في تطوير أودو.
هل يمكنني استخدام تنسيق ورق مختلف للصفحة الأولى مقابل الصفحات اللاحقة؟
لا — يطبّق `ir.paper.format` تهيئة واحدة على جميع صفحات التقرير. يجب تحقيق تخطيطات الصفحة الأولى المختلفة عبر CSS (`@page :first { ... }`) داخل قالب QWeb، لا عبر تنسيقات ورق منفصلة. تنطبق قيم `margin_top` و`header_spacing` دائمًا على كل صفحة.
هل يؤثر تنسيق الورق على التقرير عند طباعته من الشاشة (وليس تنزيله كـ PDF)؟
لا. يُستخدم تنسيق الورق (ir.paper.format) فقط عندما يُقدِّم أودو التقرير كـ PDF عبر wkhtmltopdf. عندما يطبع المستخدم عرض HTML على الشاشة مباشرةً عبر المتصفح، تُطبَّق إعدادات الصفحة الخاصة بالمتصفح. للتحكم في تخطيط طباعة المتصفح، استخدم `@media print` CSS في قالب QWeb.
iWesabe Editorial Team

iWesabe Editorial Team

رؤى عملية حول Odoo ERP وامتثال ZATCA والعمليات الرقمية للشركات السعودية — بقلم فرق الاستشارات والمالية والهندسة في iWesabe.

عن iWesabe

مقالات ذات صلة