টিসিপিডিএফ পূর্ণ পৃষ্ঠা সারণী


11

ছবিতে যেমন চিত্রটি দেখানো হয়েছে তেমনভাবে পৃষ্ঠায় ফিট করতে টেবিলটি তৈরি করার জন্য আমি অনেকগুলি উপায় চেষ্টা করেছি: এখানে চিত্র বর্ণনা লিখুন আমি অনেক অনুসন্ধান করেছি কিন্তু ওয়েবে দরকারী কিছু খুঁজে পেলাম না। আমি গতিশীল টেবিল ব্যবহার করছি, টেবিলের প্রস্থতা বাদে সবকিছু ঠিক আছে। এখানে আমার কোড:

$content = '<table><thead><tr><th class="bg-dark text-white" align="center">#</th><th align="center" class="bg-dark text-white">Code</th><th align="left" class="bg-dark text-white">Description</th><th align="center" class="bg-dark text-white">Item Type</th></tr></thead><tbody><tr style="background-color: #f2f2f2;"><td align="center">1</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr ><td align="center">2</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">3</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr ><td align="center">4</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">5</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr ><td align="center">6</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">7</td><td align="center">1007</td><td align="left">Apple</td><td align="center">Weight</td></tr><tr ><td align="center">8</td><td align="center">1008</td><td align="left">Water</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">9</td><td align="center">1009</td><td align="left">Cleaner</td><td align="center">Fixed Price</td></tr><tr ><td align="center">10</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">11</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr ><td align="center">12</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">13</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr ><td align="center">14</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">15</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr></tbody></table>';
$newContent = '
    <style type="text/css">
    table{width:100%;}
    table, table td, table th{
        border-collapse: collapse;
        border: solid 1px #ababab;
    }
    .text-dark, table td{
        color: #343a40;
    }
    .text-white{
        color: #ffffff;
    }
    table td,
    table th {
        font-size: 11px;
        padding: 3px;
        line-height: 1.2;
        font-family:arial;
    }

    .bg-dark {
        background-color: #343a40;
    }
    .bg-secondary {
        background-color: #6c757d;
    }
    .bg-white {
        background-color: #ffffff;
    }
    .text-left {
        text-align: left;
    }
    .text-right {
        text-align: right;
    }
    .text-center {
        text-align: center;
    }
    </style>
    ';
    $newContent .= '<page>'.$content.'</page>';

    try {
        $html2pdf = new Html2Pdf('P', 'A4', 'en', true, 'UTF-8', 5);
        $html2pdf->pdf->SetDisplayMode('real');
        $html2pdf->writeHTML($newContent);
        $PDFName = "ItemLists_".date('Y.m.d_H.i.s').".pdf";
        $html2pdf->output($PDFName, 'I');
    } catch (Html2PdfException $x) {
        $html2pdf->clean();

        $formatter = new ExceptionFormatter($x);
        echo $formatter->getHtmlMessage();
    }

অনেক ধন্যবাদ


এটি আসলে এইচটিএমএল 2 পিডিএফ লাইব্রেরির একটি বাগ। একটি সম্ভাব্য কর্মক্ষেত্র সন্ধান করা।
ইপিবি

বিটিডব্লু, এইচটিএমএল 2 পিডিএফ এটির নিজস্ব HTML পার্সার ব্যবহার করে। style="width: 100%"এমএম-তে সঠিকভাবে রূপান্তরিত প্রস্থ সংরক্ষণ করে (যদিও প্রস্থের বৈশিষ্ট্যটি না!) তবে এইচটিএমএল 2 পিডিএফ টেবিল রেন্ডারিংয়ের সময় এটি ব্যবহার করে না বলে মনে হয়।
ইপিবি

উত্তর:


4

এইচটিএমএল 2 পিডিএফ টিসিপিডিএফ এর এইচটিএমএল পার্সার / রেন্ডার সিস্টেম ব্যবহার করে না। এটি তার নিজস্ব প্রয়োগ করে এবং এটি বাস্তবায়ন 100% স্থান পূরণ করার জন্য কলামগুলি স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে না।

যেমন, এইচটিএমএল 2 পিডিএফ-তে, কেবল আপনাকে টেবিলে 100% প্রস্থ নির্ধারণ করতে হবে না, তবে প্রতিটি কক্ষের জন্য আপনাকে শতাংশের প্রস্থগুলি নির্ধারণ করতে হবে। (এবং widthএইচটিএমএল 2 পিডিএফ- এর বৈশিষ্ট্যের সাথে কিছু অদ্ভুত আচরণের কারণে , প্রস্থগুলি সেট করতে CSS ব্যবহার করুন))

টিসিপিডিএফের নেটিভ writeHTMLপ্রতিটি কলামকে অন্য প্রকারের কোনও নির্দিষ্টকরণ অনুপস্থিত একই প্রস্থে সেট করবে। (উদাহরণস্বরূপ, একটি 4-কলামের টেবিলের 25% এ সমস্ত কক্ষ রয়েছে) তবে, এটি আপনি যে সিএসএস ব্যবহার করছেন তা সমর্থন করে না তাই সেই পথটিতে যেতে মার্কআপকে সামান্য টুইট করার দরকার পড়ে।

এইচটিএমএল 2 পিডিএফ-এ এই প্রাথমিক আচরণটি অনুকরণ করার জন্য, আপনি কেবলমাত্র সহজেই আপনার কোষগুলিতে সমতুল্য প্রস্থগুলি যুক্ত করতে পারেন। উদাহরণস্বরূপ, আপনার table td, table thশৈলীর নিয়মে প্রস্থের নির্দিষ্টকরণ যুক্ত করা adding

চার কলামের টেবিলের জন্য নিম্নলিখিত সিএসএস বিধিগুলির সাথে একটি উদাহরণ এখানে দেওয়া হয়েছে:

table { width: 100%; }
table th, table td { width: 25%; }

অবশ্যই আপনি যখন আপনার সামগ্রীর সাথে প্রস্থের প্রস্থগুলি নির্দিষ্ট করেন তখন সেরা লাগে।

সমতুল্য কলাম সহ উদাহরণ


হালনাগাদ

আমি নীচে টিসিপিডিএফ সম্পর্কে কিছু আলোচনা ছেড়ে যাচ্ছি কারণ এটি সম্ভাব্য উপকারী শ্রেণীর গঠনের দিকে কিছুটা এগিয়ে নিয়ে যায় Html2pdf। টিসিপিডিএফের স্ট্রিংয়ের দৈর্ঘ্য পরিমাপ করার জন্য কিছু দরকারী পদ্ধতি রয়েছে। আপনি যদি কলামগুলির মধ্যে স্ট্রিংগুলির আকার পরিমাপ করেন তবে আপনি নিজের স্বয়ংক্রিয় কলাম কলা তৈরি করতে পারেন।

আমি https://github.com/b65sol/random-class এ গিথুবে একটি প্রুফ-অফ-কনসেপ্ট ক্লাস তৈরি করেছি

প্রথমত, আমরা এইচটিএমএল নির্মাণের মধ্যস্থতার জন্য শ্রেণিটি ব্যবহার করি। এটি তাই প্রস্থগুলি সেট করার জন্য কলামের ক্লাসগুলি যুক্ত হবে এবং আমরা পরিমাপ করছি এমন সামগ্রীগুলি বের করতে আমাদের এইচটিএমএলকে বিশ্লেষণ করতে হবে না।

তারপরে আমাদের কলামের প্রস্থ নির্বাচন করার জন্য আমাদের কিছু কৌশল বেছে নিতে হবে। উদাহরণস্বরূপ, নীচের ডেমোটি কলামগুলি পরিমাপ করে এবং দীর্ঘতম শব্দের ভিত্তিতে প্রতিটির জন্য সর্বনিম্ন প্রস্থ শতাংশ খুঁজে পায়। (ওয়ার্ডব্রেক এড়ান) তারপরে দীর্ঘতম শব্দ এবং দীর্ঘতম কক্ষের সামগ্রীর মধ্যে পার্থক্যের ভিত্তিতে আনুপাতিকভাবে কোনও অতিরিক্ত স্থান বিতরণ করে। আমি এই উত্পাদনটিকে প্রস্তুত হিসাবে কল করব না কারণ এটি একটি প্রুফ অফ ধারণার, তবে আমি আশা করছি আপনি (বা অন্যান্য অনুসন্ধানকারী) এটি একটি কার্যকর সূচনা পয়েন্ট হিসাবে খুঁজে পাবেন।

নীচে এর জন্য মূল অংশটি হ'ল: $tablebuilder->determine_column_widths_by_minimum_strategy('100%', 'aaa')

প্রথম প্যারামিটারটি আমরা যে আকারের সাথে কাজ করছি তার রেফারেন্স দেয় (পরিমাপকে দরকারী করার জন্য এটির প্রয়োজন হিসাবে পৃষ্ঠাটির 100%), এবং দ্বিতীয়টি পাঠ্য শৈলী এবং টেবিলের জন্য আমাদের পরিমাপগুলিতে যোগ করার জন্য কিছু প্রিসেট প্যাডিং অক্ষর সরবরাহ করে প্যাডিং পার্থক্য।

এখানে এটির একটি ডেমো চলছে: https://b65sol.com/so/59517311_new.php

ক্লাস নিজেই এখানে উপলভ্য: https://github.com/b65sol/random-class

এই ডেমোটির কোড এখানে:

<?php
require 'vendor/autoload.php';
include 'random-classes/html2pdf-full-table-optimizer.php';
use Spipu\Html2Pdf\Html2Pdf;

//First let's build a random table!
$wordlist = ['Chocolate', 'Cake', 'Brownies', 'Cupcakes', 'Coreshock', 'Battery', 'Lead', 'Acid', 'Remilia'];
$wordlist2 = ['Reinforcement Learning', 'Initial Latent Vectors', 'Bag-of-Words', 'Multilayer Perceptron Classifier',
  'Deconvolutional Neural Network', 'Convolutional Neural Network'];
$number_of_columns = rand(3,11);
$number_of_rows = rand(8, 15);
$possible_column_names = ['Unit', 'Description', 'Variable', 'Moon', 'Cheese', 'Lollipop', 'Orange', 'Gir', 'Gaz', 'Zim', 'Dib'];
$possible_column_content_generators = [
  function() {return rand(10,100); },
  function() {return rand(1000, 1999); },
  function() use ($wordlist) {return $wordlist[rand(0, count($wordlist)-1)]; },
  function() use ($wordlist) {return $wordlist[rand(0, count($wordlist)-1)] . ' '. $wordlist[rand(0, count($wordlist)-1)];},
  function() use ($wordlist2) {return $wordlist2[rand(0, count($wordlist2)-1)];},
];

shuffle($possible_column_names);
$list_of_generators = [];
$column_classes = [];
$column_names = [];
for($i = 0; $i < $number_of_columns; $i++) {
  $list_of_generators[$i] = $possible_column_content_generators[rand(0, count($possible_column_content_generators)-1)];
  $column_classes[$i] = ['text-left', 'text-right', 'text-center'][rand(0,2)];
  $column_names[$i] = $possible_column_names[$i];
}
//Got our random stuff, onward to generator!

try {
    $html2pdf = new Html2Pdf('P', 'A4', 'en', true, 'UTF-8', 5);
    $html2pdf->pdf->SetDisplayMode('real');
    $tablebuilder = new Html2PdfTableOptimizer($html2pdf->pdf, '11px', 'helvetica');

    //run table builder... using random data for testing.
    for($i = 0; $i < $number_of_columns; $i++) {
      /*Add a header cell, content is the first parameter, CSS class attribute is second.*/
      $tablebuilder->add_header_cell($column_names[$i], $column_classes[$i] . ' bg-dark text-white');
    }

    for($i = 0; $i < $number_of_rows; $i++) {
      //Start a row.
      $tablebuilder->start_data_row();
      for($col = 0; $col < $number_of_columns; $col++) {
        //Add content and our column classes for td elements
        $tablebuilder->add_data_row_cell($list_of_generators[$col](), $column_classes[$col]);
      }
      //End the row.
      $tablebuilder->end_data_row();
    }
    //Get the table HTML.
    $render = $tablebuilder->render_html();

    $newContent = '
      <style type="text/css">
      table{width:100%;}
      table, table td, table th{
          border-collapse: collapse;
          border: solid 1px #ababab;
      }
      .text-dark, table td{
          color: #343a40;
      }
      .text-white{
          color: #ffffff;
      }
      table td,
      table th {
          font-size: 11px;
          padding: 3px;
          line-height: 1.2;
          font-family:arial;
      }

      .bg-dark {
          background-color: #343a40;
      }
      .bg-secondary {
          background-color: #6c757d;
      }
      .bg-white {
          background-color: #ffffff;
      }
      .row-even {
        background-color: #d1d1d1;
      }
      .text-left {
          text-align: left;
      }
      .text-right {
          text-align: right;
      }
      .text-center {
          text-align: center;
      }

      '.$tablebuilder->determine_column_widths_by_minimum_strategy('100%', 'aaa').'

      </style>
      ';
      $newContent .= '<page>'.$render.'</page>';

      if(!empty($_GET['html'])) {
        echo $newContent;
      } else {
        $html2pdf->writeHTML($newContent);
        $PDFName = "ItemLists_".date('Y.m.d_H.i.s').".pdf";
        $html2pdf->output($PDFName, 'I');
      }
} catch (Html2PdfException $x) {
    $html2pdf->clean();

    $formatter = new ExceptionFormatter($x);
    echo $formatter->getHtmlMessage();
}

আপডেট শেষ


আপনি যদি প্রস্থগুলি স্পষ্টভাবে নির্দিষ্ট না করতে পছন্দ করেন তবে আপনি লাইব্রেরিটি writeHTMLব্যবহার না করে টিসিপিডিএফ ব্যবহার করতে পারেন Html2PDF, তবে যা করা হবে তা হ'ল সমান আকারের কলামগুলি ব্যবহার করা। আমি সত্যিই ভেবেছিলাম এটি কলামের আকারের কিছু পুনঃ গণনা করবে যদি আপনি কেবল একটি বা দুটি নির্দিষ্ট করে থাকেন তবে আমি ভুল ছিল। আরও, টিসিপিডিএফ একই সীমাবদ্ধতার মধ্যে কিছু ভুগছে Html2PDF- আপনি যদি একটি কলামের আকার নির্দিষ্ট করেন তবে এটি স্বয়ংক্রিয়ভাবে অন্যান্য কলামগুলিকে ফিট করার জন্য আকার পরিবর্তন করবে না।

এটি কোনও ব্রাউজারের মতো কন্টেন্টের কলামগুলিও আকার দেয় না। এটি আসলে বেশ ভাল করা তাই আমি টিসিপিডিএফ চেষ্টা করে না দেখে অবাক হই না। একটি সম্ভাব্য নিম্ন-প্রচেষ্টা সমাধান হ'ল আপনার কলামগুলিকে একটি আকার 'অনুপাত' দিয়ে ট্যাগ করা এবং প্রতিটি আনুপাতিক আকারের কলামগুলি কতটি নির্বাচিত হয় তার উপর নির্ভর করে প্রত্যেকের জন্য ফ্লাইয়ের প্রস্থগুলি গণনা করা। (যেমন, সংখ্যার কলামগুলি 'ছোট', এবং একটি বিবরণ কলামটি 'বৃহত' হবে এবং সুতরাং এটি দুটি ছোট ছোটগুলিকে প্রতিটি 10% এবং একক বিবরণ 80% এ ছড়িয়ে দেয়। দুটি ছোট ছোট 5% এবং বৃহত কলামগুলিতে 45% at প্রতিটি। এটি কিছু পরীক্ষা নিরীক্ষা নিতে হবে।)


আপনার সময়ের জন্য ধন্যবাদ, সমস্যাটি হচ্ছে আমি গতিশীল টেবিলটি ব্যবহার করছি সেখানে 10 টি কলাম রয়েছে যা ব্যবহারকারীরা বেছে নিতে পারেন, সম্ভবত 5 টি কলস বা 8 টি কলস বা 2 টি কলস যা alচ্ছিকভাবে রয়েছে এটির অন্য উপায় যা আমি এটি করতে পারি এবং এটি হ'ল : table th, table td { <?=floor(100 / count($cols))?>%;}তবে আমি আরও ভাল সমাধানের সন্ধান করছি
মোহসেন নিউটোয়া

1
আপনি কতটা প্রতিশ্রুতিবদ্ধ Html2PDF? আমার কোড এবং উদাহরণগুলির সমস্ত পড়ার পরামর্শ দেয় এটিই একমাত্র উপায়। টিসিপিডিএফ এটি সামান্য কম সক্ষম সিএসএস পার্সিংয়ের মাধ্যমে এটি করতে পারে তবে এটির একটি আরও ভাল লেআউট সিস্টেম রয়েছে। আমি সরাসরি টিসিপিডিএফের জন্য মার্কআপের পরামর্শ দিতে পারি।
ইপিবি

আমি টিসিপিডিএফ চেষ্টা করেছি এবং আমি বুঝতে পেরেছিলাম যে তারা আমার ব্যবহারের মতো একই পদ্ধতি ব্যবহার করে তবে এখনও এটি আমার সমস্যার সমাধান করে না, যদি আমি একটি ঘর পরিবর্তন করি তবে এটি অন্য কোষের উপর প্রভাব ফেলবে এবং টেবিলের প্রস্থটি এখনও পৃষ্ঠার সাথে খাপ খায় না, টিসিপিডিএফ এবং এইচটিএমএল 2 পিডিএফের মধ্যে পার্থক্যটি হ'ল টিসিপিডিএফ ঠিক আমার মতো ডিফল্ট টেবিল আকার ব্যবহার করছেtable th, table td { <?=floor(100 / count($cols))?>%;}
মোহসেন নিউটোয়া

আসলে, আমি সেই সমস্যাটিই ছুঁড়েছিলাম। আমি ভেবেছিলাম আমার পরীক্ষাটি স্থাপন করার সময় এটি আমাকে নির্দিষ্ট নির্দিষ্টগুলির আকার নির্দিষ্ট করতে এবং বাকীগুলিকে স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে অনুমতি দেবে (যা আদর্শ না হলেও সামান্য প্রচেষ্টা দিয়ে যুক্তিসঙ্গতভাবে সুন্দর দেখায়), তবে এটি মোটেও হয় না ... । আমি আরও কিছু খনন করব এবং দেখুন কলামগুলি স্বতঃ-আকার দেওয়ার কিছু স্বল্প প্রচেষ্টা আছে। এটি কিছুটা প্রিপ্রোসেসিং হতে হবে যদিও এটি বাক্সের বাইরে নেই Html2PDFবা TCPDFপ্রদর্শিত হবে না।
ইপিবি

এটি আপনাকে আপডেটগুলি সম্পর্কে অবহিত করে কিনা তা নিশ্চিত নয়, তবে আমি একটি শ্রেণি যুক্ত করেছি যা তাদের সামগ্রীর উপর ভিত্তি করে পাঠ্য-ভিত্তিক টেবিলগুলিকে গতিশীল আকার দেয়। এমন একটি কৌশলও বলা হয়েছে determine_column_widths_evenlyযা আপনাকে কয়েকটি জ্ঞাত আকার নির্দিষ্ট করতে দেয় এবং এটিকে সমানভাবে অবশিষ্ট স্থান বিতরণ করতে দেয়।
ইপিবি

0

সিডিএসের জন্য পিডিএফ-র সার্ভার-সাইডের সাথে কাজ করা দুর্দান্ত নয়। আপনি কি কেবল এইচটিএমএল ব্যবহার করার চেষ্টা করেছেন?

উদাহরণ স্বরূপ:

<table width="100%">
  <!-- your table code -->
</table>

বিকল্পভাবে আপনি চেষ্টা করতে পারেন:

<table style="width: 100%;">
  <!-- your table code -->
</table>

এখানে একটি কোডপেন রয়েছে যা ব্রাউজারে এটি কাজ করে demonst https://codepen.io/tinacious/pen/PowJRbb


আমি এই সমস্তগুলি চেষ্টা করেছিলাম: <table width="100%"> <table style="width:100%;"> <table class="w100"> <link rel="stylesheet" href="style.css" />তবে সমস্যাটি হ'ল এটি HTML এ দারুণভাবে কাজ করে তবে আমি যখন এটি পিডিএফ হিসাবে সংরক্ষণ করতে চাই তখন এটি চিত্রের মতো হবে।
মহসেন নিউটোয়া

0

ছবিটি: এখানে চিত্র বর্ণনা লিখুন

আমি মনে করি যে এই ধরণের টেবিলগুলির জন্য সর্বোত্তম উপায়টি এইভাবে ব্যবহার করা হচ্ছে:

table th, table td { width:<?=floor(100 / count($cols))?>%;}

টিসিপিডিএফ এ তারা বিশেষ কিছু করেনি, টেবিলটি যাইহোক পৃষ্ঠায় ফিট করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.