我正在尝试使用pdfbox从pdf中提取所有信息的文本.除了颜色,我得到了我想要的所有信息.我尝试了不同的方法来获得fontcolor(包括使用PDFBox获取文本颜色).但不行.现在我从PageDrawer类的pdfBox中复制了代码.但是那时RGB值也不正确.
protected void processTextPosition(TextPosition text) {
Composite com;
Color col;
switch(this.getGraphicsState().getTextState().getRenderingMode()) {
case PDTextState.RENDERING_MODE_FILL_TEXT:
com = this.getGraphicsState().getNonStrokeJavaComposite();
int r = this.getGraphicsState().getNonStrokingColor().getJavaColor().getRed();
int g = this.getGraphicsState().getNonStrokingColor().getJavaColor().getGreen();
int b = this.getGraphicsState().getNonStrokingColor().getJavaColor().getBlue();
int rgb = this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB();
float []cosp = this.getGraphicsState().getNonStrokingColor().getColorSpaceValue();
PDColorSpace pd = this.getGraphicsState().getNonStrokingColor().getColorSpace();
break;
case PDTextState.RENDERING_MODE_STROKE_TEXT:
System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
System.out.println(this.getGraphicsState().getStrokingColor().getJavaColor().getRGB());
break;
case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT:
//basic support for text rendering mode "invisible"
Color nsc = this.getGraphicsState().getStrokingColor().getJavaColor();
float[] components = {Color.black.getRed(),Color.black.getGreen(),Color.black.getBlue()};
Color c1 = new Color(nsc.getColorSpace(),components,0f);
System.out.println(this.getGraphicsState().getStrokeJavaComposite().toString());
break;
default:
System.out.println(this.getGraphicsState().getNonStrokeJavaComposite().toString());
System.out.println(this.getGraphicsState().getNonStrokingColor().getJavaColor().getRGB());
}
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的代码.得到的值是R = 0,G …
我有一个PDF文件,其中包含一些我需要从Java代码填写的表单字段.我为此使用PDFBox库,这段代码:
PDDocument pdfDoc = PDDocument.load("C:\\Users\\igor\\Desktop\\test.pdf");
PDDocumentCatalog docCatalog = pdfDoc.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
PDField field = acroForm.getField("applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]");
if (field != null) {
field.setValue("Milan");
} else {
System.err.println("No field found with name:" + "applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]");
}
pdfDoc.save("C:\\Users\\igor\\Desktop\\testout.pdf");
pdfDoc.close();
Run Code Online (Sandbox Code Playgroud)
PDF不是由我创建的,所以我不知道文件使用什么类型的表单(如果我理解正确,则有FDF和XFA表单).由于PDF不是由我创建的,我使用此工具http://support.persits.com/pdf/demo_formfields.asp来查找表单字段的名称,它给了我:
applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]
Run Code Online (Sandbox Code Playgroud)
当我使用这个长字段名称时,我没有收到任何错误,但生成的PDF不包含我在字段中输入的值.我想也许字段名称可能有问题,所以我使用了Pdftk工具,它只给了我txtFirstName字段名称.但是当我使用它时,我得到了No field found with name: txtFirstName错误.救命?
使用qpdf,您可以简单地从pdf中删除限制/加密,如下所示:
qpdf --decrypt infile outfile
Run Code Online (Sandbox Code Playgroud)
我想用Java中的PDFBox做同样的事情:
PDDocument doc = PDDocument.load(inputFilename);
if( doc.isEncrypted() )
{
//remove the encryption to alter the document
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用StandardDecryptionMaterial,但我不知道所有者密码是什么.qpdf如何做到这一点?
样本文件:https://issues.apache.org/jira/secure/attachment/12514714/in.pdf
我需要将图像(主要是JPEG)直接转换为PDF文档的PDF页面.
可能是图像的大小不同.
每个PDF页面都应具有与图像完全相同的尺寸.
因此每个页面仅包含全分辨率的图像.
如何实现这一点,页面设置为图像/内容的尺寸?
因为我看到了具有不同页面大小和方向的PDF文件,但是如何使用PDFBox完成?
我正在做一个java程序来读取加密的PDF文件并逐页提取文件的内容,包括文件,图像及其在文件中的位置(x,y坐标).现在我正在使用PDFBox,我正在获取文本和图像.但我无法得到文字位置和图像位置.读取一些加密的PDF文件也存在一些问题.
我们目前正与一些出版商合作,通过他们的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,因此如果任何解决方案使用这些库,那么这将是首选,但我们对所有想法持开放态度.
我用Apache PDFBox库创建了一个PDF文档.我的问题是在页面上绘制字符串时编码欧元货币符号,因为基本字体Helvetica不提供此字符.如何将输出"þÿ¬"转换为符号"€"?
我想创建一个包含表格的 PDF 表单,其中表格将包含行数,某些列将只读文本,而某些列需要是可编辑的 TextFields/ComboBox。
此外,此文本字段/组合框应具有 javascript 支持,即,在这些字段的值更改时,应调用 javascript 函数来验证用户输入。
我在这里附上了所需的示例格式:
我在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:填写并签署文档,再次填充失败
我正在使用 pdfbox 在 pdf 文件中添加一行。但我添加的文字是相反的。
File file = new File(filePath);
PDDocument document = PDDocument.load(file);
PDPage page = document.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND,true);
int stampFontSize = grailsApplication.config.pdfStamp.stampFontSize ? grailsApplication.config.pdfStamp.stampFontSize : 20
contentStream.beginText();
contentStream.setFont(PDType1Font.TIMES_ROMAN, stampFontSize);
int leftOffset = grailsApplication.config.pdfStamp.leftOffset ? grailsApplication.config.pdfStamp.leftOffset : 10
int bottomOffset = grailsApplication.config.pdfStamp.bottomOffset ? grailsApplication.config.pdfStamp.bottomOffset : 20
contentStream.moveTextPositionByAmount(grailsApplication.config.xMove,grailsApplication.config.yMove)
contentStream.newLineAtOffset(leftOffset, bottomOffset)
String text = "i have added this line...!!!!";
contentStream.showText(text);
contentStream.endText();
contentStream.close();
document.save(new File(filePath));
document.close();
byte[] pdfData;
pdfData = Files.readAllBytes(file.toPath());
return pdfData;
Run Code Online (Sandbox Code Playgroud)
我尝试使用 moveTextPositionByAmount 方法,但这似乎对文本没有任何影响。为什么我的文字颠倒了,我如何将其设置为正确的方向。
