Frage

Wir iText verwenden, um zu generieren PDFs von Java (basierend zum Teil auf Empfehlungen auf dieser Seite). Jedoch in einem Bildformat wie GIF Ergebnisse in es sieht ein wenig eine Kopie unserer Logo Einbettung seltsam Menschen vergrößern und verkleinern.

Im Idealfall möchten wir das Bild in einem Vektor-Format, wie EPS, SVG oder PDF-Vorlage einbetten. Die Website behauptet, dass EPS-Unterstützung fallen gelassen wurde, dass innerhalb eines PDF ein PDF oder PS Einbettung zu Fehlern führen kann, und es nicht einmal SVG erwähnen.

Unser Code verwendet die Graphics2D API anstatt iText direkt, aber wir würden bereit sein, Modus auszubrechen von AWT und verwenden iText selbst wenn es das Ergebnis erreicht. Wie kann dies geschehen?

War es hilfreich?

Lösung

Nach der Dokumentation iText unterstützt die folgenden Bildformate: JPEG , GIF, PNG, TIFF, BMP, WMF und EPS. Ich weiß nicht, ob dies eine Hilfe sein könnte, aber ich habe erfolgreich verwendet iTextSharp Vektor einbetten WMF Bild in einer pdf-Datei:

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

Andere Tipps

Das, was ich von dem Pfosten abgeleitet ich hier und die offiziellen Beispielen gefunden:

/**
 * 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);
}

Das Bild kann beispielsweise die leicht auf die pdf hinzugefügt werden (in meinem Fall als Signatur).

fand ich ein paar Beispiele von dem iText Autor, der die Graphics2D API und die Apache Batik-Bibliothek verwenden, um die SVG in einem PDF zu ziehen.

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

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

Für meine Zwecke, ich brauchte eine Reihe von SVG zu nehmen und dass in einem PDF zu einer bestimmten Größe und Lage zu zeichnen, während der Vektor Natur des Bildes beibehalten (keine Rasterung).

Ich wollte die SVG-Datei umgehen, die in den SAXSVGDocumentFactory.createSVGDocument () Funktionen weit verbreitet zu sein scheint. Ich fand der folgende Beitrag hilfreich für eine SVG Textzeichenfolge statt einer flachen Datei.

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

  

Sie haben einen String von Ihrem String erstellen und an die SAXSVGDocumentFactory # create (String, Reader) Methode übergeben. Die URI, die Sie als ersten Parameter als String übergeben wird das Basisdokument URI des SVG-Dokument sein. Dies sollte nur dann wichtig, wenn Sie Ihre SVG alle externen Dateien verweist.

     

Mit freundlichen Grüßen,

     

Daniel

Java Quelle abgeleitet von den iText Beispiele:

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

Beachten Sie, dass dies ein SVG in das PDF ziehen wird auf dem Sie arbeiten. Die SVG erscheint als eine schwimmende Schicht über Text. Ich arbeite immer noch auf sich bewegende / Skalierung es ist und es inline mit Text ruhen, aber hoffentlich ist, dass außerhalb des unmittelbaren Anwendungsbereich der Frage.

Hoffe, das war in der Lage zu helfen.

Prost

EDIT: Ich konnte meinen svg als Inline-Objekt implementieren die folgenden verwenden. Die kommentierten Zeilen sind für das Hinzufügen einer schnellen Grenze Positionierung zu überprüfen.

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

Ich habe vor kurzem erfahren, dass Sie Ihre Graphics2D Objekt direkt zu iText und die resultierenden PDF-Dateien sind nur so gut, wie skalierbare Vektorgrafiken senden. Von Ihrem Beitrag, es klingt wie dies Ihr Problem lösen könnte.

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

Das funktioniert für mich itext 7.1.3 unter Verwendung von SVG-Bild machen von 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();

Die neue Version von iText unterstützt auch SVG-Dateien. Bitte beachten Sie diese Seite.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top