Dynamics 365 Operations 中的文件文档附件问题
Problem with file document attachment in Dynamics 365 Operations
我有一个生成 PDF 文档的批处理程序。但是当我创建它时,我发现它已损坏。
对此代码有什么建议吗?
public boolean PDFProcess()
{
List PDFFiles;
ListEnumerator PDFEnumerator;
boolean errors;
filename _from,_to,_temp, _name, _ext;
container _split;
Bindata _bin;
DocuRef docuref;
custTable custTable;
DocuActionArchive DocuActionArchive;
System.IO.MemoryStream stream;
System.IO.StreamWriter write;
PDFFiles = VE005FilesTools::GetlistOfFiles(VEParameters.VE005Path2Read,VEParameters.VE005FileNameDocumentFilter);
PDFEnumerator = PDFFiles.getEnumerator();
while(PDFEnumerator.moveNext())
{
_from = PDFEnumerator.current();
custTable = this.DecodePDF(_from);
if (custTable)
{
_split = fileNameSplit(_from);
_name = conPeek(_split,2);
_ext = conPeek(_split,3);
stream = new System.IO.MemoryStream();
writer = new System.IO.StreamWriter(stream);
writer.Write(_name);
writer.Flush();
docuref = DocumentManagement::attachFileToCommon(CustTable, VEParameters.VE005DocuTypeId, stream, _name+_ext, 'PDF', _name+_ext);
if (this.move(_from,VEParameters.VE005Path2Backup))
{
errors = true;
}
}
else
{
if (this.move(_from,VEParameters.VE005Path2Errors))
{
errors = true;
}
}
}
return errors;
}
乍一看,您似乎没有在 MemoryStream 中读取和写入文件内容,而只是名称
writer.Write(_name);
这就是为什么您的 PDF 可能已损坏(而且还非常小:))
要么将文件的所有字节写入 MemoryStream,即将上面的行替换为如下内容:
writer.Write(System.IO.File::ReadAllBytes(_from));
但是,如果可能的话,更好的方法是直接使用文件流,从而绕过 MemoryStream 的开销:
using (var stream = System.IO.File::OpenRead(_from))
{
docuref = DocumentManagement::attachFileToCommon(CustTable, VEParameters.VE005DocuTypeId, stream, _name+_ext, 'PDF', _name+_ext);
}
我现在无法访问开发环境,所以我还不能测试它们。
让我知道它是否有效(无论如何我都会测试它,一旦我有机会这样做)。
我有一个生成 PDF 文档的批处理程序。但是当我创建它时,我发现它已损坏。
对此代码有什么建议吗?
public boolean PDFProcess()
{
List PDFFiles;
ListEnumerator PDFEnumerator;
boolean errors;
filename _from,_to,_temp, _name, _ext;
container _split;
Bindata _bin;
DocuRef docuref;
custTable custTable;
DocuActionArchive DocuActionArchive;
System.IO.MemoryStream stream;
System.IO.StreamWriter write;
PDFFiles = VE005FilesTools::GetlistOfFiles(VEParameters.VE005Path2Read,VEParameters.VE005FileNameDocumentFilter);
PDFEnumerator = PDFFiles.getEnumerator();
while(PDFEnumerator.moveNext())
{
_from = PDFEnumerator.current();
custTable = this.DecodePDF(_from);
if (custTable)
{
_split = fileNameSplit(_from);
_name = conPeek(_split,2);
_ext = conPeek(_split,3);
stream = new System.IO.MemoryStream();
writer = new System.IO.StreamWriter(stream);
writer.Write(_name);
writer.Flush();
docuref = DocumentManagement::attachFileToCommon(CustTable, VEParameters.VE005DocuTypeId, stream, _name+_ext, 'PDF', _name+_ext);
if (this.move(_from,VEParameters.VE005Path2Backup))
{
errors = true;
}
}
else
{
if (this.move(_from,VEParameters.VE005Path2Errors))
{
errors = true;
}
}
}
return errors;
}
乍一看,您似乎没有在 MemoryStream 中读取和写入文件内容,而只是名称
writer.Write(_name);
这就是为什么您的 PDF 可能已损坏(而且还非常小:))
要么将文件的所有字节写入 MemoryStream,即将上面的行替换为如下内容:
writer.Write(System.IO.File::ReadAllBytes(_from));
但是,如果可能的话,更好的方法是直接使用文件流,从而绕过 MemoryStream 的开销:
using (var stream = System.IO.File::OpenRead(_from))
{
docuref = DocumentManagement::attachFileToCommon(CustTable, VEParameters.VE005DocuTypeId, stream, _name+_ext, 'PDF', _name+_ext);
}
我现在无法访问开发环境,所以我还不能测试它们。 让我知道它是否有效(无论如何我都会测试它,一旦我有机会这样做)。