我有一个带有表单字段的 PDF 模板,我使用iText 7.1.0来替换不同表单字段中的一些占位符文本,该模板工作正常:
PdfReader reader = new PdfReader(pdf_template);
PdfDocument pdf = new PdfDocument(reader, new PdfWriter(pdf_output));
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);
form.GetField("Vertragsnummer").SetValue("12345");
form.FlattenFields();
pdf.Close();
reader.Close();
Run Code Online (Sandbox Code Playgroud)
现在我有一个表单域,它的选项设置为允许富文本格式,因为有些部分带有粗体等。在表单域标准文本中,我又要替换占位符。
目前我有以下代码:
PdfFormField tf_maintext = form.GetField("maintext");
tf_maintext.SetRichText(tf_maintext.GetRichText());
Run Code Online (Sandbox Code Playgroud)
现在我需要替换占位符,但我没有找到任何适用于 C# 的解决方案。
对于普通表单字段,我可以使用
PdfFormField kdnr = form.GetField("Kundennummer");
kdnr.SetValue(kdnr.GetValueAsString().Replace("7777777777", "1111111111"));
Run Code Online (Sandbox Code Playgroud)
Replace
实现这一点的正常功能。
但是我需要一个解决方案来替换富文本格式字段中的文本,以确保格式在之后仍然存在。
我怎样才能做到这一点?
当您使用 Table 和 Cell 类在 iText 7 中创建表格时,表格单元格默认带有一些内置填充。据我查看生成的文档可以看出,它似乎是大约 2 个 PDF 单位。
有什么方法可以检索此值以用于计算吗?另外,有什么方法可以更改此默认值,以便我可以将自己的填充设置为在所有表中的所有单元格中使用,而不必在每个单元格上单独设置?
在 iText7 中,我需要在以页面为中心的文档顶部创建 5 行文本。我发现最简单的方法是:
doc.add(new Paragraph("text of line 1").SetTextAlignment(TextAlignment.CENTER));
doc.add(new Paragraph("text of line 2").SetTextAlignment(TextAlignment.CENTER));
Run Code Online (Sandbox Code Playgroud)
等等。但是,每条线之间的空间比我想要的要大。您可以在段落内设置行距,但如何在文档中的段落之间设置行距?或者我这样做是完全错误的方式开始?
我想在 PDF 页面中查找文本位置?
我尝试过的是使用简单的文本提取策略通过 PDF 文本提取器获取 PDF 页面中的文本。我正在循环每个单词以检查我的单词是否存在。使用以下方法拆分单词:
var Words = pdftextextractor.Split(new char[] { ' ', '\n' });
Run Code Online (Sandbox Code Playgroud)
我无法做的是找到文本位置。问题是我无法找到文本的位置。我只需要找到 PDF 文件中单词的 y 坐标。
我正在将代码从 iText5 迁移到 iText7,目前我正在努力将一个签名附加到已经包含另一个签名的 PDF。这些签名是用我们的国民身份证(公民卡)完成的。
在 iText5 中,我使用了 PdfStamper,但 iText7 中缺少它...
这是我到目前为止:
package cartaocidadao;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import javax.swing.JOptionPane;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.poreid.config.POReIDConfig;
import org.poreid.crypto.POReIDProvider;
import com.itextpdf.signatures.OcspClientBouncyCastle;
import com.itextpdf.signatures.TSAClientBouncyCastle;
import java.io.IOException;
import java.util.Collection;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.signatures.BouncyCastleDigest;
import com.itextpdf.signatures.ICrlClient;
import com.itextpdf.signatures.DigestAlgorithms;
import com.itextpdf.signatures.IExternalDigest;
import com.itextpdf.signatures.IExternalSignature;
import com.itextpdf.signatures.IOcspClient;
import com.itextpdf.signatures.PdfSignatureAppearance;
import com.itextpdf.signatures.PdfSigner;
import com.itextpdf.signatures.PrivateKeySignature;
import com.itextpdf.signatures.ITSAClient;
import com.itextpdf.signatures.OCSPVerifier;
import java.security.GeneralSecurityException;
import static javax.swing.JOptionPane.ERROR_MESSAGE;
/**
*
* @author i.lourenco
*/
public class Signature …
Run Code Online (Sandbox Code Playgroud) 我想使用 iText 7 在 PDF 中添加和删除水印。我能够添加水印,但无法再次删除它。我只能找到与 iText 5 相关的相关代码/示例。感谢任何指点。
这就是我添加水印的方式(使用图层):
pdfDoc = new PdfDocument(new PdfReader(sourceFile), new PdfWriter(destinationPath));
var numberOfPages = pdfDoc.GetNumberOfPages();
PageSize ps = pdfDoc.GetDefaultPageSize();
for (var i = 1; i <= numberOfPages; i++)
{
PdfPage page = pdfDoc.GetPage(i);
PdfLayer layer = new PdfLayer("watermark", pdfDoc);
var canvas = new PdfCanvas(page);
var pageSize = page.GetPageSize();
var paragraph = new Paragraph(message.WatermarkText).SetFontSize(60);
paragraph.SetFontColor(Color.BLACK, 0.2f);
Canvas canvasModel;
canvas.BeginLayer(layer);
canvasModel = new Canvas(canvas, pdfDoc, ps);
canvasModel.ShowTextAligned(paragraph, pageSize.GetWidth() / 2, pageSize.GetHeight() / 2, pdfDoc.GetPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, …
Run Code Online (Sandbox Code Playgroud) 我有一个 PDF ( https://github.com/giacgbj/stackOverflow/blob/master/xxx.pdf ),以某种方式由第三方进行数字签名,其签名具有外观
当我使用以下代码(iText 7.1.0)拼合PDF(https://github.com/giacgbj/stackOverflow/blob/master/xxxFlattened.pdf )时
try (PdfWriter output = new PdfWriter("output.pdf");
PdfDocument input = new PdfDocument(new PdfReader("input.pdf"), output)) {
PdfAcroForm.getAcroForm(input, true).flattenFields();
}
Run Code Online (Sandbox Code Playgroud)
签名的外观被拉伸成这样:
使用 PDFBox 或 GhostScript 等命令行参数或转换 (imagemagick) 或 pdf2ps/ps2pdf 可以拼合相同的 PDF。
这种行为的原因是什么?
我正在使用iText html2PDF
2.0.0 版本将 HTML 转换为 PDF。
在我的 HTML 文件中,有太多单词无法包含在表格列中。
这可以在图书馆完成iText 5
。这是我的 HTML 和 java 文件。
<html>
<head>
<title>TM_Report</title>
<style type="text/css">
.div-half-width {
display: inline;
width: 50%;
color: red;
}
</style>
</head>
<body>
<table width="70%" style="">
<tbody>
<tr>
<td width="50%"><p style="width: 80%; background-color: fuchsia;">3aaaa22aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaa1</p></td>
<td width="50%"><p style="width: 80%; background-color: cyan;">4aaaaaa33aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbaaaaaaaaaaaaaaaaa2</p></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
<p style="word-break: break-all; width: 80%; background-color: fuchsia;">aaaa22aaaaaa-aaaaaaaaaabb-bbbbbbbbbbbbb-bbbbbbbbaaaa-aaaaaaaaaaaaa-aaaaa1aaaa22-aaaaaaaaaaaa-aaaabbbbbbbb-bbbbbbbb_bbbbbbbaa_aaaaaaaaaaa_aaaaaaaaa1aaaa22_aaaaaaaaaaa_aaaaabbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaa_aaaaaaaaaaaaa1</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
创建AccessiblePDF.java
public class …
Run Code Online (Sandbox Code Playgroud) 在 iText 5 中,有一个名为的方法getVerticalPosition()
,它给出下一个写入的对象在页面上的位置。作为回答这个问题如何找出页面上当前光标的位置?并记录在此处
iText 7 获取页面上当前垂直位置以编写文档的等效项是什么?
更新日期:2018 年 8 月 11 日:根据评论中的回复,我已经更新了添加页面 preak 或新页面的逻辑,但两者仍在同一页面上打印
foreach (var element in RenderHtmlAndCss(document, css, html))
{
AddElement(document, null, (IBlockElement)element);
IRenderer pRenderer = element.CreateRendererSubTree().SetParent(document.GetRenderer());
LayoutResult pLayoutResult = pRenderer.Layout(new LayoutContext(new LayoutArea(0, new Rectangle(pdf.GetDefaultPageSize().GetHeight() - 72, pdf.GetDefaultPageSize().GetWidth() - 72))));
// writer.GetCurrentPos();
float y = pLayoutResult.GetOccupiedArea().GetBBox().GetY();
//20 is height of the content.
if(y<20 && !string.IsNullOrEmpty(LastPageStaticContent))
{
AreaBreak newpage = new AreaBreak(AreaBreakType.NEXT_PAGE);
//pdf.AddNewPage();
}
}
// Add Preface
if (Preface != null && …
Run Code Online (Sandbox Code Playgroud) 所以...我一直在尝试使用 itext 文档中提供的示例来合并文档并为合并的结果创建一个目录。但是将页码文本添加到每个页面的部分并没有像我预期的那样工作。发生的情况是添加的文本在某个水平轴上翻转,如下图所示:
此外,用于为添加的文本 ( public T setFixedPosition(int pageNumber, float left, float bottom, float width)
)设置固定位置的方法的 java 文档对我来说没有意义:
为元素的绝对重新定位设置值。指定的坐标对应于元素的左下角并向上增长。
但是当我运行时setFixedPosition(pageNumber, 0, 0, 50)
,文本最终出现在左上角,再次翻转。如果我分别使用源 PdfDocument 页面大小的宽度和高度作为左侧和底部位置的参数,它甚至不会到达右下角。
我可能做错了什么或误解了什么。无论哪种方式,这是我正在使用的代码:
private static int copyPdfPages(PdfDocument source, Document document, Integer start, Integer pages, Integer number) {
int oldC;
int max = start + pages - 1;
Text text;
for (oldC = start; oldC <= max; oldC++) {
text = new Text(String.format("Page %d", number));
PageSize pageSize = source.getDefaultPageSize();
source.copyPagesTo(oldC, oldC, document.getPdfDocument());
document.add(new Paragraph(text).setBorder(new SolidBorder(ColorConstants.RED, 1)) …
Run Code Online (Sandbox Code Playgroud)