我正在使用 PDFLib(這個庫
我知道最簡單的解決方案是使用表格,但我不能,因為 PDF 必須是可訪問的,他們告訴我,在 PDF 上,無法訪問顯示名稱-值 paris 的表格,所以我必須找到另一個解決方案而不是 table。
目前我嘗試使用 Textflow:
<?php
$upperX = 525;
$upperY = 780;
$lowerX = 70;
$lowerY = 50;
$y = $upperY;
$x = 70;
$pdf = new \PDFlib();
$pdf->begin_document('', '');
$pdf->begin_page_ext(0, 0, 'width=a4.width height=a4.height');
// Write "Name-Value paris:"
$optlist = "fontname={Helvetica} fontsize=8 encoding=utf8 alignment=center fakebold=true";
$tf = 0;
$tf = $pdf->add_textflow($tf, "Name-Value paris:", $optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);
$y -= 10;
// Write the pairs
$label_optlist = "fontname={Helvetica} fontsize=7 encoding=utf8 fakebold=true leftindent=0%";
$value_optlist = "fontname={Helvetica} fontsize=7 encoding=utf8 fakebold=false leftindent=22%";
$tf = 0;
$tf = $pdf->add_textflow($tf, "Name:", $label_optlist);
$tf = $pdf->add_textflow($tf, "John", $value_optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);
$y = $pdf->get_option('texty', ''); // Get Y where the above textflow ends
$tf = 0;
$tf = $pdf->add_textflow($tf, "Surname:", $label_optlist);
$tf = $pdf->add_textflow($tf, "Doe", $value_optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);
$y = $pdf->get_option('texty', '');
$tf = 0;
$tf = $pdf->add_textflow($tf, "Date of birth:", $label_optlist);
$tf = $pdf->add_textflow($tf, "2022/11/08", $value_optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);
$y = $pdf->get_option('texty', '');
$tf = 0;
$tf = $pdf->add_textflow($tf, "A key that has a long value:", $label_optlist);
$tf = $pdf->add_textflow($tf, "A very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long value", $value_optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);
$pdf->end_page_ext('');
$pdf->end_document('');
return $pdf->get_buffer();
它正在作業,但正如你所看到的,在 optlist 中,我把leftindent=0%
和leftindent=22%
問題是如果一個鍵更長,我將不得不手動增加“leftindent”,否則它不會與其他對對齊。此外,如果鍵是動態的,所以我不知道它們的長度怎么辦?我不知道有多少“左縮進”。
是否有使用 PDFLib 列印名稱值 paris 的更清潔和更好的方法?
uj5u.com熱心網友回復:
我知道最簡單的解決方案是使用表格,但我不能,因為 PDF 必須是可訪問的,他們告訴我
誰說的?這個說法現在有點太籠統了。此外,您的內容無法以任何方式訪問,因為您只能通過 Tagged PDF 在 PDF 中實作這一點。
PDFlib 可用于創建可用于創建可訪問的 PDF 的 PDF/UA(即標記的 PDF)。
最簡單的方法是遵循 PDFlib 10 Coobkook 示例
關于嵌入:您必須在 SearchPath 中提供字體檔案,因為 PDFlib 在運行時需要字體資料。請參閱PDFlib 10 教程第 3.1.4 章和第 6.3.4 章“搜索字體”。在提供的 PDFlib 示例中,SearchPath 設定為“ ../data”,您可以在其中找到示例中所需的資源。你可能想在那里睡覺。
回到表和accessibiltiy:
通常,已經可以創建沒有標題的表,但這將在可訪問性檢查中被標記。根據主題的重要性,您應該相應地實施該表。另一方面,您的輸出目前也無法訪問,因此如果您將所有內容都放在一個表格中,您將有更輕松的時間。我附上了一個非常簡單的 PDF/UA 表,它是使用以下代碼創建的。也許您可以更準確地識別您的問題。

<?php
/*
*
* Demonstrate automatic table tagging
*
* required software: PDFlib/PDFlib PDI/PPS 10
* required data: image file (dummy text created within the program)
*/
/* This is where the data files are. Adjust as necessary. */
$searchpath = dirname(__FILE__,3)."/input";
$title = "table_pdfua1";
$p = null;
try {
$p = new pdflib();
$tf = 0;
$tbl = 0;
$rowmax = 5;
$colmax = 5;
$llx = 50; $lly = 50; $urx = 550; $ury = 700;
/* Dummy text for filling a cell with multi-line Textflow */
$tf_text =
"Sample text created with the Textflow feature in order to " .
"create multiline content within a table cell.";
/*
* Set the search path for fonts and images etc.
*/
$p->set_option(
"errorpolicy=exception SearchPath={" . $searchpath . "}");
if ($p->begin_document("",
"pdfua=PDF/UA-1 lang=en tag={tagname=Document}") == 0)
throw new Exception("Error: " . $p->get_errmsg());
$p->set_info("Creator", "PDFlib Cookbook");
$p->set_info("Title", $title);
/* Automatically create spaces between chunks of text */
$p->set_option("autospace=true charref");
/* -------------------- Add table cells -------------------- */
$row = 1;
$col = 1;
for ($row; $row <= $rowmax; $row ) {
/* ----- Simple text cell */
$col = 1;
$optlist = "colwidth = 100 fittextline={fontname=NotoSerif-Bold fontsize=10 position={left top}} margin=5";
$tbl = $p->add_table_cell($tbl, $col, $row, "text " . $row, $optlist);
/* ----- Multi-line text with Textflow */
$col ;
$optlist = "fontname=NotoSerif-Regular fontsize=10";
$tf = $p->add_textflow(0, $tf_text, $optlist);
$optlist = "colwidth=300 rowheight=8 margin=5 textflow=" . $tf . " fittextflow={firstlinedist=capheight}";
$tbl = $p->add_table_cell($tbl, $col, $row, "", $optlist);
}
/* ---------- Place the table on one or more pages ---------- */
/*
* Loop until all of the table is placed; create new pages as long
* as more table instances need to be placed.
*/
do {
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
$p->create_bookmark("Tagged table demo", "");
$p->fit_textline("Name-Value pairs", 50, 750,
"fontname=NotoSerif-Regular " .
"fontsize=16 tag={tagname=H1}");
/*
* Shade every other $row; draw lines for all table cells. Add
* "showcells showborder" to visualize cell borders
*/
$optlist = "tag={tagname=Table Summary={key value tablese}} ";
/* Place the table instance */
$result = $p->fit_table($tbl, $llx, $lly, $urx, $ury, $optlist);
if ($result == "_error")
throw new Exception("Couldn't place table : "
. $p->get_errmsg());
$p->end_page_ext("");
}
while ($result == "_boxfull");
/* Check the $result; "_stop" means all is ok. */
if (!$result == "_stop") {
if ($result == "_error") {
throw new Exception("Error when placing table: "
. $p->get_errmsg());
}
else {
/*
* Any other return value is a user exit caused by the
* "return" option; this requires dedicated code to deal
* with.
*/
throw new Exception("User return found in Textflow");
}
}
/* This will also delete Textflow handles used in the table */
$p->delete_table($tbl, "");
$p->end_document("");
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=" . $title . ".pdf");
print $buf;
}
catch (PDFlibException $e) {
echo("PDFlib exception occurred in" . $title . "sample:\n" .
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
$e->get_errmsg() . "\n");
exit(1);
}
catch (Throwable $e) {
echo($e);
exit(1);
}
$p = 0;
?>
此示例改編自 PDFlib Cookbook“ pdfua/table_pdfua1 ”。
但是,我懷疑可訪問性問題對您來說不是一個真正的問題,因此您可以簡單地使用 PDFlib 表來實作整個事情。只需詢問該人表格和可訪問性問題是什么。因為如果真正的 Tagged PDF (PDF/UA) 不是問題,那么很多事情都會變得更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532121.html
下一篇:將文本元素添加到路徑元素的中心
