我使用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); }
}
答案 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组中。 以下是流程。
如上所述合并后,会出现重复资源的问题。 比如AFP 1使用的是Codefont CO10001,即Arial 10 AFP 2使用的是Codefont CO10001(同名),即Helvetica 10
打印机将选择第一个可用的字体,因此您无法获得预期的打印效果。
确保在合并时,没有资源应该具有不同属性的相同名称,并删除重复的资源(如果有的话),这是一种很好的做法。
回答你,你可以在你的程序中拥有计数器变量,当你遇到BNG记录时,你可以通过更新它来更新现有记录,或者你可以写你自己的BNG记录。