标签: pdfbox

使用PDFBox读取文本和图像位置(xy坐标)

我正在做一个java程序来读取加密的PDF文件并逐页提取文件的内容,包括文件,图像及其在文件中的位置(x,y坐标).现在我正在使用PDFBox,我正在获取文本和图像.但我无法得到文字位置和图像位置.读取一些加密的PDF文件也存在一些问题.

java pdfbox

6
推荐指数
1
解决办法
4573
查看次数

LucenePDFDocument是否已从pdfbox中删除?

我正在升级我的项目库,并将pdfbox从0.6.7升级到1.6.0版,找不到LucenePDFDocument类.Apache页面上的文档/教程中仍然提到了该类.有任何想法吗?

pdfbox

6
推荐指数
1
解决办法
2985
查看次数

访问PDF中的字体文件

我们目前正与一些出版商合作,通过他们的PDF生成在线图书.我们的遗留应用程序使用flex,因此我们正在使用SWFToolsPDF2SWF将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,因此如果任何解决方案使用这些库,那么这将是首选,但我们对所有想法持开放态度.

java pdf fonts extract pdfbox

6
推荐指数
1
解决办法
1100
查看次数

Java PDFBox - 读取和修改带有特殊字符的pdf(变音符号)

我正在尝试使用此方法修改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这样的代码).

有趣的是:

  1. 当我写更新的pdf文件时,字符显示正确(即使我无法检测并替换它们)
  2. 如果我尝试使用PDFTextStripper的getText(...)去除文本,文本将被完美地提取出来.
  3. 我尝试了2个pdfbox版本:1.5.0(表现如上所述)和1.8.1(最终写入的pdf文件没有正确显示特殊字符,文档中出现"null"字符串)

我可以为用于更新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.javahttp://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFTextStripper.java

我正在挖掘更多......

java pdf utf-8 diacritics pdfbox

6
推荐指数
2
解决办法
8259
查看次数

PDFbox加载大文件

我正在尝试使用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)

java pdfbox

6
推荐指数
1
解决办法
6733
查看次数

如何使用pdfbox将unicode文本写入pdf?

我尝试使用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)

java pdf pdfbox

6
推荐指数
1
解决办法
7591
查看次数

使用Apache PDFBox添加文本时如何移动到下一行

我刚开始使用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

java pdf pdf-generation pdfbox

6
推荐指数
1
解决办法
1万
查看次数

如何在pdfBox中绘制虚线

我正在使用Pdfbox在我的文档上画一些线.码:

contentStream.drawLine(startX, startY, startX, endY);
Run Code Online (Sandbox Code Playgroud)

结果是一条直线.我想知道PdfBox能否画出虚线?

java pdf pdfbox

6
推荐指数
1
解决办法
6453
查看次数

PDFBox 1.8.10:填写并签名PDF会生成无效签名

我在PDF文档中填写(以编程方式)表单(AcroPdf),然后在文档中签名.我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf.然后我签署doc_filled.pdf,使用一些代码创建doc?filled_signed.pdf,基于签名示例并在Acrobat Reader中打开pdf.输入的Field数据可见,签名面板告诉我

"此签名中包含的格式或信息存在错误(签名字节数组无效)"

到目前为止,我知道:

  • 单独应用的签名代码(即直接创建一些doc_signed.pdf)会创建一个有效的签名
  • "隐形签名",可见签名和可见签名存在的问题被添加到现有签名字段中.
  • 问题甚至发生,如果我没有填写表格,但只打开并保存,即:

    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要求我提供文件,我正在谈论(我目前没有足够的声誉,将所有文件发布为链接,抱歉给您带来不便):

  • odc.pdf:https://www.dropbox.com/s/ev8x9q48w5l0hof/doc.pdf dl = 0
  • doc_filled.pdf:https://www.dropbox.com/s/fxn4gyneizs1zzb/doc_filled.pdf dl = 0
  • doc_filled_signed.pdf:https://www.dropbox.com/s/xm846sj8f9kiga9/doc_filled_signed.pdf dl = 0
  • doc_filled_and_signed.pdf:https://www.dropbox.com/s/5jftje6ke87jedr/doc_filled_and_signed.pdf dl = 0

最后一个是通过一次性使用签署和填写文档来创建的

    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:填写并签署文档,再次填充失败

java pdf sign pdf-form pdfbox

6
推荐指数
1
解决办法
1939
查看次数

BufferedImage颜色饱和度

我正在使用jfreesaneApache 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)

这是结果: …

java bufferedimage colors scanning pdfbox

6
推荐指数
1
解决办法
356
查看次数