2

I used itext7, the code for creating the tables are very simple:

    float[] tableWidth = {75, 75, 75};

    Table table1 = new Table(tableWidth);
    table1.addHeaderCell("head \n1");
    table1.addHeaderCell("head \n2");
    table1.addHeaderCell("head \n3");
    table1.addCell("column 1");
    table1.addCell("column 2");
    table1.addCell("column 3");

    Table table2 = new Table(tableWidth);
    table2.addHeaderCell("head 1");
    table2.addHeaderCell("head 2");
    table2.addHeaderCell("head 3");
    table2.addCell("column 1");
    table2.addCell("column 2");
    table2.addCell("column 3");

    document.add(table1);
    document.add(new Paragraph("\n"));
    document.add(table2);

I created two tables, only difference: head in table1 is with new line "\n":

Till here not any problem. But my question is when I tried to select and copy the tables from the generated PDF file and paste to MS-Word for example, I got different result: head of table1 is copied in vertical sequence:

.

As in my pratical code, I have to use "\n" in the table head, with this the table was then not able to be copy-pasted correctly, any clue?

4

1 回答 1

0

在我的实用代码中,我必须在表头中使用“\n”,这样表就无法正确复制粘贴,有什么线索吗?

您认为一般可以以尊重表格结构的方式从 PDF 复制和粘贴表格内容的假设是错误的。

在 PDF 中,绘制表格 1 的说明是:

  • 在 38.5, 790.83 处画“头”
  • 在 38.5、772.85 处绘制“1”
  • 在 113.5、790.83 处画“头”
  • 在 113.5、772.85 处绘制“2”
  • 在 188.5、790.83 处画“头”
  • 在 188.5、772.85 处画“3”
  • 从 35.75、806 到 261.25、806 画线
  • 从 35.75、765.04 到 261.25、765.04 画线
  • 画线从 36, 806 到 36, 765.04
  • 从 111, 806 画线到 111, 765.04
  • 从 186、806 画线到 186、765.04
  • 从 261、806 画线到 261、765.04
  • 在 38.5, 749.87 处绘制“第 1 列”
  • 在 113.5, 749.87 处绘制“第 2 列”
  • 在 188.5、749.87 处绘制“第 3 列”
  • 从 35.75、765.04 到 261.25、765.04 画线
  • 从 35.75、742.05 到 261.25、742.05 画线
  • 从 36, 765.04 到 36, 742.05 画线
  • 从 111, 765.04 到 111, 742.05 画线
  • 从 186, 765.04 到 186, 742.05 画线
  • 从 261、765.04 到 261、742.05 画线

因此,不再有直接的迹象表明有一张桌子。因此,一个简单的文本提取机制会继续并在绘制字符串时提取它们,每当y坐标发生变化时插入一个换行符,而不区分它是上升还是下降。结果就是你观察到的。


不过, PDF 可以选择用 HTML'ish 指示符标记绘图说明。使用 iText 7,您可以激活PdfDocument实例中的标记机制:

PdfDocument pdfDocument = new PdfDocument(pdfWriter);
pdfDocument.setTagged();
Document document = new Document(pdfDocument);
...

(摘自TablesToCopyAndPasteFrom.java

现在您的 table1 像这样复制并粘贴到 Word

 head1      head2       head3
column 1    column 2    column 3

作为一个实际的 Word 表。


不幸的是,仍然有一些小故障,例如“头部”和数字之间的空格消失了。我不确定是谁的错,iText、Adobe Reader 还是 Word。


PS:在 1 月 27 日签到的 iText 开发版本 7.0.2-SNAPSHOT 中,“head”和数字之间的空格消失的故障似乎已修复。

于 2016-08-16T08:09:04.633 回答