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

时间:2016-08-05 08:05:29

标签: itext7

我使用了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”,这样表格就无法正确复制粘贴,任何线索?

1 个答案:

答案 0 :(得分:0)

  

在我的实用代码中,我必须使用" \ n"在表头中,这个表格无法正确复制粘贴,任何线索?

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

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

  • 画"头"在38.5,790.83
  • 画" 1"在38.5,772.85
  • 画"头"在113.5,790.83
  • 画" 2"在113.5,772.85
  • 画"头"在188.5,790.83
  • 画" 3"在188.5,772.85
  • 从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
  • 画线
  • 绘制"第1列和第34列;在38.5,749.87
  • 画出"第2栏和第34页;在113.5,749.87
  • 绘制"第3列和第34列;在188.5,749.87
  • 从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表。

不幸的是,仍有一些小故障,例如" head"之间的空间这个数字消失了。我不确定应该责怪谁,iText,Adobe Reader或Word。

PS:" head"之间消失空间的故障1月27日在办理登机手续时,iText开发版本7.0.2-SNAPSHOT中的数字已经修复。