Question

Nous utilisons iText pour générer des fichiers PDF à partir de Java (basés en partie sur les recommandations de ce site). Toutefois, l'intégration d'une copie de notre logo dans un format d'image tel que GIF lui donne un aspect un peu étrange lorsque les utilisateurs effectuent un zoom avant ou arrière.

Idéalement, nous aimerions incorporer l'image dans un format vectoriel, tel que EPS, SVG ou tout simplement un modèle PDF. Le site Web affirme que la prise en charge de l'EPS a été supprimée, que l'intégration d'un fichier PDF ou d'un fichier PS dans un fichier PDF peut entraîner des erreurs, sans mentionner SVG.

Notre code utilise l'API Graphics2D plutôt que iText directement, mais nous serions disposés à sortir du mode AWT et à utiliser iText lui-même s'il obtenait le résultat souhaité. Comment cela peut-il être fait?

Était-ce utile?

La solution

Selon la documentation , iText prend en charge les formats d'image suivants: JPEG , GIF, PNG, TIFF, BMP, WMF et EPS. Je ne sais pas si cela pourrait vous aider, mais j'ai utilisé avec succès iTextSharp pour incorporer le vecteur Image WMF dans un fichier 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();
        }
    }
}

Autres conseils

C’est ce que j’ai tiré des billets que j’ai trouvés ici et des exemples officiels:

/**
 * Reads an SVG Image file into an com.itextpdf.text.Image instance to embed it into a PDF
 * @param svgPath SVG filepath
 * @param writer PdfWriter instance 
 * @return Instance of com.itextpdf.text.Image holding the SVG file
 * @throws IOException
 * @throws BadElementException
 */
private static Image getSVGImage(String svgPath, PdfWriter writer) throws IOException, BadElementException {
    SVGDocument svgDoc = new SAXSVGDocumentFactory(null).createSVGDocument(null, new FileReader(svgPath));

    // Try to read embedded height and width
    float svgWidth = Float.parseFloat(svgDoc.getDocumentElement().getAttribute("width").replaceAll("[^0-9.,]",""));
    float svgHeight = Float.parseFloat(svgDoc.getDocumentElement().getAttribute("height").replaceAll("[^0-9.,]",""));

    PdfTemplate svgTempl = PdfTemplate.createTemplate(writer, svgWidth, svgHeight);
    Graphics2D g2d = new PdfGraphics2D(svgTempl, svgTempl.getWidth(), svgTempl.getHeight());
    GraphicsNode chartGfx = (new GVTBuilder()).build(new BridgeContext(new UserAgentAdapter()), svgDoc);
    chartGfx.paint(g2d);
    g2d.dispose();

    return new ImgTemplate(svgTempl);
}

L’instance d’image peut être facilement ajoutée au pdf (dans mon cas, une signature).

J'ai trouvé quelques exemples d'auteurs iText qui utilisent l'API Graphics2D et la bibliothèque Apache Batik pour dessiner le fichier SVG dans un fichier PDF.

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

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

Pour mes besoins, je devais prendre une chaîne de caractères SVG et la dessiner dans un fichier PDF à une taille et à un emplacement déterminés, tout en maintenant la nature vectorielle de l'image (pas de pixellisation).

Je voulais éviter le fichier SVG qui semble prévaloir dans les fonctions SAXSVGDocumentFactory.createSVGDocument (). J'ai trouvé le post suivant utile pour utiliser une chaîne de texte SVG au lieu d'un fichier plat.

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

  

Vous devez créer un StringReader à partir de votre chaîne et le transmettre à la méthode SAXSVGDocumentFactory # createDocument (String, Reader). L'URI que vous transmettez en tant que premier paramètre sous forme de chaîne sera l'URI du document de base du document SVG. Cela ne devrait être important que si votre SVG fait référence à des fichiers externes.

     

Cordialement,

     

Daniel

Java Source dérivé des exemples iText:

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

Notez que cela attirera un fichier SVG vers le fichier PDF sur lequel vous travaillez. Le SVG apparaît comme un calque flottant au-dessus du texte. Je travaille toujours à le déplacer / le redimensionner et à le placer en alignement avec le texte, mais j'espère que cela sort du cadre de la question.

J'espère que cela a pu aider.

A bientôt

EDIT: J'ai pu implémenter mon svg en tant qu’objet en ligne en utilisant ce qui suit. Les lignes commentées servent à ajouter une bordure rapide pour vérifier le positionnement.

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

J'ai récemment appris que vous pouvez envoyer votre objet Graphics2D directement à iText et que les fichiers PDF résultants sont aussi bons que des graphiques vectoriels à l'échelle. D'après votre message, cela pourrait résoudre votre problème.

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

Cela a fonctionné pour moi en utilisant itext 7.1.3 pour restituer une image SVG par SVGConverter.

PdfWriter writer = new PdfWriter(new FileOutputStream("/home/users/Documents/pdf/new.pdf"));

        PdfDocument pdfDoc = new PdfDocument(writer);

        Document doc = new Document(pdfDoc);

        URL svgUrl = new File(svg).toURI().toURL();

        doc.add(new Paragraph("new pikachu"));                      

        Image image = SvgConverter.convertToImage(svgUrl.openStream(), pdfDoc);                 
        doc.add(image);

        doc.close();

La nouvelle version d'iText prend également en charge les fichiers SVG. Veuillez consulter la page .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top