14

iText を使用して Java から PDF を生成します (このサイトの推奨事項に部分的に基づいています)。ただし、ロゴのコピーを GIF などの画像形式で埋め込むと、ズームインおよびズームアウトすると少し奇妙に見えます。

理想的には、EPS、SVG、または PDF テンプレートなどのベクター形式で画像を埋め込みたいと考えています。この Web サイトは、EPS サポートが廃止されたこと、PDF または PS を PDF 内に埋め込むとエラーが発生する可能性があること、さらに SVG についても言及していないと主張しています。

私たちのコードは iText を直接使用するのではなく、Graphics2D API を使用していますが、結果が得られた場合は、AWT モードを抜け出して iText 自体を使用することもできます。これはどのように行うことができますか?

4

7 に答える 7

8

ドキュメントによると、iText は次の画像形式をサポートしています: JPEG、GIF、PNG、TIFF、BMP、WMF、EPS。これが役立つかどうかはわかりませんが、iTextSharpを使用してベクトルWMF画像を pdf ファイルに埋め込むことに成功しました。

C#:

using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

public class Program 
{

    public static void Main() 
    {
        Document document = new Document();
        using (Stream outputPdfStream = new FileStream("output.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
        using (Stream imageStream = new FileStream("test.wmf", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            PdfWriter.GetInstance(document, outputPdfStream);
            Image wmf = Image.GetInstance(imageStream);
            document.Open();
            document.Add(wmf);
            document.Close();
        }
    }
}
于 2009-01-03T13:36:06.160 に答える
7

Graphics2DAPIとApacheBatikライブラリを使用してSVGをPDFで描画する、iTextの作成者による例をいくつか見つけました。

http://itextpdf.com/examples/iia.php?id=269

http://itextpdf.com/examples/iia.php?id=263

私の目的では、SVGの文字列を取得し、画像のベクトルの性質を維持しながら(ラスタライズなしで)、特定のサイズと場所でPDFに描画する必要がありました。

SAXSVGDocumentFactory.createSVGDocument()関数で普及していると思われるSVGファイルをバイパスしたかったのです。次の投稿は、フラットファイルの代わりにSVGテキスト文字列を使用するのに役立ちました。

http://batik.2283329.n4.nabble.com/Parse-SVG-from-String-td3539080.html

StringからStringReaderを作成し、それをSAXSVGDocumentFactory#createDocument(String、Reader)メソッドに渡す必要があります。最初のパラメーターとして文字列として渡すURIは、SVGドキュメントのベースドキュメントURIになります。これは、SVGが外部ファイルを参照する場合にのみ重要です。

よろしくお願いします、

ダニエル

iTextの例から派生したJavaソース:

// SVG as a text string.
String svg = "<svg>...</svg>";

// Create the PDF document.
// rootPath is the present working directory path.
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File(rootPath + "svg.pdf")));
document.open();

// Add paragraphs to the document...
document.add(new Paragraph("Paragraph 1"));
document.add(new Paragraph(" "));

// Boilerplate for drawing the SVG to the PDF.
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
PdfContentByte cb = writer.getDirectContent();

// Parse the SVG and draw it to the PDF.
Graphics2D g2d = new PdfGraphics2D(cb, 725, 400);
SVGDocument chart = factory.createSVGDocument(rootPath, new StringReader(svg));
GraphicsNode chartGfx = builder.build(ctx, chart);
chartGfx.paint(g2d);
g2d.dispose();

// Add paragraphs to the document...
document.add(new Paragraph("Paragraph 2"));
document.add(new Paragraph(" "));

document.close();

これにより、作業中のPDFにSVGが描画されることに注意してください。SVGは、テキストの上にフローティングレイヤーとして表示されます。私はまだそれを移動/スケーリングし、テキストとインラインで休ませることに取り組んでいますが、うまくいけば、それは質問の直接の範囲外です。

これがお役に立てば幸いです。

乾杯

編集:以下を使用して、svgをインラインオブジェクトとして実装することができました。コメント行は、位置を確認するための簡単な境界線を追加するためのものです。

SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(XMLResourceDescriptor.getXMLParserClassName());
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
SVGDocument svgDoc = factory.createSVGDocument(rootPath, new StringReader(svg));
PdfTemplate svgTempl = PdfTemplate.createTemplate(writer, Float.parseFloat(svgDoc.getDocumentElement().getAttribute("width")), Float.parseFloat(svgDoc.getDocumentElement().getAttribute("height")));
Graphics2D g2d = new PdfGraphics2D(svgTempl, svgTempl.getWidth(), svgTempl.getHeight());
GraphicsNode chartGfx = builder.build(ctx, svgDoc);
chartGfx.paint(g2d);
g2d.dispose();
Image svgImg = new ImgTemplate(svgTempl);
svgImg.setAlignment(Image.ALIGN_CENTER);
//svgImg.setBorder(Image.BOX);
//svgImg.setBorderColor(new BaseColor(0xff, 0x00, 0x00));
//svgImg.setBorderWidth(1);
document.add(svgImg);
于 2012-09-19T21:10:54.433 に答える
5

私は最近、Graphics2D オブジェクトを iText に直接送信できることを知りました。結果として得られる PDF ファイルは、スケーラブルなベクター グラフィックスと同じくらい優れています。あなたの投稿から、これがあなたの問題を解決するかもしれないようです。

Document document = new Document(PageSize.LETTER);
PdfWriter writer = null;
try {
    writer = PdfWriter.getInstance(document, new FileOutputStream(your file name));
} catch (Exception e) {
    // do something with exception
}

document.open();

PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(width, height);
Graphics2D g2 = tp.createGraphics(width, height, new DefaultFontMapper());

// Create your graphics here - draw on the g2 Graphics object

g2.dispose();
cb.addTemplate(tp, 0, 100); // 0, 100 = x,y positioning of graphics in PDF page
document.close();
于 2009-01-02T21:44:22.867 に答える