1

iText 7 でかなり奇妙な問題に遭遇しました。他の人が過去に対処したことを願っています。基本的には、一連の Link オブジェクトを Paragraph オブジェクトに追加してから、その Paragraph を Canvas オブジェクトにドロップすることで、目次を作成しようとしています。簡略化されたコードのサンプルを次に示します。

    PdfCanvas pdfCanvas = new PdfCanvas(document.getPdfDocument().addNewPage());
    Rectangle rectangle = new Rectangle(36, 650, 100, 100);
    pdfCanvas.rectangle(rectangle);
    pdfCanvas.stroke();
    Canvas canvas = new Canvas(pdfCanvas, document.getPdfDocument(), rectangle);
    canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com"))));

ご覧のとおり、これはかなり骨の折れる作業です。ただし、これを行うと、null ポインター例外が発生します。問題なく簡単なテキストを追加できますが、リンクを追加した瞬間、事態は混乱します。どんな助けでも大歓迎です。

4

1 に答える 1

4

これは、上に長方形 (またはこの場合は正方形) を描く方法ですPdfCanvas

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfPage page = pdf.addNewPage();
PdfCanvas pdfCanvas = new PdfCanvas(page);
Rectangle rectangle = new Rectangle(36, 650, 100, 100);
pdfCanvas.rectangle(rectangle);
pdfCanvas.stroke();
pdf.close();

Documentオブジェクトは必要ありません。を作成し、左下隅が 100 x 100 ユーザー ユニットPdfCanvasの長方形を描画します。x = 36; y = 360

Documentも作成したいので、オブジェクトを導入しますLink。それも必要ありません。これを試すことができます(しかし、それは間違っているでしょう):

Canvas canvas = new Canvas(pdfCanvas, pdf, rectangle);
canvas.add(new Paragraph().add("Google"));
canvas.add(new Paragraph(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com"))));
pdf.close();

ご覧のとおり、pdf(a PdfDocument) とpdf単独で作業します。Document関与はありません。ただし、Canvasオブジェクトへのリンクを追加しようとしています。PDF 構文をコンテンツ ストリームに追加するCanvas場合は、 を使用できます。リンクはコンテンツ ストリームの一部ではありません。リンクは、ページ ディクショナリのエントリに格納される注釈です。要するに、使用できないものに使用しています。/AnnotsCanvas

リンクを絶対位置に配置しようとしていて、そのリンクの周りに長方形を配置したいと思います。それは を使用して行われていませんCanvasParagraphaを絶対位置に置くと、はるかに簡単になります。

例えば:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Paragraph p = new Paragraph()
        .add(new Link("Google", PdfAction.createGoToR("HELLO", "www.google.com")))
        .setFixedPosition(36, 650, 80)
        .setBorder(new SolidBorder(0.5f));
    document.add(p);
    document.close();
}

Paragraphこれにより、位置(x = 36; y = 650)と 80 ユーザー単位の幅が追加されます。の周りに 0.5 の太さの境界線を追加しParagraphます。

リンクがすべて間違っているため、これも機能しません。別の PDF ファイルGoToRの特定の宛先に移動することを意図した (リモートに移動) アクションを使用しています。代わりにURIアクションが必要だと思います:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Paragraph p = new Paragraph()
        .add(new Link("Google", PdfAction.createURI("www.google.com")))
        .setFixedPosition(36, 650, 80)
        .setBorder(new SolidBorder(0.5f));
    document.add(p);
    document.close();
}

テキストの周りにより多くのスペースを確保したい場合は、パディングを変更できます。

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Paragraph p = new Paragraph()
        .add(new Link("Google", PdfAction.createURI("www.google.com")))
        .setFixedPosition(36, 650, 80)
        .setPadding(10)
        .setBorder(new SolidBorder(0.5f));
    document.add(p);
    document.close();
}

これは、達成しようとしたものよりもはるかに直感的です。

于 2016-08-09T07:01:38.257 に答える