如何从生成的 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 日签到热
我用的是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 日签到热