2
A
回答
1
我发现的最简单的方法是用iText创建PDF,然后将生成的PDF转换为EPS或SVG。这里是创建PDF的代码:
@Test
public void testQRtoPDF() throws WriterException, FileNotFoundException, DocumentException, UnsupportedEncodingException {
final int s = 600;
int r = 1;
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try {
// Convert a string to UTF-8 bytes in a ByteBuffer
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(
"1éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò1" +
"2éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò2" +
"3éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò3" +
"4éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò4" +
"5éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò5" +
"6éöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùòïëéöàäèüùò6"));
b = bbuf.array();
} catch (CharacterCodingException e) {
System.out.println(e.getMessage());
}
String content = new String(b, "UTF-8");
QRCodeWriter qrCodeWriter = new QRCodeWriter();
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix qrCode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, s, s, hints);
Document doc = new Document(new Rectangle(s, s));
PdfWriter pdfWriter = PdfWriter.getInstance(doc, new FileOutputStream("qr-code.pdf"));
doc.open();
PdfContentByte contentByte = pdfWriter.getDirectContent();
contentByte.setColorFill(BaseColor.BLACK);
boolean d = false;
for (int x = 0; x < qrCode.getWidth(); x += r) {
for (int y = 0; y < qrCode.getHeight(); y += r) {
if (qrCode.get(x, y)) {
contentByte.rectangle(x, s - y, r, r);
contentByte.fill();
contentByte.stroke();
}
}
}
doc.close();
}
然后我使用图像魔术进行转换。像这样:
convert qr-code.pdf qr-code.eps
同样不能对SVG
convert qr-code.pdf qr-code.svg
做到这不起作用
我测试此代码与一些长期的内容和它具有高达600个字符的工作。这可能低于手机或屏幕上相机的精确度。
我希望这可以帮助别人
+0
如果你不需要UTF-8,你可以省略ByteBuffer和提示,并直接编码你的字符串 –
+1
亲自我会使用[inkscape tracing](http://inkscape.org/doc /tracing/tutorial-tracing.html)来做到这一点,但如果这个答案有效,你可以使用它。 – comp500
7
老问题,我知道,但对于沿寻找如何做到这一点的人来......它很容易连接到ZXing
JFreeSVG
(http://www.jfree.org/jfreesvg),例如:
package org.jfree.demo;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import org.jfree.graphics2d.svg.SVGGraphics2D;
import org.jfree.graphics2d.svg.SVGUtils;
public class QRCodes {
public static void main(String[] args) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode("http://www.jfree.org/jfreesvg",
BarcodeFormat.QR_CODE, 160, 160);
int w = bitMatrix.getWidth();
SVGGraphics2D g2 = new SVGGraphics2D(w, w);
g2.setColor(Color.BLACK);
for (int xIndex = 0; xIndex < w; xIndex = xIndex + bitMatrix.getRowSize()) {
for (int yIndex = 0; yIndex < w; yIndex = yIndex + bitMatrix.getRowSize()) {
if (bitMatrix.get(xIndex, yIndex)) {
g2.fillRect(xIndex, yIndex, bitMatrix.getRowSize(), bitMatrix.getRowSize());
}
}
}
SVGUtils.writeToSVG(new File("qrtest.svg"), g2.getSVGElement());
}
}
相关问题
- 1. 从图像创建矢量
- 2. 在iphone中创建QR码
- 3. 如何创建WPF矢量图像
- 4. 如何为WPF创建矢量图像
- 5. 创建vCard QR码
- 6. QR代码图像
- 7. 在Python中创建QR码(PyQt)
- 8. 如何在Laravel 5.2中创建QR码?
- 9. 创建矢量
- 10. 如何在单个QR码上创建具有多个变量的Qr码?
- 11. 在QR码中存储BMP图像
- 12. 如何使用公司徽标创建QR码图像
- 13. 如何用imagemagick创建高分辨率QR码图像?
- 14. 使用Coldfusion创建QR码
- 15. 生成QR码图像
- 16. 如何在Laravel中创建qr代码图像的下载链接?
- 17. 在Python 3.6中使用qrcode创建批次的QR码作为图像
- 18. 创建矢量在炮
- 19. 使用PHP QR码生成器在PHP中创建QR码与中心徽标
- 20. 创建矢量C++
- 21. MatLab:创建矢量
- 22. 从旧矢量创建新的矢量?
- 23. 从距离和矢量创建矢量
- 24. 如何创建矢量矢量?
- 25. 在Mac上创建QR条码
- 26. 编码的图像矢量计划
- 27. 创建增量矢量
- 28. 如何在Scheme中创建矢量矢量?
- 29. 提取矢量以在R中创建新矢量
- 30. 从zxing的图像中检测QR码
我会质疑你对矢量格式的需求。 QR码是一组完美的正方形黑白像素。它将扩大无限,而不会失去任何保真度。 所以,我想说,保存为PNG。 –
这个世界上还有设备无法处理PNG。激光雕刻机就是其中之一。这就是为什么我需要一个矢量格式 –