我有一个 PDF 文件,它是帮助文件编译的一部分。总是有一些最新的内容被放入文本文件中(例如“此版本中的新增内容”之类的内容),虽然帮助和手册允许您包含文本文件中的内容,但它仅适用于 CHM 输出,而不适用于 PDF。
我想知道我是否可以通过生成一个唯一的占位符字符串来做到这一点,然后使用一些工具(我可能需要编写一个)来搜索并用最新信息文本文件的内容替换该唯一字符串。
这可行吗?或者这会破坏某种内部结构吗?
答案1
“这取决于。”
您可能需要做几件事:首先,文本不能被栅格化。如果是这样,那么一切都将不复存在。其次,必须嵌入整个字体。如果字体是子集(最常见的情况),那么您可能没有所需的字形。最后,您可能希望将要修改的文本区域的大小限制为尽可能小,只是为了防止处理大量重排。您希望在位置符周围留出尽可能多的空白。
现在,这可能不是您可以使用简单的文本编辑器来完成的事情,但可能有一些 PDF 操作工具可以为您完成替代。
答案2
您可以使用(开源)qpdf
实用程序(适用于 Linux、Windows 和 MacOS X)将 PDF 解压为更易读的格式。然后,您可以尝试其他答案中的其他一些建议:
qpdf.exe ^
--qdf ^
input.pdf ^
output.pdf
文件 oUtput.pdf 将包含未压缩的对象流、所有对象重新编号并按升序重新排序,以及文件中散布的一些有用注释。该文件可以在文本编辑器中编辑(如果它不会干扰其余的二进制部分)。
答案3
如果你愿意亲自动手;文本应该管用。
有例子它涵盖了广泛的主题并可以为你指明正确的方向。
注意下面的例子;使用该document.add
方法将添加Paragraph
到现有的 PDF 文档中。
protected void createPdf(String filename)
throws IOException, DocumentException, SQLException {
// Open the database connection
DatabaseConnection connection = new HsqldbConnection("filmfestival");
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
// Add text with a local destination
Paragraph p = new Paragraph();
Chunk top = new Chunk("Country List", FilmFonts.BOLD);
top.setLocalDestination("top");
p.add(top);
document.add(p);
// Add text with a link to an external URL
Chunk imdb = new Chunk("Internet Movie Database", FilmFonts.ITALIC);
imdb.setAction(new PdfAction(new URL("http://www.imdb.com/")));
p = new Paragraph(
"Click on a country, and you'll get a list of movies, containing links to the ");
p.add(imdb);
p.add(".");
document.add(p);
// Add text with a remote goto
p = new Paragraph("This list can be found in a ");
Chunk page1 = new Chunk("separate document");
page1.setAction(new PdfAction("movie_links_1.pdf", 1));
p.add(page1);
p.add(".");
document.add(p);
document.add(Chunk.NEWLINE);
// Get a list with countries from the database
Statement stm = connection.createStatement();
ResultSet rs = stm.executeQuery(
"SELECT DISTINCT mc.country_id, c.country, count(*) AS c "
+ "FROM film_country c, film_movie_country mc WHERE c.id = mc.country_id "
+ "GROUP BY mc.country_id, country ORDER BY c DESC");
// Loop over the countries
while (rs.next()) {
Paragraph country = new Paragraph(rs.getString("country"));
country.add(": ");
Chunk link = new Chunk(String.format("%d movies", rs.getInt("c")));
link.setAction(
PdfAction.gotoRemotePage("movie_links_1.pdf", rs.getString("country_id"), false, true));
country.add(link);
document.add(country);
}
document.add(Chunk.NEWLINE);
// Add text with a local goto
p = new Paragraph("Go to ");
top = new Chunk("top");
top.setAction(PdfAction.gotoLocalPage("top", false));
p.add(top);
p.add(".");
document.add(p);
// step 5
document.close();
// Close the database connection
connection.close();
}
答案4
Foxit PDF Reader Enterprise Edition 允许您编辑 PDF。还有 Master PDF,但免费版本会添加水印(我相信您不会想要)。
或者,您可以将主副本保留为 Word ( .docx
) 或 OO Writer ( .odt
) 文档,并使用打印机模拟器(例如CutePDF 作家) 以“打印”为 PDF。Office 365 和 OO Writer 还提供“导出为 PDF”功能,这样就无需首先编辑 PDF。