在我当前的项目中,我尝试添加BufferedImage一个PDFBox文档.更具体地说,我使用的是图像JFreeChart.我的代码看起来像这样:
public void exportToPDF(JFreeChart chart, String filePath){
PDDocument doc = null;
PDPage page = null;
PDXObjectImage ximage = null;
try {
doc = new PDDocument();
page = new PDPage();
doc.addPage(page);
PDPageContentStream content = new PDPageContentStream(doc, page);
BufferedImage image = chart.createBufferedImage(300, 300);
ximage = new PDJpeg(doc, image);
content.drawImage(ximage, 20, 20);
content.close();
} catch(IOException ie) {
}
doc.save(filePath);
doc.close();
}
Run Code Online (Sandbox Code Playgroud)
文档被创建; 我可以添加文本,但是我收到错误,指出图像没有足够的信息显示.
我有什么不对的任何线索?
我正在使用一些非常大的PDF,一些超过7GB.PDF包含多达20,000页和许多整页彩色图像.我想使用PDFBox来处理PDF,但由于我在尝试打开PDF时出现OutOfMemoryError的大小.
我正在使用版本pdfbox-app-1.6.0,在Windows 7上使用Intellij,java 6.
首先,我尝试编写一个简单的程序,只是在PDDocument中打开PDF并将每个页面复制到另一个PDDocument:http://ideone.com/arKhB
接下来我尝试使用PDFBox CopyDoc示例.
两个例子都没有内存.
我假设这是因为PDFBox试图将整个文档读入内存.有没有办法让它一次只打开1页?我知道处理速度会慢一些,但目前我无法处理任何事情.
我有以下问题.我尝试计算PDFbox中字符串的宽度,使其在矩形中居中.现在我的问题是,我获得了相同的宽度12和32,但是1小于3,所以我的文本是12不居中.我该如何解决这个问题?
谢谢!
使用pdfbox,是否可以将PDF(或PDF字节[])转换为图像字节[]?我在网上查看了几个例子,我发现的唯一一个例子描述了如何直接将转换后的文件写入文件系统或将其转换为Java AWT对象.
我宁愿不招致将图像文件写入文件系统的IO,读入byte [],然后删除它.
所以我可以这样做:
String destinationImageFormat = "jpg";
boolean success = false;
InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf");
PDDocument pdf = PDDocument.load( is, true );
int resolution = 256;
String password = "";
String outputPrefix = "myImageFile";
PDFImageWriter imageWriter = new PDFImageWriter();
success = imageWriter.writeImage(pdf,
destinationImageFormat,
password,
1,
2,
outputPrefix,
BufferedImage.TYPE_INT_RGB,
resolution);
Run Code Online (Sandbox Code Playgroud)
除此之外:
InputStream is = getClass().getClassLoader().getResourceAsStream("example.pdf");
PDDocument pdf = PDDocument.load( is, true );
List<PDPage> pages = pdf.getDocumentCatalog().getAllPages();
for ( PDPage page : pages )
{
BufferedImage image = page.convertToImage();
} …Run Code Online (Sandbox Code Playgroud) 让我先介绍一下我的项目.我有一个pdf,我需要使用PDFBoxAPI 将其转换为图像(一页图像),并使用PDFBoxAPI本身将所有这些图像写入新的pdf .基本上,将pdf转换为pdf,我们将其称为PDF转码.
对于包含JBIG2图像的某些pdf,convertToImage()方法的PDFbox实现无声地失败,没有任何异常或错误,最后生成PDF,但这次只是空白内容(白色).我在控制台上收到的消息是:
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.filter.JBIG2Filter decode
SEVERE: Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap getRGBImage
SEVERE: Something went wrong ... the pixelmap doesn't contain any data.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.util.operator.pagedrawer.Invoke process
WARNING: getRGBImage returned NULL
Run Code Online (Sandbox Code Playgroud)
我需要知道如何解决这个问题?我们有类似的东西:
import org.apache.pdfbox.filter.JBIG2Filter;
Run Code Online (Sandbox Code Playgroud)
我不知道如何实施.
我在搜索,但无济于事.有人可以建议吗?
有没有办法在Apache Pdfbox中添加其他字体样式?
我们目前正在尝试在我们的系统中打印PDF(目前正在使用PDF-Renderer.)我一直在寻找各种替代方案(pdfbox,jpedal,jPDFPrint)
我们希望使用免费的GPL兼容库,因此我们倾向于使用pdfbox.我已经能够编写一些示例代码来打印出"有效"的pdf.见下文:
PDDocument doc;
try {
doc = PDDocument.load("test.pdf");
doc.print();
} catch (Exception e) {
// Come up with better thing to do on fail.
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,这是有效的,但我遇到的问题是PdfBox似乎没有识别pdf中使用的字体,因此改变了使用的字体.因此,该文档看起来很奇怪(间距和字符大小不同,看起来很奇怪).我经常看到以下日志消息,或类似的东西:
2014年4月16日下午2:56:21 org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString警告:将<>中的字体从<NimbusMono>更改为默认字体
有没有人知道如何在pdfbox中添加新的fonttype方法(或参考)?或者除此之外,如何更改默认字体类型?
据我所知,pdfbox支持14种标准字体.不幸的是,NimbusMono不是其中之一.任何指导将不胜感激.
我有一个PDF,我使用PDFBox从中提取了一个页面:
(...)
File input = new File("C:\\temp\\sample.pdf");
document = PDDocument.load(input);
List allPages = document.getDocumentCatalog().getAllPages();
PDPage page = (PDPage) allPages.get(2);
PDStream contents = page.getContents();
if (contents != null) {
System.out.println(contents.getInputStreamAsString());
(...)
Run Code Online (Sandbox Code Playgroud)
根据PDF规范,这给出了以下结果,看起来像您期望的结果.
q
/GS0 gs
/Fm0 Do
Q
/Span <</Lang (en-US)/MCID 88 >>BDC
BT
/CS0 cs 0 0 0 scn
/GS1 gs
/T1_0 1 Tf
8.5 0 0 8.5 70.8661 576 Tm
(This page has been intentionally left blank.)Tj
ET
EMC
1 1 1 scn
/GS0 gs
22.677 761.102 …Run Code Online (Sandbox Code Playgroud) 根据这个答案,我正在尝试使用pdfbox解密pdf文档:
PDDocument pd = PDDocument.load(path);
if(pd.isEncrypted()){
try {
pd.decrypt("");
pd.setAllSecurityToBeRemoved(true);
} catch (Exception e) {
throw new Exception("The document is encrypted, and we can't decrypt it.");
}
Run Code Online (Sandbox Code Playgroud)
这导致
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1601)
at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:948)
...
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
...
Run Code Online (Sandbox Code Playgroud)
路径是正确的,所以我不知道发生了什么.此外,如果我查看PDDocument.decrypt(String pw)方法,我会发现: 这将解密文档.仅出于兼容性原因提供此方法.用户应该使用新的安全层,尤其是openProtection方法.
这是什么意思?有人可以举例说明如何使用pdfbox正确解密pdf文档吗?
如何使用PDFBox"展平"PDF表单(删除表单字段但保留字段文本)?
快速执行此操作的方法是从acrofrom中删除字段.
为此,您只需要获取文档目录,然后获取acroform,然后从此acroform中删除所有字段.
图形表示与注释链接并保留在文档中.
所以我写了这段代码:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
public class PdfBoxTest {
public void test() throws Exception {
PDDocument pdDoc = PDDocument.load(new File("E:\\Form-Test.pdf"));
PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
PDAcroForm acroForm = pdCatalog.getAcroForm();
if (acroForm == null) {
System.out.println("No form-field --> stop");
return;
}
@SuppressWarnings("unchecked")
List<PDField> fields = acroForm.getFields();
// set the text in the form-field <-- does work
for (PDField field : fields) {
if (field.getFullyQualifiedName().equals("formfield1")) {
field.setValue("Test-String");
} …Run Code Online (Sandbox Code Playgroud) Pdfbox Merge Document与1.8.xx一样,就像mergePdf.mergeDocuments()一样工作正常.现在pdfbox版本2.0.0包含一些参数,比如org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(MemoryUsageSetting arg0)
什么是MemoryUsageSetting如何使用mergeDocuments.I读取就像合并源文档列表一样,保存导致目标文件.请提供一些相当于2.0.0版的代码
public void combine()
{
try
{
PDFMergerUtility mergePdf = new PDFMergerUtility();
String folder ="pdf";
File _folder = new File(folder);
File[] filesInFolder;
filesInFolder = _folder.listFiles();
for (File string : filesInFolder)
{
mergePdf.addSource(string);
}
mergePdf.setDestinationFileName("Combined.pdf");
mergePdf.mergeDocuments();
}
catch(Exception e)
{
}
}
Run Code Online (Sandbox Code Playgroud)