- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我一直在为这个绞尽脑汁。以下是代码:
string content = ConvertHTMLToXHTML(content); //This is something I wrote
var doc = new iTextSharp.text.Document(PageSize.LETTER, 10f, 10f, 10f, 0f);
var writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
ICSSResolver cssResolver = null;
cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssResolver.AddCss(@"code { padding: 2px 4px; }", "utf-8", true);
//****This is the key line******
cssResolver.AddCssFile(@"<the css file>", true);
var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors); // inject the tagProcessors
hpc.SetLinkProvider(new LinkProvider(currentWorkingDirectory));
var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(doc, writer));
var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
var worker = new XMLWorker(pipeline, true);
var xmlParser = new XMLParser(true, worker, Encoding.UTF8);
//Ok, now we can finally parse all this
using (var srHtml = new StringReader(content)) {
xmlParser.Parse(srHtml);
}
doc.Close();
请注意我写“This is the key line”的那一行。这就是我用于调试目的的内容。
因此,在内容中,我有有效的 <link href='[valid address]' rel="stylesheet" />
在 <head>
中设置标签。预处理风格,我确保使用我的方法 ConvertHTMLtoXHTML 将内容解析为完全解析的 href(它使用 HTMLAgilityPack 并且我验证了内容具有完全解析的 URL)。示例完全解析的 url 类似于 http://localhost/foo/bar.css
但是,内容不使用 CSS 呈现。因此,我去了 AddCssFile(看到这是关键线)并尝试通过 URI 路径将文件添加到那里(这都在我的系统上,所以我使用“http://localhost/foo/bar/blah.css”)。这引发了一个异常,因为它找不到文件(异常是 System.IO.IOException: retrieve.file.from.nothing
)。
我然后通过 AddCssFile(例如:D:\foo\bar\blah.css)添加文件,因为它在我的文件系统中,因此成功了!!
我的问题是,是否有办法让 XMLWorker 读取链接标签(如果我已经完全解析它们),而不是我必须找到所有链接标签,将它们转换到它们在我的磁盘上的位置,并通过 CSSResolver 添加它们?
附加信息:
最佳答案
确定了一个解决方案 - 必须深入研究 iTextSharp 的源代码才能弄清楚发生了什么,因为我使用的是已编译的 DLL,并且异常消息并不是完全有用。
顺便说一下,这是一个 2 parter
获取CSS时需要进行身份验证
我的网站只允许经过身份验证的用户使用该网站。因此,当 iTextSharp 制作 WebRequest
时在 FileRetrieveImpl
,它正在发出一个简单的未经身份验证的 GET 请求。然后请求失败,返回 401 - Unauthorized,这又抛出 retrieve.file.from.nothing
。来自 iTextSharp 的异常。
为了解决这个问题,我需要使用下面的代码
WebRequest w = WebRequest.Create(url);
w.UseDefaultCredentials = true;
w.PreAuthenticate = true;
w.Credentials = CredentialCache.DefaultCredentials;
在提出请求之前。因此,我需要覆盖 FileRetrieve
在 ICSSResolver
上我正在使用的解析器。我决定我需要当前的 FileRetrieveImpl
实现同时重写方法 ProcessFromHref
这让我很伤心。
因此,我写了以下内容,我从 FileRetrieveImpl
复制并粘贴了我需要的元素。 .
private class CustomFileRetriever : FileRetrieveImpl {
private static ILogger LOGGER = LoggerFactory.GetLogger(typeof(FileRetrieveImpl));
private IList<string> rootdirs;
private IList<string> urls;
public CustomFileRetriever() {
rootdirs = new List<string>();
urls = new List<string>();
}
private Uri DetectWithRootUrls(string href) {
foreach (string root in urls) {
try {
return new Uri(root + href);
} catch (UriFormatException) {
}
}
throw new UriFormatException();
}
public override void ProcessFromHref(string href, IReadingProcessor processor) {
if (LOGGER.IsLogging(Level.DEBUG)) {
LOGGER.Debug(string.Format(LocaleMessages.GetInstance().GetMessage("retrieve.file.from"), href));
}
Uri url = null;
bool isfile = false;
string f = href;
try {
url = new Uri(href);
} catch (UriFormatException) {
try {
url = DetectWithRootUrls(href);
} catch (UriFormatException) {
// its probably a file, try to detect it.
isfile = true;
if (!(File.Exists(href))) {
isfile = false;
foreach (string root in rootdirs) {
f = Path.Combine(root, href);
if (File.Exists(f)) {
isfile = true;
break;
}
}
}
}
}
Stream inp = null;
if (null != url) {
//***********************
//Begin changed part
//***********************
WebRequest w = WebRequest.Create(url);
w.UseDefaultCredentials = true;
w.PreAuthenticate = true;
w.Credentials = CredentialCache.DefaultCredentials;
//***********************
//End changed part
//***********************
try {
inp = w.GetResponse().GetResponseStream();
} catch (WebException) {
throw new IOException(LocaleMessages.GetInstance().GetMessage("retrieve.file.from.nothing"));
}
} else if (isfile) {
inp = new FileStream(f, FileMode.Open, FileAccess.Read, FileShare.Read);
} else {
throw new IOException(LocaleMessages.GetInstance().GetMessage("retrieve.file.from.nothing"));
}
Read(processor, inp);
}
private void Read(IReadingProcessor processor, Stream inp) {
try {
int inbit = -1;
while ((inbit = inp.ReadByte()) != -1) {
processor.Process(inbit);
}
} catch (IOException e) {
throw e;
} finally {
try {
if (null != inp) {
inp.Close();
}
} catch (IOException e) {
throw new RuntimeWorkerException(e);
}
}
}
}
然后,我简单地覆盖了默认的文件检索器
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssResolver.FileRetrieve = new CustomFileRetriever();
这解决了我调用 AddCssFile
的问题并得到 retrieve.file.from.nothing
.但是,我不只是想调用 AddCssFile,我想让 iTextSharp 识别链接。因此,这将引导我进入下一部分。
HTML 源代码中的链接标记需要特定属性
在我的问题陈述中,我写到它没有接收到 <link href='[valid address]' rel="stylesheet" />
。 .这是因为它缺少属性标记 type="text/css"
.因此,我应该有 <link href='[valid address]' rel="stylesheet" type="text/css"/>
我通过阅读源代码确定了这一点(参见 Link)。在处理 XHTML 标签时,它会查看标签是否完整存在并完全解析。
关于c# - iTextSharp XMLWorker 不读取 <link> CSS 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549881/
当段落长度对于 ColumnText 的宽度来说太长时,如何减少换行符的高度? 我已经尝试了以下方法,因为我看到了其他回答这个问题的问题: p.Leading = 0 但这并没有产生任何影响。 我还尝
是否可以使用 iTextSharp 将句子中的单个单词加粗?我正在处理来自 xml 的大段文本,并且我试图将几个单独的单词加粗,而不必将字符串分成单独的短语。 例如: document.Add(new
不间断空格如何用于在 PdfPTable 单元格中包含多行内容。 iTextSharp 正在用空格字符分解单词。 场景是我想要在表头中显示多行内容,例如在第一行可能显示“Text1 &”,在第二行显示
我正在从 iTextSharp 创建 PDF 以供打印。我有可变长度的文本,我希望始终以最大字体大小填充固定高度的表格单元格,而不会换行。如何做到这一点? 最佳答案 首先,您需要能够测量所选字体的文本
我想使用 iTextSharp 从 pdf 文件中检索文本。但是,我无法像在 itextsharp(itext) 的 JAVA 库中那样使用 PDFTextExtractor。我需要 readPDFO
我们想在发送之前在我们的 pdf 顶部添加一个带有用户电子邮件和名称的水印。我已经编写了执行此操作的代码,并且运行良好。我想检查这是否是最好的方法。我们希望在 pdf 的顶部将水印分成两行。 ,我使用
有没有办法使用 iTextSharp 更改 PDF 中第二页的页边距? 我现在有: Document document = new Document(PageSize.A4, 144f, 72f, 1
这其实是引用Question实际上已关闭 我正在使用 ItextSharp 5.2.1。 我想使用 PdfContentByte 使我的标题文本带有下划线。请为我提供解决方案。 最佳答案 privat
我正在使用来自 nuGet (5.5.8) 的最新 iTextSharp 库来解析 pdf 文件中的一些文本。我面临的问题是 GetTextFromPage 方法不仅从它应该返回的页面中返回文本,它还
如何在保持 itextsharp 旋转的同时缩放 pdf 页面? 我有以下内容,但我失去了轮换: public static void ScaleToLetter(string inPDF,
我必须在 pdf 中插入图像。也就是说,无论我在哪里看到文本“签名”,我都必须在那里插入签名图像。我可以通过说 absolute positions 来做到。但是,我正在寻找如何在 pdf 中找到“签
我希望使用 itextSharp 将 html 转换为 pdf。 我希望在我的 pdf 中有一个特定的样式。 我希望所有 pdf 文件都遵循特定的 CSS 类。但我不知道我必须添加那个编译器 khno
我在 ASP.NET 代码中使用 iTextSharp DLL。我正在将数据提取到数据集中并将数据集添加到 PDF 表中。 如果我的数据集有更多 100 行,那么 100 行将添加到 PDF 表中,并
如何使用 iIextSharp 为 PDF 文档设置默认字体和字体大小,以便在整个 PDF 中使用它。 最佳答案 遇到与俄语和罗马尼亚字母相同的问题(itextsharp 5.5.6.0,.net 3
我使用 PdfContentByte 在 pdf 中显示文本,因为我现在也使用 SetTextMatrix mathod 来放置该文本,当我的文本很大时它不会显示在 pdf 中显示我可以包装文本显示我
我现在正在使用 iTextSharp (5.4.5) 几个星期。这周,我在文档中的元素顺序方面遇到了一些奇怪的事情。 我正在处理包含主题和图像(图表)的 pdf 报告。 文档的格式是这样的: 自然保护
我尝试了几种方法来做到这一点,但仍然无法做到。看来 iTextSharp 需要 2 次通过情况,以便图像出现在文本顶部。所以我尝试使用内存流来执行此操作,但我不断收到错误。 Public Fu
我在 iText/iTextSharp(iTextSharp 5.3.3 通过 NuGet)中遇到了一个非常奇怪的 XFA 表单问题。我正在尝试填写静态 XFA 样式的表单,但我的更改没有生效。 我有
当我使用 itextsharp 提取文本时,我将获得文本的 x 和 y 坐标。如果我根据 xy 位置将文本从 pdf 转换为 html,则通过使用这 2 个坐标,文本位置 chnages 。得到我使用
有人可以提供示例或链接到使用 itextsharp 5.4.4 签署现有 pdf 的示例吗?理想情况下保持 pdf/pdf 的一致性?谢谢。 编辑:我理解这个问题看起来好像我没有使用谷歌等。但是,新版
我是一名优秀的程序员,十分优秀!