我在工作中正在努力完成这部分任务。我故意不详细说明工作任务的背景,以尽量将注意力集中在问题上。我必须将矩形合并为单个多边形,如附图所示,但我需要点列表,以便我可以将它们写入 Swing 画布的多边形形状(DOM 对象),然后导出 SVG。
我知道每个矩形的原点,即左上角的x和y坐标(float x,float y)以及每个矩形的宽度(float)和高度(float),因此我可以计算出所有四个矩形的坐标每个矩形的角,即顶部、右侧、底部、左侧,即顶部 = 原点 = x, y,右侧 = x + 宽度,底部 = x + 宽度,y + 高度,左侧 = x, y + 高度。
我有一个List<Rectangle> rectangles并且想要一个算法,它将将此列表转换为单个多边形(List<Points>其中一个点代表每个点的坐标(x,y),如标记为红色“x”的图中所示。
然后,我将使用这个点列表在 DOM 中写出一个元素,以便最终在 SVG 中打印网页。所以,我的最终结果必须是一个点列表(即用于在 SVG 中构造多边形形状的 x,y 坐标)。
我确实看到了这个答案,它做了类似的事情,但我不确定是否可以将其应用到我的情况 - 而且它是用Python而不是Java编写的:Merging multiple相邻矩形到一个多边形
我不使用maven、pom 或任何东西。我只有简单的测试类进行测试,我只是尝试将 XSL-FO 转换为 PDF,但出现此错误。代码很简单:
package testing;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.Result;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.xmlgraphics.util.MimeConstants;
public class test {
public static void main(String[] args) {
String pth="C:/Temp/";
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
TransformerFactory factory = TransformerFactory.newInstance();
OutputStream out;
try
{
out = new BufferedOutputStream(new FileOutputStream(new File(pth+"myfile.pdf")));
InputStream in = new FileInputStream(pth+"everything.fo");
Source source = null;
Transformer transformer = …Run Code Online (Sandbox Code Playgroud) 我正在使用Batik库,这对于在Java中显示SVG图形非常有用.对于显示和呈现SVG文档的基本用例,使用起来非常简单.但是,我想做一些其他高级图形处理,我正在努力,因为我找不到任何可以让我执行以下类型任务的好资源:
有没有什么好的资源或技巧可以使用你知道的这个库?
我有一个SVG文件,其中包含几个元素(如路径,圆形,矩形等).
我想将该SVG文件转换为具有嵌入式base64数据而非多个元素的SVG.可以用Batik做到吗?
我正在处理的项目要求我只使用Java库.
参考: 旋转BufferedImage时如何产生清晰的绘画效果?
在引用的问题中,我询问了关于光栅化图像变换的质量.有人建议我应该使用SVG图像,因为转换的质量会更高,更灵活.(这是对的,是吗?)
所以我花了很多时间试图弄清楚如何使用Batik库,阅读他们的API和谷歌搜索,看看其他人是否有同样的问题.
到目前为止,我没有遇到任何重大问题,所以我希望有人可以帮助我.这实际上是我想做的事情:
与使用BufferedImages的AffineTransform和Graphics2D的drawImage(...)类似,
是否可以(以及如何)转换然后将SVG图像/对象绘制到JPanel上?
在我想要绘制它之前我在思考,我可以先根据AffineTransform对象以某种方式对其进行栅格化,然后使用Graphics2D绘制它,但如果我每次都要在绘制图像之前进行栅格化...肯定会有更好的效果做法.
所以经过深思熟虑,我想知道SVG是否真的是这样的方式.那么我应该采取的最佳方法是什么?
光栅化与矢量图像.
注意:创建SVG文件根本不是问题.
谢谢.
我正在尝试使用getBBox()在文本元素周围绘制一个矩形,代码非常简单,创建文档,添加文本元素,启动文档和添加矩形.问题是getBBox返回一些奇怪的值,我错过了什么?
DOMImplementation impl;
String svgNS;
SVGDocument doc;
Element svgRoot;
UserAgent userAgent;
DocumentLoader loader;
BridgeContext ctx;
GVTBuilder builder;
GraphicsNode rootGN;
...
// get a DOM and create a document
impl = SVGDOMImplementation.getDOMImplementation();
svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);
// Get (the 'svg' element).
svgRoot = doc.getDocumentElement();
// Set the width and height attributes on the root 'svg' element.
svgRoot.setAttributeNS(svgNS, "width", "400");
svgRoot.setAttributeNS(svgNS, "height", "450");
// Add a text element
Element txtElem = doc.createElementNS(svgNS, "text");
txtElem.setAttributeNS(svgNS, "x", "30");
txtElem.setAttributeNS(svgNS, "y", …Run Code Online (Sandbox Code Playgroud) 我似乎找不到它,Netbeans 说该包不存在?我必须获得哪个 jar 才能获得包 org.w3c.dom.svg?我正在使用蜡染 SVG
我正在尝试通过Batik从SVG文档中找到一些元素。
这是我正在使用的示例SVG文档:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
width="400"
height="300"
viewBox="0 -100 400 300"
preserveAspectRatio="none"
id="svg2">
<g id="blubb">
<line x1="0" y1="0" x2="40" y2="120" stroke="red" stroke-width="3"/>
<text class="hurz" x="50" y="150">HURZ!</text>
</g>
</svg>
Run Code Online (Sandbox Code Playgroud)
我试图找到所有text带有class属性的元素hurz。
这是一个示例代码:
import java.awt.*;
import java.io.*;
import javax.swing.*;
import org.apache.batik.swing.*;
import org.apache.batik.swing.gvt.*;
import org.w3c.dom.*;
import org.w3c.dom.svg.*;
import org.w3c.dom.xpath.*;
public class XPathTest extends JFrame {
private final JSVGCanvas c= new JSVGCanvas();
public XPathTest(){
this.setLayout(new GridLayout());
this.add(c);
c.setURI(new File("/tmp/bla.svg").toURI().toString());
c.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我正在使用飞碟库(旧但开源)使用XHTML生成PDF。我可以正常工作,但我也想添加SVG图像。Ive开始着手整合蜡染以尝试使其正常工作,但我遇到了问题。未绘制SVG图像。XHTML仍会渲染,但似乎没有显示SVG。我已经将SVG渲染为单独的PDF,但从未与飞碟的结果一起使用。我添加了通常的ReplacedElementFactory(它也可用于常规图像,但尚未包含该代码)。唯一相关的方法(确实会调用所有方法)如下:
@Override
public ReplacedElement createReplacedElement(LayoutContext layoutContext, BlockBox blockBox, UserAgentCallback userAgentCallback, int cssWidth, int cssHeight) {
Element element = blockBox.getElement();
if (element == null) {
return null;
}
String nodeName = element.getNodeName();
if ("img".equals(nodeName)) {
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(XMLResourceDescriptor.getXMLParserClassName());
SVGDocument svgImage = null;
try {
svgImage = factory.createSVGDocument(new File("logo.svg").toURL()
.toString());
} catch (IOException e) {
e.printStackTrace();
}
Element svgElement = svgImage.getDocumentElement();
Document htmlDoc = element.getOwnerDocument();
Node importedNode = htmlDoc.importNode(svgElement, true);
element.appendChild(importedNode);
return new SVGReplacedElement(svgImage, cssWidth, cssHeight);
}
return this.superFactory.createReplacedElement(layoutContext, blockBox, …Run Code Online (Sandbox Code Playgroud) 我目前使用 Batik 的 SVGGraphics2D 有以下代码:
...
final SVGGraphics2D svgGraphics2D = new SVGGraphics2D(svgGeneratorContext, false);
svgGraphics2D.setSVGCanvasSize(new Dimension(width, height));
svgGraphics2D.setFont(font);
...
Run Code Online (Sandbox Code Playgroud)
因此,如果在执行代码的系统上font可用Font,则将正确的属性添加到生成的 SVG 文件中。
但是,如果缺少字体(例如 Linux 机器上的“Verdana”),则会使用(font-family:'Dialog'添加)默认字体。
因此,我想传递一个字体系列而不是指定字体,以便font-family="DejaVu Sans,Verdana,Geneva,sans-serif"在生成的 SVG 中使用。知道如果我没有错,API 只接受Font参数,我怎么能做到这一点?
我希望有比使用 xslt 转换 xml 输出更简单的方法。
先感谢您。