如何从生成的 pdf table 中复制文本?

how to copy the texts from a generated pdf table?

我用的是itext7,创建table的代码非常简单:

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

我创建了两个 tables,唯一的区别是:table1 中的头部是换行符 "\n":

到这里没问题。但是我的问题是,当我尝试 select 并从生成的 PDF 文件中复制 tables 并粘贴到 MS-Word 时,我得到了不同的结果:table1 的头部是按垂直顺序复制:

.

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

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?

您认为 table 内容通常可以按照 table 结构从 PDF 复制和粘贴的假设是错误的。

在 PDF 中绘制您的 table 1 的说明是:

  • 在 38.5、790.83 绘制 "head"
  • 在 38.5、772.85 画“1”
  • 在 113.5、790.83 绘制 "head"
  • 在 113.5, 772.85 画“2”
  • 在 188.5、790.83 绘制 "head"
  • 在 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 绘制 "column 1"
  • 在 113.5、749.87 绘制 "column 2"
  • 在 188.5、749.87 绘制 "column 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

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


不过,

PDF 具有 选项 ,可以用 HTML 左右的指示符标记绘图说明。使用 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

作为一个实际的单词 table。


不幸的是,仍然存在一些小问题,例如"head" 和数字之间的 space 消失了。我不确定谁应该受到指责,iText、Adobe Reader 或 Word。


PS: 在 "head" 和数字 之间 消失 space 的故障似乎已在 iText 开发版本 7.0.2-SNA 中得到修复PS1 月 27 日签到热