Code Monkey home page Code Monkey logo

ofdrw's Introduction

OFD Reader & Writer

- Maven Central license

在使用OFDRW前,请务必悉知 《OFD Reader & Writer免责声明》

若clone和文档预览存在困难,请移步 https://gitee.com/ofdrw/ofdrw

Talk is cheap,Show me the code. ——Linus Torvalds

OFD Reader & Writer 开源的OFD处理库,支持文档生成、数字签名、文档保护、文档合并、转换、导出等功能。

本项目采用Apache 2.0许可,请尊重开源项目作者,在软件中附带OFDRW开源软件许可,在遵守开源协议前提下可免费商业化使用

根据《GB/T 33190-2016 电子文件存储与交换格式版式文档》标准实现版式文档OFD库(含有书签)。

项目采用Maven模块管理,各模块如下:

注:

  • 您可以根据需求裁剪模块优化程序体积。
  • 您可以仅引用ofdrw-core中定义的数据结来构建属于您自己的OFD库,就像ofdrw-graphics2d那样。

QuickStart

Maven项目引入依赖

<dependency>
  <groupId>org.ofdrw</groupId>
  <artifactId>ofdrw-full</artifactId>
  <version>2.2.13</version>
</dependency>

OFDRW 将持续保证API的向下兼容,您可以放心的升级OFDRW库至最新版本。

  • 若您没有采用Maven管理项目,请参阅项目中pom.xml文件中的依赖,手动解决三方依赖包问题。
  • 若出现NoClassFound等错误,请检查相关包是否存在冲突。

如何生成一份OFD文档,如何把大象放入冰箱?

public class HelloWorld {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("HelloWorld.ofd");
        try (OFDDoc ofdDoc = new OFDDoc(path)) {
            Paragraph p = new Paragraph("你好呀,OFD Reader&Writer!");
            ofdDoc.add(p);
        }
        System.out.println("生成文档位置: " + path.toAbsolutePath());
    }
}

效果如下:

示例

相关文档目录:

相关解决方案

HTML5

HTML5前端预览解决方案: DLTech21/ofd.js . https://github.com/DLTech21/ofd.js

  • jszip解压。
  • fast-xml-parser解析xml为json数据。
  • svgcanvas渲染实现。
  • 完全浏览器OFD页面渲染。

开源阅读器

XilouReaderchingliu/XilouReader . https://gitee.com/chingliu/XilouReader

  • 基于pdfium的ofd/pdf双引擎版式阅读器。

OfdiumExroy19831015/OfdiumEx . https://github.com/roy19831015/OfdiumEx

  • 基于cairo库渲染OFD。
  • Windows客户端阅读器

图片转换

目前已经被合并到ofdrw-converter 模块

推荐开源OFD图片转换解决方案: QAQtutu/ofdbox . https://github.com/QAQtutu/ofdbox

  • 支持OFD解析。
  • 基于java.awt解析OFD实现图片绘制。

阅读器

阅读器方面,您也可以尝试:

源码安装

支持 JDK 1.8 及以上版本构建。

在项目根目录下运行:

mvn install

就可以完成项目的构建打包,安装到本地Maven仓库中。

社区交流

Share and Communicate

为方便社区建设与交流,提供社区QQ群:
  • 05群号: 762837395
  • 04群号: 690642037(满)
  • 03群号: 717320255(满)
  • 02群号: 745517934(满)
  • 01群号: 577682453(满)

  • 若您遇到与OFD相关的技术问题,欢迎进群交流!
  • 若您对项目有建设性意见或方案欢迎提交IssuePull Request

参与贡献

参与贡献代码尽量遵守下面代码规约:

  1. 原则上禁止public方法、类、接口进行删除:为了保留向下兼容性,如果是更新升级请标注过去已经暴露方法、接口、类为过时标记@Deprecated,并注释置新的实现位置@deprecated {@link SomethingNew}
  2. 请为每个public方法、类、接口添加注释:为了保留开发者的便利性,注释一般为多行注释,注释内容需要包含参数以及方法或类的作用、参数意义、返还值以及意义、异常抛出、以及参数意义。

>> GitHub 第一次参与开源(多语言)

项目情况

进展

>> 项目进展

在OFDRW 2.0.0之后,项目进展以发布说明的方式在项目托管仓库中描述。

项目关注度

项目获得 Star曲线

Stargazers over time

ofdrw's People

Contributors

1995zwd avatar alex-1201 avatar benjinus avatar chi-cat avatar dependabot[bot] avatar dltech21 avatar dwflzxj avatar gardelll avatar humingzhang avatar iandjava avatar jujianfei avatar juntt avatar leonsu7774 avatar libra19911018 avatar littletain avatar maimai1205 avatar marviniter avatar nearzk avatar nightslight-hub avatar qaqtutu avatar roy19831015 avatar spenggch avatar trisia avatar wangshiqiao125 avatar xiangyanggong avatar xiaobaogeit avatar xzxiaoshan avatar yuanfangme avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ofdrw's Issues

存在乱码及换行问题

感谢作者辛苦工作!

目前使用 永中Office 打开 会乱码

使用新版 新科阅读器 HelloWorld.ofd 会 W riter 显示,在尝试阅读代码绘制发票标样!先 mark 为敬。

readme 内容有误

font 模块 readme 内容有误,提供文档生成过程中基础的字体库,默认使用操作系统提供几种自己

警告:Modifying the current transformation matrix is not allowed within text objects

转换OFD文件成功,但在转换过程中打印了一些警告信息,不知道是什么原因?
Jan 25, 2021 2:04:46 PM org.apache.pdfbox.pdmodel.PDPageContentStream transform
WARNING: Modifying the current transformation matrix is not allowed within text objects.
Jan 25, 2021 2:04:46 PM org.apache.pdfbox.pdmodel.PDPageContentStream transform
WARNING: Modifying the current transformation matrix is not allowed within text objects.
Jan 25, 2021 2:04:46 PM org.apache.pdfbox.jbig2.util.log.JDKLogger info
INFO: page 1 speed time 5
Use: 481 ms
生成文档位置: E:\idea_workspace\maven\user1\src\main\resources\result\15.pdf

添加图片

现在有添加图片的功能吗,或者以后会开发该功能模块吗

发现一个bug

Annot类,只能调用一次addParameter,第2次再调用时,会报错:org.dom4j.IllegalAddException: The node "org.ofdrw.core.OFDElement@371a67ec" could not be added to the element "ofd:Annot" because: The Node already has an existing parent of "ofd:Annot"

测试代码如下:
public class AnnotTest {

public static Annot annotCase() {
    Appearance appearance = new Appearance(new ST_Box(50, 50, 200, 200))
            .addPageBlock(PathObjectTest.pathObjectCase());

    return new Annot()
            .setID(new ST_ID(19))
            .setType(AnnotType.Path)
            .setCreator("ofdrw")
            .setLastModDate(LocalDate.now())
            .setRemark("这是一段说明内容")
            .addParameter("Key", "Value")
            .addParameter("qzh", "0001") //这里报错
            .setAppearance(appearance);
}
@Test
public void gen() throws Exception {
    TestTool.genXml("Annot", annotCase());
}

}

文件流操作

所有的功能代码都是从文件读取数据的,能不能添加从流读取数据的方法

ofd转pdf报错

java.io.FileNotFoundException: 无法在目录: C:\Users\ADMINI~1\AppData\Local\Temp\ofd-tmp-5075751823430687060\Doc_0中找到,文件 [ Annotation.xml ]
at org.ofdrw.pkg.container.VirtualContainer.getFile(VirtualContainer.java:290)
at org.ofdrw.pkg.container.VirtualContainer.getObj(VirtualContainer.java:222)
at org.ofdrw.reader.ResourceLocator.get(ResourceLocator.java:383)
at org.ofdrw.reader.ResourceLocator.get(ResourceLocator.java:352)
at org.ofdrw.reader.DLOFDReader.getAnnotaions(DLOFDReader.java:351)
at org.ofdrw.reader.DLOFDReader.(DLOFDReader.java:61)
at OFD2PDFTest.toPdfbox(OFD2PDFTest.java:43)
at OFD2PDFTest.convertPdfbox(OFD2PDFTest.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:74)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Nov 13, 2020 9:53:52 AM org.apache.pdfbox.pdmodel.PDPageContentStream transform

文字抽取显示乱码问题

使用ContentExtractorTest获取ofd文档内容,第一页标题文字显示正常,后续页面的中文全部乱码,例如:
截屏2020-10-18 14 47 37

以上,求解决方法。感谢!

并发转换报错

在并发转换OFD到PDF的时候(无论是通过Path或Stream)只有少数返回成功(1-2条),其余的均后台报错:
java.io.IOException: The TrueType font null does not contain a 'cmap' table at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapImpl(TrueTypeFont.java:553) ~[fontbox-2.0.21.jar:2.0.21] at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:533) ~[fontbox-2.0.21.jar:2.0.21] at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:519) ~[fontbox-2.0.21.jar:2.0.21] at org.apache.fontbox.ttf.TTFSubsetter.<init>(TTFSubsetter.java:90) ~[fontbox-2.0.21.jar:2.0.21] at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:346) ~[pdfbox-2.0.21.jar:2.0.21] at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:256) ~[pdfbox-2.0.21.jar:2.0.21] at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1349) ~[pdfbox-2.0.21.jar:2.0.21] at org.ofdrw.converter.ConvertHelper.ofd2pdf(ConvertHelper.java:62) [ofdrw-converter-1.7.2.jar:na] at org.ofdrw.converter.ConvertHelper.toPdf(ConvertHelper.java:101) [ofdrw-converter-1.7.2.jar:na]

flush文件的时候不能传入dom4j提供的xml的format

try (OutputStream out = Files.newOutputStream(to)) {
XMLWriter writeToFile = new XMLWriter(out);
writeToFile.write(doc);
writeToFile.close();
}

能否提供XMLWriter(OutputStream out, OutputFormat format);
org.ofdrw.pkg.container.OFDDir#jar

注释文件的文件名可否使用自定义文件名

Trisia:您好!
默认的注释文件的文件名是“Annotation.xml”,我查了一下标准,标准上只对入口的文件名有规定:Annotations.xml,但是对每页的注释文件名没有做要求,但ofdrw对此做了限制,只能是Annotation.xml,不太方便,能否开放出来,增加一个方法,允许设置自定义的注释文件名,如果未写,则使用“Annotation.xml”。感谢。

调用canvas的drawImage时,如果资源文件重复会抛出文件已存在异常

 canvas.setDrawer(ctx -> {
                FontSetting fontSetting = new FontSetting(5, FontSet.get(FontName.NotoSerif))
                        .setCharDirection(0)
                        .setReadDirection(0);
                ctx.setFillColor(255, 0, 0);
                ctx.setFont(fontSetting);
                ctx.fillText("你好 Hello World!", 60, 60);
                ctx.drawImage(Paths.get("src/test/resources/eg_tulip.jpg"), 0, 0, 50, 50);
            });

该文件 【eg_tulip.jpg】在空间里已存在,报错代码:

public VirtualContainer putFile(Path file) throws IOException {
        if (file == null || Files.notExists(file) || Files.isDirectory(file)) {
            // 为空或是一个文件夹,或者不存在
            return this;
        }
        String fileName = file.getFileName().toString();
        Path target = Paths.get(fullPath, fileName);
        // 如果文件已经在目录中那么不做任何事情
        if (target.toAbsolutePath().toString()
                .equals(file.toAbsolutePath().toString())) {
            return this;
        }
        // 复制文件到指定目录(该处报错)
        Files.copy(file, target);

        return this;
    }

错误如下:

java.nio.file.FileAlreadyExistsException: C:\Users\gmgmagw\AppData\Local\Temp\ofd-tmp-2955131297989901349\Doc_0\Res\eg_tulip.jpg
	at sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:124)
	at sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:278)
	at java.nio.file.Files.copy(Files.java:1274)
	at org.ofdrw.pkg.container.VirtualContainer.putFile(VirtualContainer.java:151)
	at org.ofdrw.pkg.container.ResDir.add(ResDir.java:36)
	at org.ofdrw.pkg.container.DocDir.addResource(DocDir.java:243)
	at org.ofdrw.layout.ResManager.addImage(ResManager.java:208)
	at org.ofdrw.layout.element.canvas.DrawContext.drawImage(DrawContext.java:590)
	at org.ofdrw.layout.element.canvas.DrawContextTest.lambda$addText$20(DrawContextTest.java:559)
	at org.ofdrw.layout.engine.render.CanvasRender.render(CanvasRender.java:48)
	at org.ofdrw.layout.engine.VPageParseEngine.convert2Layer(VPageParseEngine.java:184)

在close的时候内存溢出

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.zip.ZipCoder.getBytes(ZipCoder.java:80)
at java.util.zip.ZipFile.getEntry(ZipFile.java:316)
at java.util.jar.JarFile.getEntry(JarFile.java:240)
at java.util.jar.JarFile.getJarEntry(JarFile.java:223)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1042)
at sun.misc.URLClassPath.getResource(URLClassPath.java:239)
at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.ofdrw.pkg.container.VirtualContainer.clean(VirtualContainer.java:346)
at org.ofdrw.layout.OFDDoc.close(OFDDoc.java:468)

发现一个bug

将ofdrw打成jar包 打入到web项目当中
image
解决方式
image
我的这种解决方式虽然没报错了,但是我理解上还不够,也不能确定这是一个bug,可能是我的理解不够,望作者指点一下。

关于页面边界处理

感谢作者的辛苦工作~
在使用布局过程中遇到一些问题
我的目标是使用绝对定位来指定 Div 或 Paragraph 的位置,并搭建一个电子版式
简单的测试代码如下:

		Path path = Paths.get("test.ofd").toAbsolutePath();
		try (OFDDoc ofdDoc = new OFDDoc(path)) {
			VirtualPage virtualPage = new VirtualPage(210.0, 140.0);
			Paragraph p = new Paragraph("helloword");
			p.setPosition(Position.Absolute);
			p.setX(0.0);
			p.setY(0.0);
			p.setWidth(210.0 - 0.5);
			p.setHeight(140.0 - 0.5);
			p.setBorder(0.25);
			p.setPadding(0.0);
			p.setMargin(0.0);
			virtualPage.add(p);
			ofdDoc.addVPage(virtualPage);
		}
		System.out.println("out path: " + path.toAbsolutePath());

按照代码预期,应该是创建一个 Paragraph,其占满整个页面,并在页面最边缘描边
生成后的(数科)打开效果如下:
image
可以看到有个层遮住了上、左位置的边框,VirtualPage 似乎没有办法指定 Padding、Margin
望回复,谢谢~

修改页面添加图片

Path outPath = Paths.get("E:/testofd/dp.ofd");
Path imgFile = Paths.get("E:/testofd/testpic","test.png");
try (OFDReader reader = new OFDReader(srcTemp);
OFDDoc oFDDoc = new OFDDoc(reader, outPath)){
AdditionVPage avPage = oFDDoc.getAVPage(1);
Img a = new Img(10d,20d,imgFile);
a.setPosition(Position.Absolute);
a.setX(1.39D) .setY(7D).setMargin(3d)
.setBorder(1d).setOpacity(1D);
avPage.add(a);
}
您好,我想向页面中添加一张图片,为什么这样写并没有显示呢?只显示了图片区域的1d边框,但是图片内容没有,边框里面就是空白的

Ofd文件解析内容顺序

请问下,ofd文件page页面解析出来的内容,目前看来似乎是page_x.xml中的textCode中的内容,顺序也是按照xml中的来的,但是这个顺序应该针对每张发票都不一样,这个解析出来的内容那应该也是动态可变的。是否可以固定顺序解析出来显示呢?
另外,当前功能是否可以支持将ofd文件转换为pdf或者图片样式呢?

ofd转PDF?

您好,大神,感谢您提供ofd R&W,我在您的基础上实现了ofd解析以及ofd转PDF的功能,但是我是通过基础API实现的,我想通过您的高阶API实现 解析和转换的功能,您能给我提供点思路吗?

如何嵌入模板

我现在有一个ofd模板,现在想在此模板上添加新的内容,请问如何实现

Q&A 欢迎留言

From 权观宇:

欢迎各位来OFD Reader&Writer 的世界。

Free to talk.

org.ofdrw.gm.ses.v4.TBS_Sign有个方法写错了

public ASN1Primitive toASN1Primitive() {
ASN1EncodableVector v = new ASN1EncodableVector(6);
v.add(this.version);
v.add(this.eseal);
v.add(this.timeInfo);
v.add(this.dataHash);
v.add(this.propertyInfo);
if (this.extDatas != null) {
v.add(this.propertyInfo);
}

    return new DERSequence(v);
}

this.extDatas != null 不应该是添加propertyInfo,应该是add(this.extDatas),
导致验证时出现数据格式有问题

Div 嵌套讨论

由于Div之间可以相互嵌套,部分div的大小是由div内部的内容大小而确定

假如有一个大的Div:AA 中含有多个Div:A、B、C,那么由于AA的宽度大小是固定的,这样A、B、C之间还存在相互影响,这很难处理,不知道该如何是好?

有没有老铁有什么好的处理方案

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.