【问题标题】:Border not aligned properly in PDF [Snippet attached]PDF 中的边框未正确对齐 [附加片段]
【发布时间】:2021-06-10 09:31:42
【问题描述】:

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

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`);
    });
  };

完整的工作示例:

谁能虚心帮我实现让边框与整个页面正确对齐的结果? 如果需要将使用的库更改为其他替代方案,也可以..

要求:

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

【问题讨论】:

  • 我的建议是,您需要使用 doc.rect 方法手动进行布局,您可以使用在线编辑器来帮助您的工作mrrio.github.io/jsPDF

标签: javascript reactjs pdf jspdf html2canvas


【解决方案1】:

我检查了您的代码框,看来您已经应用了@Ihsan 的解决方案,但在该解决方案的基础上,我发现jsPDF 有一个fromHMTL 函数,因此您可以先跳过对画布的渲染。

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`);
};

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

编辑

您可以绘制一个矩形并对其进行描边以创建外边框,而不是一堆矩形,然后使用一条线填充水平“条”。 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。

【讨论】:

  • 感谢您提供示例兄弟的解决方案。但要求是在这个特定的 pdf 页面中,您放置的内容将作为标题,因此内容会有所不同(可能是公司徽标带有公司名称)...而您放在顶部的主要内容将在边框线之后(在顶部框中标题的边框之后)..希望您能得到我的要求..如果我也可以提供更多详细信息需要超过要求..
  • 问题我最后附上了一个截图,右边的页码将作为实际应用程序中的标题,在该部分和边框之后,将放置主要内容..
  • @Undefined 调整将 dom 元素附加到文档 (doc.fromHTML(domElement, 10, 5);) 时使用的坐标真的很简单,只需在 y 坐标上添加更多内容,将其向下移动到标题所在的位置下方占据。或者,您可以将标头包含在要发送到 PDF 的 JSX 中。
  • 谢谢你的帮助兄弟。现在我明白了你的意思,谢谢你的帮助..
  • 嗨,兄弟,我在这里添加了页眉和页脚codesandbox.io/s/…,但这次我出错了。你能帮我解释一下原因吗?我已经搜索了很多解决方案,但找不到正确的解决方案..
【解决方案2】:

根据我的评论,这是您可以用来设置 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)

【讨论】:

猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多