İçeriğe geç
getnextpdf.com

Üst bilgiler, alt bilgiler ve çok sayfalı belgeler

Tek bir sayfa nadiren yeterli olur. Bu eğitimde, kendi kendine üç sayfaya büyüyen bir belge yazarsınız. Ayrıca her sayfaya tekrar eden bir üst bilgi ve sayfa numarasını gösteren bir alt bilgi eklersiniz.

Tek bir betik yazacaksınız: 01-multipage.php. Bu betik, üç sayfalık bir seyahat günlüğünü PDF (Portable Document Format) dosyası olarak üretir:

  • Günlük girişleri sayfadan sayfaya otomatik olarak akar. Bir sayfanın nerede biteceğini asla siz belirtmezsiniz; buna motor karar verir.
  • Üst bilgi, bir sayfanın üstünde yer alan ve her sayfada tekrar eden bir şerittir. Sizinki belge başlığını gösterir.
  • Alt bilgi, sayfanın altında yer alan, buna karşılık gelen şerittir. Sizinki sayfa numarasını 1 / 3, 2 / 3 ve 3 / 3 şeklinde gösterir.

Her şey yalnızca nextpdf/core paketiyle çalışır: yazı tipi dosyası yok, ek uzantı yok ve ağ bağlantısı yok.

Bu betikteki tüm işi iki fikir yapar.

Birincisi otomatik sayfa sonudur. Motor metni yazarken bir imleç izler: sayfada bir sonraki satırın yerleşeceği nokta. setAutoPageBreak(true, margin: 25), motora bu imleci izlemesini söyler. İmleç alt kenara 25 punto (yaklaşık bir inçin üçte biri) kaldığında motor sayfayı kapatır ve yenisini başlatır.

İkincisi sayfa mobilyasıdır: üst bilgi ve alt bilgi. Bunları ilk sayfadan önce bir kez tanımlarsınız. setHeaderData(), üstteki şerit için başlığı ve kısa bir açıklamayı kaydeder. Yazı tipi ve kenar boşluğu çağrıları, harfleri ve sayfa kenarına olan uzaklığı seçer. Motor daha sonra bu mobilyayı, kendi eklediği sayfalar dahil olmak üzere oluşturduğu her sayfaya çizer.

Proje klasörünüzde 01-multipage.php dosyasını oluşturun:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// Make sure the output folder exists next to this script.
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('NextPDF Travel Journal');
// Configure the header and footer BEFORE the first page.
// The engine repeats them on every page for you.
$document->setHeaderData(title: 'NextPDF Travel Journal', description: 'A multi-page tutorial document');
$document->setHeaderFont('helvetica', 10);
$document->setHeaderMargin(5);
$document->setFooterFont('helvetica', 8);
$document->setFooterMargin(10);
// Turn on automatic page breaks. When the text cursor gets within
// 25 points of the bottom edge, the engine starts a new page.
$document->setAutoPageBreak(true, margin: 25);
$document->addPage();
$document->setFont('helvetica', 'B', 18);
$document->cell(0, 12, 'Travel journal: three days on the coast', newLine: true);
$document->ln(5);
$days = [
1 => 'We followed the shoreline north and counted seventeen lighthouses.',
2 => 'Rain moved in before noon, so we sketched the harbor from a cafe window.',
3 => 'On the last morning the fog lifted and the whole bay turned silver.',
];
foreach ($days as $day => $highlight) {
$document->setFont('helvetica', 'B', 14);
$document->cell(0, 10, "Day {$day}", newLine: true);
$document->setFont('helvetica', '', 11);
for ($entry = 1; $entry <= 12; $entry++) {
$text = "Entry {$entry} of day {$day}. {$highlight} "
. 'The trail hugged the cliffs for most of the afternoon, and every '
. 'turn opened another view of the water. We stopped often to take '
. 'notes, compare maps, and argue happily about where to eat dinner. '
. 'By the time we reached the guesthouse, our boots were soaked and '
. 'our notebooks were full.';
$document->multiCell(0, 7, $text);
$document->ln(3);
}
$document->ln(5);
}
// Ask the engine how many pages the layout produced, then save.
$pages = $document->getNumPages();
$document->save(__DIR__ . '/out/travel-journal.pdf');
echo "Wrote out/travel-journal.pdf with {$pages} pages\n";

Bunu php 01-multipage.php ile çalıştırın. Betik tek bir satır yazdırır:

Wrote out/travel-journal.pdf with 3 pages

out/travel-journal.pdf dosyasını açın ve baştan sona kaydırın. Başlık şeridi üç sayfanın da üstünde yer alır ve sayfa numaraları sağ altta giderek artar.

Yazma döngüsü sayfalardan hiç söz etmez. Her gün başlığını, görünmez bir kutuya tek bir satır yerleştiren cell() ile yazar. Girişleri ise uzun metni gerektiği kadar satıra saran multiCell() ile yazar. Otuz altı giriş tek bir sayfaya sığmadığından otomatik sayfa sonu iki kez tetiklenir. Günlük işte böyle tam olarak üç sayfaya ulaşır.

Üst bilgi ve alt bilgi, ilk addPage() çağrısından önce yapılandırıldı. Bu sıra önemlidir: zaten çizilmiş olan bir sayfa sonradan güncellenmez. Önce mobilyayı yapılandırın; böylece her sayfa tutarlı çıkar.

Sayfa numarasını hiç siz çizmediniz. Alt bilgi bunu varsayılan olarak yazdırır; siz yalnızca yazı tipini ve sayfa kenarına olan uzaklığını seçtiniz. Motor sayfaları yazarken son sayıyı henüz bilemez. Bu nedenle her alt bilgiye bir yer tutucu bırakır ve gerçek toplamı, siz kaydettiğinizde doldurur.

İki küçük ayrıntı betiği tamamlar. @mkdir, out klasörünü oluşturur ve @ işareti, klasör zaten mevcut olduğunda PHP’yi sessiz tutar. getNumPages(), düzenin kaç sayfa ürettiğini motora sorar; böylece son mesaj gerçek sayıyı bildirebilir.

  • require satırındaki bir “failed to open stream” hatası, betiğin vendor/autoload.php dosyasını bulamadığı anlamına gelir. Betiği, vendor/ klasörünü içeren proje klasörünün içinde çalıştırın.
  • Her şey tek bir sayfada duruyor ve metnin sonu kesiliyor mu? O hâlde otomatik sayfa sonları kapalıdır. setAutoPageBreak(true, margin: 25) satırını koruyun ve onu yazma döngüsünün üstünde tutun.
  • Yanlış yazılmış bir yazı tipi ailesi, bulamadığı yazı tipini adıyla belirten bir istisna fırlatır. helvetica yazımını kontrol edin ve daha derin yazı tipi sorunları için Yazı tipleri ve etiketleme sayfasına bakın.
  • Diğer her şey için, sorun giderme merkezi belirtileri nedenlerle eşleştirir ve hata başvurusu motorun genel istisnalarını ve her birinden nasıl kurtulacağınızı açıklar.

Belgeleriniz artık istediğiniz uzunluğa büyüyebilir ve yine de tamamlanmış görünür. Sonraki eğitimde içeriğinizi HTML (Hypertext Markup Language) ile yazarsınız ve motorun bunu sayfalara dönüştürmesine izin verirsiniz.

Bugünkü konular üzerinde daha ince denetim istediğinizde, iki tarif daha derine iner: