2015-03-07 2 views
3

У меня проблемы с созданием образа с кодом qr через библиотеку barcode4j. Я читал following guide, но это не сработало. Так вот мой код:Barcode4j + qr не работает

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>fopqr</groupId> 
    <artifactId>fopqr</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <encoding>UTF-8</encoding> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>Main</mainClass> 
         </manifest> 
        </archive> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.apache.xmlgraphics</groupId> 
      <artifactId>fop</artifactId> 
      <version>1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>net.sf.barcode4j</groupId> 
      <artifactId>barcode4j</artifactId> 
      <version>2.1</version> 
     </dependency> 

     <dependency> 
      <groupId>net.sf.barcode4j</groupId> 
      <artifactId>barcode4j-fop-ext</artifactId> 
      <version>2.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.google.zxing</groupId> 
      <artifactId>core</artifactId> 
      <version>3.2.0</version> 
     </dependency> 
    </dependencies> 
</project> 

2. Main.java

import org.apache.fop.apps.Fop; 
import org.apache.fop.apps.FopFactory; 
import org.apache.xmlgraphics.util.MimeConstants; 

import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.sax.SAXResult; 
import javax.xml.transform.stream.StreamSource; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 


public class Main { 
    public static void main(String[] args) throws Exception{ 
     FopFactory fopFactory = FopFactory.newInstance(); 
     OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("/home/user/fop.pdf"))); 

     try { 
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); 
      TransformerFactory factory = TransformerFactory.newInstance(); 
      Transformer transformer = factory.newTransformer(); // identity transformer 
      Source src = new StreamSource(new File("/home/user/template.xsl")); 
      Result res = new SAXResult(fop.getDefaultHandler()); 
      transformer.transform(src, res); 
     } 
     finally { 
      out.close(); 
     } 
    } 
} 

template.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="sans-serif" font-size="10pt"> 
    <fo:layout-master-set> 
    <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="0.4cm" margin-left="2cm" margin-right="2cm"> 
     <fo:region-body margin-bottom="2.3cm"/> 
     <fo:region-after extent="2.2cm"/> 
    </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="A4" language="en"> 
    <fo:flow flow-name="xsl-region-body"> 
       <fo:block> 
        <fo:instream-foreign-object> 
        <bc:barcode xmlns:bc="http://barcode4j.krysalis.org/ns" message="hello world"> 
         <bc:qr/> 
        </bc:barcode> 
        </fo:instream-foreign-object> 
       </fo:block> 
       </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

Когда я пытаюсь запустить приложение с

[email protected]:~/work/source/fop$ java -jar target/fopqr-1.0-SNAPSHOT-jar-with-dependencies.jar 

я

 
Mar 07, 2015 10:42:02 PM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Unknown formatting object "{http://barcode4j.krysalis.org/ns}barcode" encountered (a child of fo:instream-foreign-object}. (See position 13:99) 
Mar 07, 2015 10:42:02 PM org.apache.fop.events.LoggingEventListener processEvent 
WARNING: Unknown formatting object "{http://barcode4j.krysalis.org/ns}qr" encountered (a child of barcode}. (See position 14:31) 
Mar 07, 2015 10:42:02 PM org.apache.fop.events.LoggingEventListener processEvent 
SEVERE: The intrinsic dimensions of an instream-foreign-object could not be determined. (See position 12:47) 

Что я делаю неправильно?

ОБНОВЛЕНИЕ: Я также хочу добавить, что я прочитал FAQ: 4.1. Не удалось выполнить расширение FOP. Но, как вы видите, я добавил все необходимые библиотеки в файл pom.xml.

+0

Извините, я не знаю, почему код был отформатирован таким уродливым способом. Пожалуйста, помогите мне исправить это. –

+0

Отметьте код в редакторе, а затем нажмите {} -Button над ним (или отступом всего на 4 пробела по-другому, вот что делает кнопка :)). Можете ли вы показать нам свой шаблон.xsl? – kjosh

+0

@kjosh Это уже есть - и OP уже использовал отступ кода, но также используя нумерацию. –

ответ

3

Есть два вопроса:

  1. релиз 2.1.0 библиотеки barcode4j не содержат части для создания QR-кодов
  2. что-то пойдет не так при запуске вещи из собранной баночки «с зависимостями внедренной "

для 2. Я могу только предложить обходной путь: добавить к вашему pom.xml в сборке <plugins>:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <configuration> 
       <mainClass>Main</mainClass> 
      </configuration> 
     </plugin> 

, то вы можете запустить вещи с mvn exec:java и вдруг вы должны увидеть другое сообщение об ошибке:

org.krysalis.barcode4j.BarcodeException: No barcode configuration element not found 
at org.krysalis.barcode4j.BarcodeUtil.createBarcodeGenerator(BarcodeUtil.java:110) 
at org.krysalis.barcode4j.BarcodeUtil.createBarcodeGenerator(BarcodeUtil.java:146) 
at org.krysalis.barcode4j.fop.BarcodeElement.getDimension(BarcodeElement.java:76) 

Через некоторое время я понял, код хотел сказать мне, что нет ничего, чтобы сделать QR-коды. (Например, заменить ваш <bc:qr /> на <bc:code39/> и вы должны увидеть Lib производит что-то (а не QR-код, конечно).

Так что делать? Строить от источника! Имейте ваш старый добрый ant и cvs готов!

cvs -z3 -d:pserver:[email protected]:/cvsroot/barcode4j co barcode4j 
cd barcode4j 
ant 

это должно сделать это, чтобы рассказать Maven, за исключением Конечно, есть разумный способ сделать это, но то, что работает для меня:.

cp ~/.m2/repository/net/sf/barcode4j/barcode4j/2.1/barcode4j-2.1.pom pom.xml 
vi pom.xml # change <version>2.1</version> to <version>2.2-SNAPSHOT</version> 
mvn -Dfile=build/barcode4j.jar -DpomFile=pom.xml install:install-file 

Теперь после того, как подделать банку в наш Maven репо, исправить оригинал pom.xml и обновлять зависимости (в том числе понижение ZXing до 1,7, так как новая версия не совместима):

<dependency> 
     <groupId>net.sf.barcode4j</groupId> 
     <artifactId>barcode4j</artifactId> 
     <version>2.2-SNAPSHOT</version> 
    </dependency> 

    <dependency> 
     <groupId>net.sf.barcode4j</groupId> 
     <artifactId>barcode4j-fop-ext</artifactId> 
     <version>2.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.zxing</groupId> 
     <artifactId>core</artifactId> 
     <version>1.7</version> 
    </dependency> 

Я предполагаю, что это должно было быть лучше стиль обновить до 2.2-SNAPSHOT тоже, но я оставляю это как упражнение для читателя. ;)

В любом случае, если я запустил mvn exec:java сейчас, я получаю fop.pdf с его QR-кодом. (Это выглядит не очень красиво, но некоторые из них работают с конфигурацией, например, добавлением <bc:module-width>2mm</bc:module-width> или каким-либо другим способом.

Я должен признать, что я предпочитаю оставить его кому-то еще, чтобы понять, почему запуск того же кода из собранной банки не работает.

+2

Я даже не представлял себе, что создание простого образа, содержащего qr-код, будет такой проблемой :) И я сам нашел другой (может быть, немного проще) способ - просто сгенерируйте регулярное qr-изображение, используя zxing, получить массив байтов, преобразовать его в строку base64 и использовать только как URL изображения. Но в любом случае, спасибо за большой ответ! –

+1

Есть еще один способ сделать это: зарегистрируйте 'ResourceResolver' с вашим' FopFactoryBuilder', используйте 'external-graphic' с src =' qr: the_code_to_use', затем проанализируйте этот url в своем Resolver и верните изображение на лету, используя aByteArrayOutputStream '. –

Смежные вопросы