我正在做一个java程序来读取加密的PDF文件并逐页提取文件的内容,包括文件,图像及其在文件中的位置(x,y坐标).现在我正在使用PDFBox,我正在获取文本和图像.但我无法得到文字位置和图像位置.读取一些加密的PDF文件也存在一些问题.
我正在升级我的项目库,并将pdfbox从0.6.7升级到1.6.0版,找不到LucenePDFDocument类.Apache页面上的文档/教程中仍然提到了该类.有任何想法吗?
我们目前正与一些出版商合作,通过他们的PDF生成在线图书.我们的遗留应用程序使用flex,因此我们正在使用SWFTools的PDF2SWF将PDF转换为SWF文件.
我们遇到的问题是,当用户执行搜索时,我们的弹性阅读器不会突出显示SWF文档中的文本.经过快速调查后,我们发现在提取文本时我们需要嵌入PDF文档使用的字体:
http://wiki.swftools.org/wiki/How_do_I_highlight_text_in_the_SWF%3F
pdf2swf -F $YOUR_FONTS_DIR$ -f input.pdf -o output.swf
Run Code Online (Sandbox Code Playgroud)
从上面的代码中可以看出,我们需要一个包含该PDF中字体的字体目录的路径.
由于我们将转换大量PDF,是否可以直接通过PDF访问字体文件而不是在我们的应用程序中存储大量字体?
附加信息
我们的应用程序是用Java编写的.
我们目前在应用程序中使用PDFBox和Ghostscript,因此如果任何解决方案使用这些库,那么这将是首选,但我们对所有想法持开放态度.
我正在尝试使用此方法修改pdf(第一个代码块 - 使用PDFStreamParser并迭代PDFOperator,然后在需要时更新COSString):
http://www.coderanch.com/t/556009/open-source/PdfBox-Replace-String-double-pdf
我遇到了一些UTF-8字符(变音符号)的问题:当我打印我要更新的文本时,它显示为"Societ??ii Na?ionale"(其中'?'是像0002或0004这样的代码).
有趣的是:
我可以为用于更新pdf(或至少尝试...)的类做什么(配置),以便正确显示所有UTF-8字符?
编辑:
截图: 
编辑2:
我搜索了PDFTextStripper及其超类中的pdfbox源代码,然后我发现了文本的提取方式:
在processStream方法的开头我们有
graphicsState = new PDGraphicsState(aPage.findCropBox());
Run Code Online (Sandbox Code Playgroud)
在processEncodedText中剥离文本时,使用如下的PDFont类实例:
final PDFont font = graphicsState.getTextState().getFont();
Run Code Online (Sandbox Code Playgroud)
并且使用以下内容从byte []中提取文本:
String c = font.encode( string, i, codeLength );
Run Code Online (Sandbox Code Playgroud)
新的问题是,当我使用相同的2行代码实例化一个PDFont类时,我得到一个"null"字体类,因此我不能使用.encode(...)方法.这些类的源代码在这里:http: //grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFStreamEngine.java和http://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFTextStripper.java
我正在挖掘更多......
我正在尝试使用PDFBox将pdf文件的第一页转换为图像.当我加载一个大的pdf文件时,我得到一个例外.
码:
PDDocument doc;
try {
InputStream input = new URL("http://www.jewishfederations.org/local_includes/downloads/39497.pdf").openStream();
doc = PDDocument.load(input);
PDPage firstPage = (PDPage) doc.getDocumentCatalog().getAllPages().get(0);
BufferedImage image =firstPage.convertToImage();
File outputfile = new File("image2.png");
ImageIO.write(image, "png", outputfile);
input.close();
doc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
例外:
org.apache.pdfbox.pdfparser.BaseParser parseCOSStream
WARNING: Specified stream length 72435 is wrong. Fall back to reading stream until 'endstream'.
org.apache.pdfbox.exceptions.WrappedIOException: Could not push back 72435 bytes in order to reparse stream. Try increasing push back buffer using system …Run Code Online (Sandbox Code Playgroud) 我尝试使用Apache PDFBox 1.8.6在中创建PDF Java。(请参见下面的代码)
如果我写字符串:Hello! 123 abc äöüß一切正常。
但是,如果我添加一个€符号或等效的\ u20ac,字符串就会搞砸了:þÿ H e l l o ! 1 2 3 a b c ä ö ü ß ¬ ¬ ¦
我认为这与编码有关,因为像OpenOffice这样的程序可以毫无问题地导出带有€或其他Unicode符号的pdf。
那么,我该怎么做才能将Unicode字符串写入PDF?
try {
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDPageContentStream stream = new PDPageContentStream(doc, page);
PDFont font = PDType1Font.COURIER;
//font.setFontEncoding(new EncodingManager().getEncoding(COSName.WIN_ANSI_ENCODING));
stream.setFont(font, 14);
stream.beginText();
stream.setNonStrokingColor(Color.BLACK);
stream.moveTextPositionByAmount(20, 750);
String text = "Hello! 123 abc äöüß € \u20ac";
//JOptionPane.showMessageDialog(null, text);
stream.drawString(text); …Run Code Online (Sandbox Code Playgroud) 我刚开始使用Apache PDFBox并且正在尝试我发现的各种示例.
但是,在添加文本时,我无法找到一种简单的方法来移动到下一行.
例如
PDPageContentStream content = new PDPageContentStream(document, page);
PDFont font = PDType1Font.HELVETICA;
content.beginText();
content.setFont(font, 12);
content.moveTextPositionByAmount(x, y);
content.drawString("Some text.");
content.endText();
Run Code Online (Sandbox Code Playgroud)
要在下面添加另一行文本,我必须反复尝试y in的值,moveTextPositionByAmount直到它没有覆盖前一行.
是否有更直观的方法来确定下一行的坐标是什么?
TIA
我正在使用Pdfbox在我的文档上画一些线.码:
contentStream.drawLine(startX, startY, startX, endY);
Run Code Online (Sandbox Code Playgroud)
结果是一条直线.我想知道PdfBox能否画出虚线?
我在PDF文档中填写(以编程方式)表单(AcroPdf),然后在文档中签名.我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf.然后我签署doc_filled.pdf,使用一些代码创建doc?filled_signed.pdf,基于签名示例并在Acrobat Reader中打开pdf.输入的Field数据可见,签名面板告诉我
"此签名中包含的格式或信息存在错误(签名字节数组无效)"
到目前为止,我知道:
问题甚至发生,如果我没有填写表格,但只打开并保存,即:
PDDocument doc = PDDocument.load(new File("doc.pdf"));
doc.save(new File("doc_filled.pdf"));
doc.close();
Run Code Online (Sandbox Code Playgroud)足以打破后来应用的签名代码.
另一方面,如果我使用相同的doc.pdf,在Adobe中手动输入字段的值,则签名代码会生成有效的签名.
我究竟做错了什么?
更新:
@mkl要求我提供文件,我正在谈论(我目前没有足够的声誉,将所有文件发布为链接,抱歉给您带来不便):
最后一个是通过一次性使用签署和填写文档来创建的
doc.saveIncremental();
Run Code Online (Sandbox Code Playgroud)
正如我已经在评论中写的那样
setNeedToBeUpdate(true);
Run Code Online (Sandbox Code Playgroud)
但似乎缺少了.参考@mkl的第二条评论,我发现了这个问题:使用PDFBOX生成的PDF中无法正确显示保存的文本字段值,这也包括某些输入的文本未显示.申请时,我先试了一下
setBoolean(COSName.getPDFName("NeedAppearances"), true);
Run Code Online (Sandbox Code Playgroud)
到字段和表单的字典,然后显示字段上下文,但签名最终没有添加.我仍然需要进一步研究.
更新: 故事在这里继续:PDFBox 1.8.10:填写并签署文档,再次填充失败
我正在使用jfreesane和Apache PDFBox编写一个简单的扫描应用程序.
这是扫描码:
InetAddress address = InetAddress.getByName("192.168.0.17");
SaneSession session = SaneSession.withRemoteSane(address);
List<SaneDevice> devices = session.listDevices();
SaneDevice device = devices.get(0);
device.open();
device.getOption("resolution").setIntegerValue(300);
BufferedImage bimg = device.acquireImage();
File file = new File("test_scan.png");
ImageIO.write(bimg, "png", file);
device.close();
Run Code Online (Sandbox Code Playgroud)
并制作PDF:
PDDocument document = new PDDocument();
float width = bimg.getWidth();
float height = bimg.getHeight();
PDPage page = new PDPage(new PDRectangle(width, height));
document.addPage(page);
PDImageXObject pdimg = LosslessFactory.createFromImage(document, bimg);
PDPageContentStream stream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);
stream.drawImage(pdimg, 0, 0);
stream.close();
document.save(filename);
document.close();
Run Code Online (Sandbox Code Playgroud)
这是结果: …