【问题标题】:how to copy the texts from a generated pdf table?如何从生成的 pdf 表中复制文本?
【发布时间】:2016-08-05 08:05:29
【问题描述】:

我用的是itext7,创建表格的代码很简单:

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

我创建了两个表,唯一不同的是:table1 中的 head 是换行符“\n”:

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

.

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

【问题讨论】:

    标签: itext7


    【解决方案1】:

    在我的实用代码中,我必须在表头中使用“\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:“头部”和数字之间的空格消失的故障似乎已在 iText 开发版本 7.0.2-SNAPSHOT 中修复 - 1月27日ins。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多