AFP查看器中的组号TLE浏览器在AFP合并后不会按顺序增加

时间:2016-06-14 10:53:40

标签: java afp

我使用java实用程序合并了三个AFP文件,该实用程序从文件读取字节并使用FileOutputStream Java类写入输出流。 合并的AFP文件看起来不错,但是在打开AFP文件后,在强制代码AFPViewer(在TLE浏览器中)中检查TLE(标记逻辑元素)信息时,所有合并文件的组编号保持相同:GRP:PGP00001

请让我知道如何合并文件,以便在AFP合并后GRP编号应按顺序开始增加。 结果应为GRP:PGP00001,GRP:PGP00002和GRP:PGP00003

使用以下代码合并使用Apache FOP XSL-FO生成的每个AFP文件:

public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);

// Get the size of the file
long length = file.length();

// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
       && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
    offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+file.getName());
}

// Close the input stream and return bytes
is.close();
return bytes;
}

主要功能:

public static void main(String[] args) {
try {
    FileOutputStream fos = new FileOutputStream("C:\\dev\\harry\\ETCC_data\\output.afp");
    byte[] bytes1 = getBytesFromFile(new File(filePath1));
    byte[] bytes2 = getBytesFromFile(new File(filePath2));
    fos.write(bytes1);
    fos.write(bytes2);
    fos.flush(); 
    fos.close(); 
}
catch(FileNotFoundException ex) { System.out.println("FileNotFoundException : " + ex); }
catch(IOException ioe) { System.out.println("IOException : " + ioe); }
}

3 个答案:

答案 0 :(得分:2)

afplib确实有一些关于如何将多个AFP文件正确合并为一个的示例代码:

https://github.com/yan74/afplib/wiki/Samples#afpcombinejava https://github.com/yan74/afplib/blob/master/org.afplib.samples/src/main/java/org/afplib/samples/AfpCombine.java

package org.afplib.samples;

import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;

import org.junit.Test;

public class AfpCombineTest {

    @Test
    public void testRun() throws IOException {
        new File("tmp").mkdirs();
        AfpCombine combine = new AfpCombine("tmp/out.afp", new String[] { "testdata/start.afp", "testdata/start.afp" , "testdata/ende.afp" , "testdata/ende.afp"});
        combine.run();
    }

}

答案 1 :(得分:1)

二进制合并不适用于AFP / MO:DCA文件。

除资源名称外,还有很多问题 只需一个,共享资源(BRG ... ERG),通常在文档前面(例如,它们位于BDT ... EDT之前)必须始终保留在之前。 /> 此外,映射的颜色标识符,图像格式等之间可能存在冲突。

事实上,纯二进制合并似乎只适用于最简单的文档。换句话说,几乎从来没有。

为了合理地合并多个文档,必须深入研究文档结构并调整所有必要的结构化字段。

AFP有几个Java库,如afplib

我也看到那些为此目的使用Apache FOP的AFP module的人,虽然它主要针对创建文件,而不是编辑那些。

答案 2 :(得分:0)

合并AFP文件不仅如此简单 cat afp1 afp2&gt;出 我们需要确保在组合两个文件后遵循MODCA结构。 您在第一个afp文件中的所有资源和一个BRG-ERG组中的第二个afp文件以及所有数据页都应位于一个BDT-EDT组中。 以下是流程。

Merge AFP Files

如上所述合并后,会出现重复资源的问题。 比如AFP 1使用的是Codefont CO10001,即Arial 10 AFP 2使用的是Codefont CO10001(同名),即Helvetica 10

打印机将选择第一个可用的字体,因此您无法获得预期的打印效果。

确保在合并时,没有资源应该具有不同属性的相同名称,并删除重复的资源(如果有的话),这是一种很好的做法。

回答你,你可以在你的程序中拥有计数器变量,当你遇到BNG记录时,你可以通过更新它来更新现有记录,或者你可以写你自己的BNG记录。