Текст върху снимка (html,css) генериране на pdf

C++ JAVA
User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Текст върху снимка (html,css) генериране на pdf

Post by Ticketa » Tue Mar 05, 2019 9:47 am

Привет,
За около 7 дни изпробвах над 5 продукта (dompdf, tcpdf, mpdf и още два) които ми "бъгват" целият проект.

Проблема се корени в това , че генерирам Х на брой етикети, всеки 1 етикет си има background снимка. Върху снимката обаче генерирам цена(създадена по формули и маржове, тя е променлива)

Стигнах до заключението да използвам HTML+CSS , НО .. нито един от конверторите не позволява пълноценно използването на CSS например функциите position: absolute й position: relative

Вие използвали ли сте подобен инструмент , който поддържа или има опция за "текст" върху точно кординирано място/позиция? Й ако - да, чрез пример кое бихте ми посочили?

Благодаря!

Примерният ми html:

Code: Select all

style>
@page {
   size: 7in 9.25in;
   margin: 27mm 16mm 27mm 16mm;
}
span {position:absolute; top:250px; left:20px; width:200px; height:25px}
</style>
<table  cellpadding="3">
	<tbody>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><IMG SRC="output-onlinepngtools.png">
<span>
19,50
</span></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
	</tbody>
</table>

Пример с tcpdf

Code: Select all

<?php
// Include the main TCPDF library &#40;search for installation path&#41;.
require_once&#40;'./tcpdf/tcpdf.php'&#41;;
// include 1D barcode class &#40;search for installation path&#41;
require_once&#40;'./tcpdf/tcpdf_barcodes_1d.php'&#41;;

date_default_timezone_set&#40;'Europe/Sofia'&#41;;

// create new PDF document
$pdf = new TCPDF&#40;PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false&#41;;

// set document information
$pdf->SetCreator&#40;PDF_CREATOR&#41;;
$pdf->SetAuthor&#40;'Nicola Asuni'&#41;;
$pdf->SetTitle&#40;'TCPDF Example 061'&#41;;
$pdf->SetSubject&#40;''&#41;;
$pdf->SetKeywords&#40;''&#41;;
/*
// set default header data
$pdf->SetHeaderData&#40;PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 061', PDF_HEADER_STRING&#41;;

// set header and footer fonts
$pdf->setHeaderFont&#40;Array&#40;PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN&#41;&#41;;
$pdf->setFooterFont&#40;Array&#40;PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA&#41;&#41;;

// set default monospaced font
$pdf->SetDefaultMonospacedFont&#40;PDF_FONT_MONOSPACED&#41;;

// set margins
$pdf->SetMargins&#40;PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT&#41;;
$pdf->SetHeaderMargin&#40;0&#41;;
$pdf->SetFooterMargin&#40;0&#41;;
*/
//remove header and footer
$pdf->setPrintHeader&#40;false&#41;;
$pdf->setPrintFooter&#40;false&#41;;

// set default monospaced font
$pdf->SetDefaultMonospacedFont&#40;PDF_FONT_MONOSPACED&#41;;

// set margins
//$pdf->setTopMargin&#40;10.0&#41;;
$pdf->SetLeftMargin&#40;6.0&#41;;
$pdf->SetRightMargin&#40;6.00&#41;;

$pdf->setHeaderMargin&#40;6.0&#41;;
$pdf->SetFooterMargin&#40;6.0&#41;; //13mm


// set auto page breaks
$pdf->SetAutoPageBreak&#40;TRUE, PDF_MARGIN_BOTTOM&#41;;

// set image scale factor
$pdf->setImageScale&#40;PDF_IMAGE_SCALE_RATIO&#41;;

// set some language-dependent strings &#40;optional&#41;
//if &#40;@file_exists&#40;dirname&#40;__FILE__&#41;.'/lang/eng.php'&#41;&#41; &#123;
   // require_once&#40;dirname&#40;__FILE__&#41;.'/lang/eng.php'&#41;;
   // $pdf->setLanguageArray&#40;$l&#41;;
//&#125;

// ---------------------------------------------------------

// set font
$pdf->SetFont&#40;'helvetica', '', 10&#41;;

// add a page
$pdf->AddPage&#40;&#41;;

// define some HTML content with style
$html = '
<style>
@page &#123;
   size&#58; 7in 9.25in;
   margin&#58; 27mm 16mm 27mm 16mm;
&#125;
span &#123;position&#58;absolute; top&#58;250px; left&#58;20px; width&#58;200px; height&#58;25px&#125;
</style>
<table  cellpadding="3">
	<tbody>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><IMG SRC="output-onlinepngtools.png">
<span>
19,50
</span></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
		<tr style="margin&#58;1px">
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
			<td style="margin&#58;1px"><img src="output-onlinepngtools.png" alt="Snow"  /></td>
		</tr>
	</tbody>
</table>
';
$pdf->writeHTML&#40;$html, true, false, true, false, ''&#41;;
$pdf->lastPage&#40;&#41;;

// ---------------------------------------------------------

//Close and output PDF document
$pdf->Output&#40;'example_061.pdf', 'I'&#41;;

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3278
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Tue Mar 05, 2019 2:09 pm

А защо не генерираш изображение с цената на него?
http://php.net/manual/en/function.imagecopy.php

[php]
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
[/php]

User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Tue Mar 05, 2019 3:37 pm

Обмислях го. Но ако имам 400бр етикети по 5 на ред ,
400/5 = 80реда

1 етикет има около 480 px височина или иначе казано около 5см. Това няма ли да бъде твърде голямо изображение :shock:

Използвам този код за създаване на снимка:

Code: Select all

<?php
error_reporting&#40;E_ALL&#41;;
ini_set&#40;'display_errors', 1&#41;;
  //Set the Content Type
  header&#40;'Content-type&#58; image/png'&#41;;

  // Create Image From Existing File
  $jpg_image = imagecreatefrompng&#40;'output-onlinepngtools.png'&#41;;

  // Allocate A Color For The Text
  $white = imagecolorallocate&#40;$jpg_image, 255, 255, 255&#41;;
  $black = imagecolorallocate&#40;$jpg_image, 0, 0, 0&#41;;

  // Set Path to Font File
  $font_path = 'arial.ttf';

  // Set Text to Be Printed On Image
  $text = "12,00";

  // Print Text On Image
  imagettftext&#40;$jpg_image, 25, 0, 143, 315, $black, $font_path, $text&#41;; //настрани , надолу
  
  // Send Image to Browser
  imagejpeg&#40;$jpg_image&#41;;

  // Clear Memory
  imagedestroy&#40;$jpg_image&#41;;
?> 
Проблема , е че не мултиплицира етикета до 5 на ред и да прехвърля на нов ред. Трябва да бъдат до максимум 25 на страница тъй като ще се принтират на A4 лист

Където е: 143, 315 са координаторите върху етика с цената

User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Tue Mar 05, 2019 8:14 pm

Направих го , чрез HTML + css (но след като завърша ще тествам при принтиране как ще излиза).

Но имам един бъг. Например имам 90 броя етикети, чрез функцията calculate_columns (за която помогна колега от туриста) разделям на 4 равни части бройките (например: 22, 24, 22, 22)
В случая , аз имам лимит на страница ДО 20 етикета, а моя код продължава да "натрупва" , как може да се направи когато стигне 20броя , просто да създаде нова страница?

Сега към момента вземам общия брой(например:90 разделям го на 4 и получавам колко страници ми трябват, и започвам да ги пълня)

Явно логиката ми е грешна и трябва първо да вземам колко са бройките след деленето (например: 22, да ги разделя на 4 и да получа 1.1 и да създам 2 страници) и след това да ги запълвам?

Някой може ли да удари рамо?
[php]<?php
$mysqli = new mysqli('localhost', 'USER', 'pass', 'DB');
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$mysqli->set_charset("utf8");

/* разделяме на 4 и правиме второто число да компенсира остатъка */
function calculate_columns(int $total, int $size, int $prefer = 1): array {
$columns = [];
for ($i = 0; $i < $size; $i++) {
$columns[$i] = floor($total / $size);
}
$columns[$prefer] += $total - $columns[$prefer] * $size;
return $columns;
/*
Array (
[0] => 22
[1] => 24
[2] => 22
[3] => 22
)
*/
}
?><html>
<head>
<style>body {
background: rgb(204,204,204);
}
page {
background: white;
display: block;
margin: 0 auto;
margin-bottom: 0.5cm;
box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
page[size="A4"] {
width: 21cm;
height: 29.7cm;
}
page[size="A4"][layout="landscape"] {
width: 29.7cm;
height: 21cm;
}
page[size="A3"] {
width: 29.7cm;
height: 42cm;
}
page[size="A3"][layout="landscape"] {
width: 42cm;
height: 29.7cm;
}
page[size="A5"] {
width: 14.8cm;
height: 21cm;
}
page[size="A5"][layout="landscape"] {
width: 21cm;
height: 14.8cm;
}
@media print {
body, page {
margin: 0;
box-shadow: 0;
}
}

/* Container holding the image and the text */
.container {
position: relative;
text-align: center;
margin-left:10px;
color: #000 ;
font-size:19px !important;
font-weight: bold; font: arial;
}

/* Centered text */
.centered {
position: absolute;
top: 70%;
left: 50%;
transform: translate(-50%, -50%);
margin-left:6px;

}</style>
<script>
//window.print();
</script>
</head>
<body>
<?php
$lstoutput = array();
$sqlquery = $mysqli->query("SELECT * FROM items WHERE id=1");
while($row = $sqlquery->fetch_array()) {
$lstoutput[] = $row;
}
//колко броя записи да извади? $lstoutput[0]['broi'];
$labels = calculate_columns($lstoutput[0]['broi'], 4);
if($lstoutput[0]['margin1'] != null) {
$page_much = $labels[0]/20;
$page_number = '0';
for( ; $page_number < $page_much ; $page_number++){
echo '<page size="A4"><table cellpadding="6" style="padding-top: 30px"><tbody>';
$labels_number = 0;
for ($labels_number = 0; $labels_number <= $labels[0]; $labels_number++) {
if ($labels_number %4 === 0) {
echo("</tr>\n<tr style='margin:1px'>");
}
echo '<td style="margin:1px" class="container"><img src="output-onlinepngtools.png" alt="label" style="width:184px;height:224px" /><div class="centered">'.$lstoutput[0]['margin1'].'</div></td>';
}
echo '</tbody></table></page>';
}
}
/*
<page size="A4"></page>
<page size="A4" layout="landscape"></page>
<page size="A5"></page>
<page size="A5" layout="landscape"></page>
<page size="A3"></page>
<page size="A3" layout="landscape"></page>*/
?>
</body>
</html>[/php]

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1574
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Tue Mar 05, 2019 8:58 pm

Но имам един бъг. Например имам 90 броя етикети, чрез функцията calculate_columns (за която помогна колега от туриста) разделям на 4 равни части бройките (например: 22, 24, 22, 22)
В случая , аз имам лимит на страница ДО 20 етикета, а моя код продължава да "натрупва" , как може да се направи когато стигне 20броя , просто да създаде нова страница?

Сега към момента вземам общия брой(например:90 разделям го на 4 и получавам колко страници ми трябват, и започвам да ги пълня)

Явно логиката ми е грешна и трябва първо да вземам колко са бройките след деленето (например: 22, да ги разделя на 4 и да получа 1.1 и да създам 2 страници) и след това да ги запълвам?
Имаш 90 етикета, които разпределяш в страници с по 4 колони по 20 етикета.

[php]$columns = 4;
$column_height = 20;
[/php]
Тогава етикетите за една страница са 4*20 = 80

[php]$labels_per_page = $columns * $column_height;[/php]

А броят страници е броят на всички етикети, разделен на броя етикети на страница, закръглено нагоре: roundUp(90 / 80) = 2

[php]$page_count = $all_labels / $labels_per_page;[/php]

User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Wed Mar 06, 2019 5:39 am

Всъщност са 5 реда , на 4 колони, например:

label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
----- какво трябва да се случи, ако броя етикети е например 22 -------

label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
---- нова страница -------
label | label
---- край -------
----- какво трябва да се случи, ако броя етикети е например 45 -------
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
---- нова страница -------
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
label | label | label | label
---- нова страница -------
label | label | label | label
label
---- край -------



Ако следвам твоята логика, как би трябвало да изглежда?

[php]$columns = 4;
$rows = 5;
$column_height = 20;
[/php]
Тогава етикетите за една страница са 4*5*20 = 400

[php]$labels_per_page = $columns * $rows * $column_height;[/php]

roundUp(90 / 400) = 2

[php]$page_count = $all_labels / $labels_per_page;[/php]

:shock:

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Mar 06, 2019 8:01 am

[php]
$rows = 5;
$columns = 4;

$labels_per_page = $rows * $columns; // 20
[/php]

Ти дава колко най-много искаш на страница.

[php]
$total_labels = 400;
$total_pages = ceil($total_labels / $labels_per_page);

// Резултат: 400 / 20 = 20



$total_labels = 90;
$total_pages = ceil($total_labels / $labels_per_page);

// Резултат: 90 / 20 = 4.5 -> ceil(4.5) = 5 страници
[/php]

Как вече ще си създадеш страницирането, ти си знаеш.

User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Wed Mar 06, 2019 6:55 pm

Опитах и с този вариант , но не успявам да наглася страницирането: Успешно се създават страниците, редовете и колоните, но имам проблем с контролирането на информацията, която трябва да се попълни т.е. общия брой етикети с различната цена.
(24бр - 7.40
(22бр - 6.50
(22бр - 3.90
(22бр - 4.85
----
Общо 5 страници (с 90 етикета)

Code: Select all

<?php
    $ii = 0;
    for&#40;$ii =1; $ii<=2; $ii++&#41;&#123; //създаваме страниците
    echo '<table border="1">';
		$i = 0;
		for&#40;$i =1; $i<=5; $i++&#41;&#123; //създаваме редовете
			echo '<tr>'; //<td><img src="asd" alt="label" /></td>
				$x = 0;
				for&#40;$x=1; $x<=4; $x++&#41;&#123; //създаваме колоните
					$y = $x + $i;
					$z = &#40;$y>5&#41; ? $y-5 &#58; $y;
					echo '<td><img src="output-onlinepngtools.png" width="200px" height="150px" alt="label" /></td>';
				&#125;
			echo '</tr>';
		&#125;
    echo '</table>';
    &#125;
?>


Получавам някакво страшно разминаване между това , което искам и това което е в реалност (играя си от тази сутрин....)

Какво искам:
http://web-tourist.net/userfiles/7/6914.png

Какво е реално:
http://web-tourist.net/userfiles/7/6913.png

Ужас направо.

Code: Select all

<?php
$mysqli = new mysqli&#40;'localhost', 'user', 'pass', 'db'&#41;;
/* check connection */
if &#40;$mysqli->connect_errno&#41; &#123;
   printf&#40;"Connect failed&#58; %s\n", $mysqli->connect_error&#41;;
   exit&#40;&#41;;
&#125;
$mysqli->set_charset&#40;"utf8"&#41;;

/* разделяме на 4 и правиме второто число да компенсира остатъка */
function calculate_columns&#40;int $total, int $size, int $prefer = 1&#41;&#58; array &#123;
    $columns = &#91;&#93;;
    for &#40;$i = 0; $i < $size; $i++&#41; &#123;
        $columns&#91;$i&#93; = floor&#40;$total / $size&#41;;
    &#125;
    $columns&#91;$prefer&#93; += $total - $columns&#91;$prefer&#93; * $size;
    return $columns;
    /*
     Array &#40; 
         &#91;0&#93; => 22 
         &#91;1&#93; => 24 
         &#91;2&#93; => 22 
         &#91;3&#93; => 22 
     &#41; 
     */
&#125;
?><html>
    <head>
        <style>body &#123;
  background&#58; rgb&#40;204,204,204&#41;; 
&#125;
page &#123;
  background&#58; white;
  display&#58; block;
  margin&#58; 0 auto;
  margin-bottom&#58; 0.5cm;
  //box-shadow&#58; 0 0 0.5cm rgba&#40;0,0,0,0.5&#41;;
&#125;
page&#91;size="A4"&#93; &#123;  
  width&#58; 21cm;
  height&#58; 29.7cm; 
&#125;
page&#91;size="A4"&#93;&#91;layout="landscape"&#93; &#123;
  width&#58; 29.7cm;
  height&#58; 21cm;  
&#125;
page&#91;size="A3"&#93; &#123;
  width&#58; 29.7cm;
  height&#58; 42cm;
&#125;
page&#91;size="A3"&#93;&#91;layout="landscape"&#93; &#123;
  width&#58; 42cm;
  height&#58; 29.7cm;  
&#125;
page&#91;size="A5"&#93; &#123;
  width&#58; 14.8cm;
  height&#58; 21cm;
&#125;
page&#91;size="A5"&#93;&#91;layout="landscape"&#93; &#123;
  width&#58; 21cm;
  height&#58; 14.8cm;  
&#125;
@media print &#123;
  body, page &#123;
    margin&#58; 0;
    box-shadow&#58; 0;
  &#125;
&#125;

/* Container holding the image and the text */
.container &#123;
  position&#58; relative;
  text-align&#58; center;
  margin-left&#58;10px;
  color&#58; #000 ;
  font-size&#58;19px !important;
  font-weight&#58; bold; font&#58; arial;
&#125;

/* Centered text */
.centered &#123;
  position&#58; absolute;
  top&#58; 70%;
  left&#58; 50%;
  transform&#58; translate&#40;-50%, -50%&#41;;
  margin-left&#58;6px;

&#125;


.A4 &#123;
  background&#58; white;
  width&#58; 21cm;
  height&#58; 29.7cm;
  display&#58; block;
  margin&#58; 0 auto;
  padding&#58; 10px 25px;
  margin-bottom&#58; 0.5cm;
  box-shadow&#58; 0 0 0.5cm rgba&#40;0, 0, 0, 0.5&#41;;
  overflow-y&#58; scroll;
  box-sizing&#58; border-box;
  font-size&#58; 12pt;
&#125;

@media print &#123;
  .page-break &#123;
    display&#58; block;
    page-break-before&#58; always;
  &#125;
  size&#58; A4 portrait;
&#125;

@media print &#123;
  body &#123;
    margin&#58; 0;
    padding&#58; 0;
  &#125;
  .A4 &#123;
    box-shadow&#58; none;
    margin&#58; 0;
    width&#58; auto;
    height&#58; auto;
  &#125;
  .noprint &#123;
    display&#58; none;
  &#125;
  .enable-print &#123;
    display&#58; block;
  &#125;
&#125;


</style>
<script>
  //window.print&#40;&#41;;
</script>
</head>
<body>
<?php
$lstoutput = array&#40;&#41;;
$sqlquery = $mysqli->query&#40;"SELECT * FROM items WHERE id=1"&#41;;
while&#40;$row = $sqlquery->fetch_array&#40;&#41;&#41; &#123;
    $lstoutput&#91;&#93; = $row;
&#125;
$rows = 5;
$columns = 4;
$labels_per_page = $rows * $columns; // 20
$total_labels = $lstoutput&#91;0&#93;&#91;'broi'&#93;;
$total_pages = ceil&#40;$total_labels / $labels_per_page&#41;; 
// Резултат&#58; 90 / 20 = 4.5 -> ceil&#40;4.5&#41; = 5 страници

    $labels = calculate_columns&#40;$lstoutput&#91;0&#93;&#91;'broi'&#93;, 4&#41;;
        $page_number = '0';
        for&#40;; $page_number < $total_pages ; $page_number++&#41;&#123; //създаваме нужното количество страници
            echo '<page size="A4"><table cellpadding="6" style="padding-top&#58; 30px"><tbody>';
            if&#40;$lstoutput&#91;0&#93;&#91;'price1'&#93; != null&#41; &#123; //вземаме първата цена
                $labels_number = 0;
                for &#40;$labels_number = 0; $labels_number <= $labels&#91;0&#93;; $labels_number++&#41; &#123;
                    if &#40;$labels_number %4 === 0&#41; &#123;
                        echo&#40;"</tr>\n<tr style='margin&#58;1px'>"&#41;;
                    &#125;
                    echo '<td style="margin&#58;1px" class="container"><img src="label.png" alt="label" style="border&#58;1px solid #333;width&#58;184px;height&#58;184px" /><div class="centered">'.$lstoutput&#91;0&#93;&#91;'price1'&#93;.'</div></td>';
                &#125;
            &#125;
            if&#40;$lstoutput&#91;0&#93;&#91;'price2'&#93; != null&#41; &#123; //вземаме втората цена
                $labels_number = 0;
                for &#40;$labels_number = 0; $labels_number <= $labels&#91;1&#93;; $labels_number++&#41; &#123;
                    if &#40;$labels_number %4 === 0&#41; &#123;
                        echo&#40;"</tr>\n<tr style='margin&#58;1px'>"&#41;;
                    &#125;
                    echo '<td style="margin&#58;1px" class="container"><img src="label.png" alt="label" style="border&#58;1px solid #333;width&#58;184px;height&#58;184px" /><div class="centered">'.$lstoutput&#91;0&#93;&#91;'price2'&#93;.'</div></td>';
                &#125;
            &#125;
            echo '</tbody></table></page>';
        &#125;
?>
    </body>
</html>

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed Mar 06, 2019 9:31 pm

Голямо мазало. Трудно може да се проследи кода.

На първо четене, в кода ти няма никакво странициране. Ако извеждаш нещата от базата данни използвай LIMIT клазуата и задавай офсет + по колко записа на страница да са:

[sql]
SELECT ... FROM ... WHERE ... LIMIT $offset, $perPage
[/sql]

Офсета ти се пресмята:

[php]
$perPage = $rows * $columns; // според твоя код 20


$currentPage= $_GET['page']; // 1

$offset = ($currentPage * $perPage) - $perPage;
// (1 * 20) - 20 = 0

// SQL: SELECT ... FROM ... WHERE ... LIMIT $offset, $perPage;
// При зададения офсет се взима записа "офсета + 1".
// Т.е. при офсет 0, започваш от запис 1 (който е върнат от заявката)

$currentPage= $_GET['page']; // 2

$offset = ($currentPage * $perPage) - $perPage;
// (2 * 20) - 20 = 20
// При заявка с офсет 20, ще ти изкара записите от 21 нататък
[/php]

Това, което се иска от теб е да си създадеш списъка с броя страници, които са ти нужни (пресметнато), да подадеш линк със зададен параметър за пореден номер на страница (да речем: ?page=1, ?page=2) и според тези данни просто пре-пресмятай какво е нужно да върнеш.

Разгледай в интернет как се прави странициране и внимавай с него.

User avatar
Ticketa
Турист
Турист
Posts: 481
Joined: Mon Feb 27, 2012 1:54 pm
Answers: 23
Location: in /root
Contact:

Post by Ticketa » Thu Mar 07, 2019 7:44 pm

Това , което исках е да имитирам PDF файл , а не да създам странициране , поне не от типа на ?page= (което го умея) Благодаря.

Направих го по следния начин и работи:

[php]<?php
$mysqli = new mysqli('localhost', 'USER', 'PASS', 'DB');
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$mysqli->set_charset("utf8");

/* разделяме на 4 и правиме второто число да компенсира остатъка */
function calculate_columns(int $total, int $size, int $prefer = 1): array {
$columns = [];
for ($i = 0; $i < $size; $i++) {
$columns[$i] = floor($total / $size);
}
$columns[$prefer] += $total - $columns[$prefer] * $size;
return $columns;
/*
Array (
[0] => 22
[1] => 24
[2] => 22
[3] => 22
)
*/
}
?><html>
<head>
<style>body {
background: rgb(204,204,204);
}
page {
background: white;
display: block;
margin: 0 auto;
margin-bottom: 0.5cm;
//box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
page[size="A4"] {
width: 22cm;
height: 30.7cm;
}
page[size="A4"][layout="landscape"] {
width: 30.7cm;
height: 22cm;
}
page[size="A3"] {
width: 30.7cm;
height: 42cm;
}
page[size="A3"][layout="landscape"] {
width: 42cm;
height: 30.7cm;
}
page[size="A5"] {
width: 14.8cm;
height: 22cm;
}
page[size="A5"][layout="landscape"] {
width: 22cm;
height: 14.8cm;
}
@media print {
body, page {
margin: 0;
box-shadow: 0;
}
}

/* Container holding the image and the text */
.container {
position: relative;
text-align: center;
margin-left:12px;
color: #000 ;
font-size:19px !important;
font-weight: bold; font: arial;
}

/* Centered text */
.centered {
position: absolute;
top: 70%;
left: 50%;
transform: translate(-50%, -50%);
margin-left:8px;

}



</style>
<script>
//window.print();
</script>
</head>
<body>
<?php
$nID = isset($_GET['NID']) ? (int)$_GET['NID'] : 0;
$lstoutput = array();
$sqlquery = $mysqli->query("SELECT * FROM items WHERE id=".$nID."");
while($row = $sqlquery->fetch_array()) {
$lstoutput[] = $row;
}
//колко броя записи да извади? $lstoutput[0]['broi'];
$labels = calculate_columns($lstoutput[0]['broi'], 4);

echo '<page size="A4"><table cellpadding="5"><tbody>';
$labels_number = 0; //създаваме първа страница

for ($labels_number = 1; $labels_number <= $lstoutput[0]['broi']; $labels_number++) { //създаваме масив с общия брой етикети
if($labels[0] >= $labels_number) { //създаваме първата цена с нужното количество етикети
$price = $lstoutput[0]['margin1'];
} elseif ($labels[0]+$labels[1] >= $labels_number) { //втора цена
$price = $lstoutput[0]['margin2'];
}elseif ($labels[0]+$labels[1]+$labels[2] >= $labels_number) { //трета цена
$price = $lstoutput[0]['margin3'];
}elseif ($labels[0]+$labels[1]+$labels[2]+$labels[3] >= $labels_number) { //четвърта цена
$price = $lstoutput[0]['margin4'];
}
if ($labels_number %4 == 1) { //при четири етикета на ред създаваме нов ред
echo("</tr><tr style='margin:1px'>");
}
echo '<td style="margin:1px" class="container"><img src="output-onlinepngtools.png" alt="label" style="width:195px;height:215px" /><div class="centered">'.$price.'</div></td>';
if ($labels_number %20 == 0) { //при двайсе(20) етикета създаваме нова страница
echo('</tbody></table></page><page size="A4"><table cellpadding="5"><tbody>');
}
}



echo '</tbody></table></page>';
?>
</body>
</html>[/php]



Все пак, ако някой има предложение как мога да го конвертирам HTML -> към -> PDF без да се развали CSS-а ще е супер.

Този сайт има API (https://pdfcrowd.com/#convert_by_url) , за просто един два файла върши работа, иначе е платено - а щом този сайт може да ми "запамети" CSS - значи е възможно да се конвертира без разваляне на структурата.


Оставам отворена темата, ако някой може да предложи по-добър вариант или съвет относно така създадения код.

Също е оставам отворена , ако някой има идея как да създам HTML 2 PDF , но в състояние с работещ CSS

I thank everyone for the help so far!

Post Reply