PDF 中的边框未正确对齐 [附上代码片段]

Border not aligned properly in PDF [Snippet attached]

我正在制作一个非常简单的 React 应用程序,内容非常少。

index.js:

<div className="App">
  <div id="printable-div">
    <h1>Generate PDF</h1>
    <p>Create a screenshot from the page, and put it in a PDF file.</p>
    <p style={{ color: "red" }}>
      *Open this page in new window and press the button.
    </p>
  </div>
  <br />
  <button id="print" onClick={printPDF}>
    PRINT
  </button>
</div>

此处将打印 ID 为 printable-div 的 div。

这个我也申请了一个css,

#printable-div {
  border: 2px solid #000;
  padding: 20px;
}

但是当点击按钮时,会下载 pdf,而在打开 pdf 文件时,边框没有正确对齐。

同样在这里,订单需要到页面,但它仅适用于 div。

使用的库:

-> jsPdf

-> html2canvas

点击打印按钮时执行的代码如下,

  const printPDF = () => {
    const domElement = document.getElementById("printable-div");
    html2canvas(domElement).then((canvas) => {
      const imgData = canvas.toDataURL("image/png");
      const pdf = new jsPdf();
      pdf.addImage(imgData, "JPEG", 0, 0);
      pdf.save(`${new Date().toISOString()}.pdf`);
    });
  };

完整的工作示例:

谁能虚心帮我实现让边框和整个页面正确对齐的效果? 如果使用的库需要换成其他的也没关系..

要求:

整个页面需要有可见的边框,所有边间距相等,内容需要在边框内..

根据我的评论,这是您可以用来设置 pdf 布局的示例。你可以在在线编辑器上试试

var doc = new jsPDF();

  doc.setFillColor("#000000")
  doc.rect(5, 5, 200, 0.3)
  doc.rect(5, 5, 0.3, 285)
  doc.rect(5, 290, 200, 0.3)
  doc.rect(5, 30, 200, 0.3)
  doc.rect(205, 5, 0.3, 285)

我检查了你的 codesandbox,你似乎已经应用了@Ihsan 的解决方案,但为了构建该解决方案,我发现 jsPDF 有一个 fromHMTL 函数,所以你可以跳过渲染到第一个canvas.

const printPDF = () => {
  const domElement = document.getElementById("printable-div");
  const doc = new jsPdf();
  doc.fromHTML(domElement, 10, 5); // position within rectangle
  doc.rect(5, 5, 200, 0.3);
  doc.rect(5, 5, 0.3, 285);
  doc.rect(5, 290, 200, 0.3);
  // doc.rect(5, 30, 200, 0.3); // this is the "middle" horizontal bar
  doc.rect(205, 5, 0.3, 285);
  doc.save(`${new Date().toISOString()}.pdf`);
};

我注释掉了中间的水平条,因为这个条的垂直位置只需要根据您 want/need 的位置进行调整。

编辑

您可以绘制一个矩形并对其进行描边以创建外边框,而不是一堆矩形,然后使用一条线填充水平“条”。 IMO 这读起来更清晰一些。

const printPDF = () => {
  const domElement = document.getElementById("printable-div");
  const doc = new jsPdf();

  // Create border
  doc.rect(5, 5, 200, 285, "S").line(5, 45, 205, 45, "S");

  // Inject HTML
  doc.fromHTML(domElement, 10, 5);

  // Save out to PDF
  doc.save(`${new Date().toISOString()}.pdf`);
};

公平地说,我认为 Ihsan 应该得到大部分的功劳,因为这基本上是他们的答案,我只是通过不同的方式获得了那里的内容,并定位了复制的 HTML.