を生成し、私は下にLinux環境でテキストとしてバーコードを生成するという問題を有していて、このジャーバーベキュー-1.5-beta1.jarバーコードの値は、私はLinux環境</p> <p>で動作PDFファイルのLinux
を使用しました。 Windows環境とLinuxで同じコードに問題のない私のコードの作業
はこれを印刷しません。
これは私のコードです:
.....
File file_BC = file;
BarCodeEngine barCodeEngine = new BarCodeEngine(file, code);
file_BC = barCodeEngine.setBarCode();
これはBarCodeEngineクラスです:
import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.BarcodeFactory;
import net.sourceforge.barbecue.BarcodeImageHandler;
import org.apache.log4j.Logger;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
public class BarCodeEngine {
private static Logger log = Logger.getLogger(BarCodeEngine.class);
private File file;
private String code;
/**
* Constructor
* @param filepath
* @param code
*/
public BarCodeEngine(File file, String code) {
super();
this.file = file;
this.code = code;
}
/**
* main
* @param args
*/
public static void main(String[] args) {
BarCodeEngine barCodeEngine = new BarCodeEngine(new File("d:/1.pdf"), "1434-00000042");
try {
barCodeEngine.setBarCode();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* setBarCode
* @throws Exception
*/
public File setBarCode() throws Exception {
int idx = file.getName().lastIndexOf(".");
String ext = file.getName().substring(idx, file.getName().length());
BarCodeService barCodeService = null;
if (".pdf".equals(ext)) {
barCodeService = new PDFBarCodeService();
}
if (barCodeService != null) {
BufferedImage barcodeImg = createBarCode(code);
return barCodeService.addBarcode(file, barcodeImg);
}
return file;
}
/**
* createBarCode
* @param code
* @return
* @throws Exception
*/
private BufferedImage createBarCode(String code) throws Exception {
Barcode barcode = BarcodeFactory.createCode128(code);
barcode.setResolution(100);
barcode.setBarWidth(1);
barcode.setBarHeight(30);
barcode.setBackground(Color.WHITE);
barcode.setFont(new Font("Arial", Font.PLAIN, 12));
BufferedImage image = BarcodeImageHandler.getImage(barcode);
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight() + 6, image.getType());
Graphics g2 = newImage.getGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, newImage.getWidth(), newImage.getHeight());
g2.drawImage(image, 0, 2, image.getWidth(), image.getHeight(), null);
return newImage;
}
}
、これはPDFBarCodeServiceクラス
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import org.apache.log4j.Logger;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class PDFBarCodeService implements BarCodeService {
private static Logger log = Logger.getLogger(PDFBarCodeService.class);
/**
* addBarcode
* @param file
* @param barcodeImg
* @throws Exception
*/
public File addBarcode(File file, BufferedImage barcodeImg)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("-- Add Barcode to PDF Document");
}
PdfReader reader;
try {
reader = new PdfReader(new FileInputStream(file));
} catch (Exception e) {
throw new Exception("Format incorrect, veuillez rattacher un document PDF", e);
}
int idx = file.getName().lastIndexOf(".");
String ext = file.getName().substring(idx, file.getName().length());
File destinationFile = new File(file.getParentFile().getAbsolutePath() + "/" + file.getName().substring(0, idx) + "_BC" + ext);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destinationFile));
Image imgShipBarCode = Image.getInstance(barcodeImg, null);
int numberOfPages = reader.getNumberOfPages() + 1;
PdfContentByte cb = null;
for (int i = 1; i < numberOfPages; i++) {
cb = stamper.getOverContent(i);
Rectangle rectangle = reader.getPageSize(i);
float top = PageSize.A4.getHeight();
if (rectangle.getWidth() > rectangle.getHeight()) {
top = PageSize.A4.getWidth();
}
cb.addImage(imgShipBarCode, imgShipBarCode.getWidth(), 0, 0, imgShipBarCode.getHeight(), 0, top - (imgShipBarCode.getHeight() + 0));
}
stamper.close();
return destinationFile;
}
public File addBarcode_old(File file, BufferedImage barcodeImg)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("-- Add Barcode to PDF Document");
}
PdfReader reader;
try {
reader = new PdfReader(new FileInputStream(file));
} catch (Exception e) {
throw new Exception("Format incorrect, veuillez rattacher un document PDF", e);
}
int idx = file.getName().lastIndexOf(".");
String ext = file.getName().substring(idx, file.getName().length());
File destinationFile = new File(file.getParentFile().getAbsolutePath() + "/" + file.getName().substring(0, idx) + "_BC" + ext);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destinationFile));
document.open();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
PdfContentByte cb = writer.getDirectContent();
int pageOfCurrentReaderPDF = 0;
while (pageOfCurrentReaderPDF < reader.getNumberOfPages()) {
document.newPage();
pageOfCurrentReaderPDF++;
//Body
PdfImportedPage page = writer.getImportedPage(reader, pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
//Header
//Add barcode
Image imgShipBarCode = Image.getInstance(barcodeImg, null);
cb.addImage(imgShipBarCode, imgShipBarCode.getWidth(), 0, 0, imgShipBarCode.getHeight(), 0,
PageSize.A4.getHeight() - (imgShipBarCode.getHeight() + 0));
}
document.close();
writer.close();
if (log.isDebugEnabled()) {
log.debug("-- End of Add Barcode to PDF Document");
}
return destinationFile;
}
}
および添付のshであります異なる環境の2つのバーコードの違いが原因です。私が編集しよう
:更新
private Dimension calculateSize()
{
Dimension d = new Dimension();
if(EnvironmentFactory.getEnvironment() instanceof HeadlessEnvironment)
try
{
if(font == null)
{
d = draw(new SizingOutput(font, getForeground(), getBackground()), 0, 0, barWidth, barHeight);
} else
{
java.awt.FontMetrics fontMetrics = getFontMetrics(font);
d = draw(new SizingOutput(font, fontMetrics, getForeground(), getBackground()), 0, 0, barWidth, barHeight);
}
}
catch(OutputException e)
{
e.printStackTrace();
}
else
try
{
java.awt.FontMetrics fontMetrics = null;
if(font != null)
fontMetrics = getFontMetrics(font);
d = draw(new SizingOutput(font, fontMetrics, getForeground(), getBackground()), 0, 0, barWidth, barHeight);
}
catch(OutputException e) { }
return d;
}
私はこのコードを使用して、クラスのバーコードでメソッドcalculateSize()を編集し、成功wihoutてみてくださいHeadlessEnvironmentこのコードを使用するクラス:
package net.sourceforge.barbecue.env;
import java.awt.Font;
public final class HeadlessEnvironment
implements Environment
{
public static final int DEFAULT_RESOLUTION = 72;
public static final Font DEFAULT_FONT = new Font("Arial", 0, 20);
public int getResolution() { return 72; }
public Font getDefaultFont() {
return DEFAULT_FONT;
}
}
でも、バーコードの下のテキストは表示されません。
また、私はこの行を変更してみてください。これで
Barcode barcode = BarcodeFactory.createCode128(code);
:
Barcode barcode = BarcodeFactory.createEAN13(code);
をしかし、私はこのエラーを持っているバーコードを生成しようとすると:
net.sourceforge.barbecue.BarcodeException: Illegal character
2016-05-24 02:44:46,898 ERROR [STDERR] (http-0.0.0.0-8080-3) at net.sourceforge.barbecue.linear.upc.UPCABarcode.validateChars(Unknown Source)
2016-05-24 02:44:46,898 ERROR [STDERR] (http-0.0.0.0-8080-3) at net.sourceforge.barbecue.linear.upc.UPCABarcode.<init>(Unknown Source)
2016-05-24 02:44:46,898 ERROR [STDERR] (http-0.0.0.0-8080-3) at net.sourceforge.barbecue.linear.upc.UPCABarcode.<init>(Unknown Source)
2016-05-24 02:44:46,899 ERROR [STDERR] (http-0.0.0.0-8080-3) at net.sourceforge.barbecue.linear.ean.EAN13Barcode.<init>(Unknown Source)
2016-05-24 02:44:46,899 ERROR [STDERR] (http-0.0.0.0-8080-3) at net.sourceforge.barbecue.BarcodeFactory.createEAN13(Unknown Source)
2016-05-24 02:44:46,899 ERROR [STDERR] (http-0.0.0.0-8080-3) at com.dq.barcode.BarCodeEngine.createBarCode(BarCodeEngine.java:90)
"私は成功なしで試しています..."とはどういう意味ですか?どのように成功しなかったのですか? 'calculateSize'の2番目の' catch'を最初のようなスタックトレースを出力すると、それが出力されますか?もしそうなら、何が表示されますか? –
私は、2番目のバーコードには最初のものを超えてたくさんの余分な内容があることに気付きました。どんな考え? (2つのケースで異なる 'code'sを渡している可能性はありますか?)しかし、これはLinux版のテキストが存在しないことにはならないと思います。 –
(私の推測では、推測に過ぎません。あなたの問題は多分 'new Font(" Arial "、Font。PLAIN、12) 'はあなたがLinux上で望んでいることをしていません - あなたのLinuxボックスに" Arial "というフォントがないかもしれません。) –