2

テーブルを作成するためのコードは非常に単純です。

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

2 つのテーブルを作成しましたが、唯一の違いは、テーブル 1 の先頭に改行 "\n" があることです。

ここまでは問題ありません。しかし、私の質問は、たとえば、生成された PDF ファイルからテーブルを選択してコピーし、MS-Word に貼り付けようとしたときに、別の結果が得られたということです。table1 のヘッドが垂直方向にコピーされます。

.

私の実用的なコードのように、テーブル ヘッドで「\n」を使用する必要があります。これにより、テーブルを正しくコピー アンド ペーストできませんでした。手がかりはありますか?

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 風の標識をタグ付けするオプションがあります。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 で修正されたようです。

于 2016-08-16T08:09:04.633 に答える